PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : access : autowerte für spez. Ereignisse?



juan_
04-03-2008, 09:57
hallo zusammen,

ich schustere grade an einer Accessdb, welche User , deren Gruppen und einige Daten speichert.


Meine Tabelle für die Gruppe sieht momentan so aus:
gruppe(gr_id,startdatum)

Ich würde gerne noch ein 3. Feld hinzufügen, in dem noch ein Autowert steht, welcher aber stadardmäßig auf "1" steht. Nur wenn an einem Tag zb 2 (oder mehr) Gruppen gestartet werden, soll dieser hochgezählt werden.

Kann mir jmd sagen, wie ich einen Autowert in Abhängigkeit zum Datum erstellen kann?

Danke!

juan

//edit: nur zur Übersicht:
gruppe(gr_id,startdatum,datum_nr)



gr_id | startdatum | datum_nr
-----------------------------
1 | 12.02.2008 | 1
2 | 13.02.2008 | 1
3 | 13.02.2008 | 2
----------------------------

paule
10-03-2008, 19:54
Access kennt leider keine Trigger, das wäre meiner Meinung nach der eleganteste Weg.
So bleibt wohl nur, vor dem Einfügen die Anzahl der Datensätze manuell zu ermitteln. Dann solltest du aber vorher die Tabelle sperren, nicht dass ein anderer Zugriff dazwischen funkt.

Eine andere Möglichkeit fällt mir gerade noch ein: Du definierst die Nr als autoinkrement und kümmerst dich beim Einfügen nicht weiter darum. Die Anzahl Gruppen pro Tag lässt sich einfach ermitteln und jede Gruppe hat eine eigene Nummer. Brauchst du trotzdem eine Nummerierung pro Tag, kannst du bei der Anzeige einfach die erste Nummer von den anderen subtrahieren, wenn du nacheinander die Datensätze deiner Abfrage durchgehst. Da kann ich dir auch ein Beispiel basteln.

Edit:
Gerade ausprobiert: Einfach und elegant geht es mit einer Abfrage auf deiner Tabelle, wenn wie oben erwähnt Nummer ein autowert ist, die in der SQL-Ansicht so aussieht:


SELECT Tabelle1.gr_id, Tabelle1.startdatum, (SELECT count(*) FROM Tabelle1 as t WHERE t.datum_nr<=Tabelle1.datum_nr AND t.startdatum=Tabelle1.startdatum) AS Rang
FROM Tabelle1;


Gruß,
Paul

juan_
17-03-2008, 09:20
mhh, erstmal Danke.

Aber irgendwie lüppert das noch nicht so ganz.

Ich habe dein Abfrage so übernommen, wie sie ist.Allerding addiert "Rang" nur und zählt nicht von 1-x.
Wenn ich jetzt überall eine x-beliebige Zahl eintrage, wird korrekt gezählt (sofern sie sich untereinander unterscheiden)!

Außerdem bitte ich um eine Erklärung, was du mit "t" meinst.


Vielen Dank!

ciao

//edit:
ich habe grade meine Abfrage so gestaltet :


SELECT Tabelle1.gr_id, Tabelle1.startdatum, (SELECT count(*) FROM Tabelle1 as t WHERE t.gruppen_id<=Tabelle1.gruppen_id AND t.startdatum=Tabelle1.startdatum) AS Rang


und es scheint erstmal zu klappen. so würde ich mir auch die "unnötige" Spalte der datum_nr'n ersparen und es wäre sichergestellt, dass sich die Zahlen unterscheiden. Es klappt auch soweit (beim ersten und zweiten Eindruck). Spricht irgendwas dagegen, es so zu lassen?

jan61
17-03-2008, 19:00
Moin,


...Außerdem bitte ich um eine Erklärung, was du mit "t" meinst.

"t" ist ein Tabellenalias für "Tabelle1", genauso wie RANG ein Alias für die Pseudospalte aus dem select ist.



SELECT Tabelle1.gr_id, Tabelle1.startdatum, (SELECT count(*) FROM Tabelle1 as t WHERE t.gruppen_id<=Tabelle1.gruppen_id AND t.startdatum=Tabelle1.startdatum) AS Rang FROM Tabelle1
fehlte da wohl noch.

Gegen diesen SELECT spricht erstmal syntaktisch nichts - nur u. U. die Performance, der Subselect wird ja im Prinzip für jeden Ergebnissatz des Hauptselects ausgeführt. Kann bei großen Tabellen leicht ins Geld gehen ;-)

Jan

juan_
18-03-2008, 07:47
Gut, dieses Risiko gehe ich ein :D

das From habe ich vergessen zu pasten.
Aber so lange das jetzt erstmal läuft, bin ich zu frieden.
Dann kann ich ja bald mein nächstes Problem zur Lösung freigeben! ;)

ciao

paule
18-03-2008, 10:52
Es fehlt ein Komma nach Tabelle1.op_art. Wenn das nur ein Fehler beim Abschreiben war, schreib noch mal.

edit: Hat er wohl selbst bemerkt und sein edit wieder gelöscht.

Grüße,
Paul

juan_
18-03-2008, 12:44
Hallo Paule,
danke für deine Hilfe.

Das Problem lag nicht am Komma, sondern daran, dass ich nicht wusste, dass man das t.op_art noch mal neu ausgeben musste: (AS Rang, op_art)

So sieht nun meine Lösung aus:

->

SELECT gruppen.gruppen_id, gruppen.startdatum, gruppen.op_art (SELECT count(*) FROM gruppen as t WHERE t.gruppen_id<=gruppen.gruppen_id AND t.startdatum=gruppen.startdatum AND t.op_art=gruppen.op_art) AS Rang, op_art
FROM gruppen;


ciao

juan_
02-04-2008, 08:57
moin,

ich pushe noch mal kurz:
und zwar habe ich jetzt noch eine weitere Abfrage, in welcher auch der Rang aufgeführt werden soll:



SELECT suchform_abfrage.name, suchform_abfrage.vorname, suchform_abfrage.startdatum, suchform_abfrage.Rang, suchform_abfrage.op_art FROM suchform_abfrage WHERE (((suchform_abfrage.name) Like "*" & Formulare!GUI!suche_ & "*") OR ((suchform_abfrage.vorname) Like "*" & Formulare!GUI!suche_ & "*") OR ((suchform_abfrage.startdatum) Like "*" & Formulare!GUI!suche_ & "*") OR ((suchform_abfrage.op_art) Like "*" & Formulare!GUI!suche_ & "*")) ORDER BY suchform_abfrage.name, suchform_abfrage.vorname, suchform_abfrage.startdatum, suchform_abfrage.Rang;


leider zählt die Schleife nicht mehr richtig, aber ich bekomms irgenwie nicht vernünftig eingebaut :(

könnte mir jmd helfen?

vielen dank!