Access: Berechnung Daten innerhalb eines Feldes

Hallo Zusammen!

komm bei einer Abfrage in Access nicht weiter, bin mir aber sicher, dass Ihr mir helfen könnt. Meine Abfrage sieht folgendermaßen aus:
(gewünschte
Berechnung)
A.Nr Bereich Datum DAUER
2300000 PS 23.06.2010 Leer
2300000 F 25.06.2010 2
2300000 F 28.06.2010 3
2300000 S 09.07.2010 11
2300001 PS 04.07.2010 Leer
2300001 G 10.07.2010 6
2300006 PS 10.06.2010 Leer
2300006 F 10.06.2010 0
2300009 PS 06.06.2010 Leer
usw. usw. usw.

Diese Daten ziehe ich aus einer Tabelle, die auf einem Server liegen. Ich möchte nun zu jeder A.Nr eine Berechung der Dauer. Wie in der Tabelle zu sehen, soll beim erstmaligen auftauchen der A.Nr keine Berechung erfolgen. Zu allen weiteren erfolgt eine Berechung der Dauer in Tagen zw. der unteren und oberen Datumsangabe.
Sobald sich die Auftragsnummer ändert geht das Spielchen von vorne los.
Bitte helft mir bei der Sache, ich komm da einfach nicht weiter. Für jeden Lösungsvorschlag bin sehr dankbar!

Gruß

(_Ro_)

Hallo _Ro_,

da ich gerade im Ausland bin, kann ich hier nur eine relativ kurze Antwort geben.

Die Berechnung des Felds Dauer kann auf verschiedene Arten geschehen.Ich würde das auf die einfachste Art machen - mit einer der Aggregatsfunktionen. Möglicherweise sind andere Lösungen einen Deut schneller, aber sicher deutlich komplexer.

Als Aggregatfunktion kommt hier offensichtlich DMin in Frage - es soll ja der zeitliche Abstand zur allerersten Fundstelle der Auftragsnummer gesucht werden. Als Kriterium erhält die Aggregatsfunktion den Feldnamen, den Tabellennamen und die Auftragsnummer des aktuellen Datensatzes.

Nehmen wir an, die Basisabfrage sähe so aus:
„SELECT ANr, Bereich, Datum FROM Auftrag;“.
Die Aggregatsfunktion könnte dann im Abfrage-Editor z.B. so aussehen:
„Startdatum: DMin(„Datum“;„Auftrag“;„ANr=“ & [Auftrag].[ANr])“ (im SQL dann so: „Startdatum: DMin(„Datum“,„Auftrag“,„ANr=“ & Auftrag.ANr)“).
Das verwendete Format könnte noch kleinere Änderungen nötig machen, z.B. die „Klammerung“ des Vergleichswerts (wenn die Auftragsnummer ein Text ist, sieht das so aus: „ANr=“"" & [Auftrag].[ANr] & „“""))

Über DateDiff (oder eine andere geeignete Funktion) könnte nun die Dauer in Tagen berechnet werden (wenn es ein Datum ist, würde sogar die Subtraktion reichen). Mit der Funktion IIF([Kriterium];[Wahr-Option];[Falsch-Option]) könnte im Fall einer Null-Dauer nichts angezeigt werden (einfach die entsprechende Option leer lassen oder einen leeren String zuweisen oder …).

Ohne IIF könnte das fertige Feld so aussehen:
Dauer: DateDiff(„d“;Datum;DMin(„Datum“;„Auftrag“;„ANr=“ & [Auftrag].[ANr]))

Weitere Optimierungsmöglichkeiten wie die Einschränkung auf Datumswerte vor dem aktuellen Datum bringen nur unter gewissen Umständen etwas (optimale Indexierung). Im Zweifelsfall hilft hier nur ausprobieren und Zeiten vergleichen! Lohnt sich aber nur bei sehr vielen Datensätzen…

Liebe Grüße und viel Erfolg,
Kurt

hi!

tut mir leid, ich kann dir da leider nicht weiterhelfen.

Hallo Herr Fortwängler,

leider bringt mich die Funktion DMin nicht weiter, da sie mir den ersten Datumswert der Auftragsnummer zurückgibt. Jedoch benötige ich immer die Differenz der Datumsangabe innerhalb einer Auftragsnummer. Heißst also, wie in der Tabelle ersichtlich, die Datumsdifferenz zw. dem Vorgang 1 und 2 der A.Nr 2300000. In dem Fall 2 Tage. Leider weiß ich nicht wie ich die Daten normalisieren kann, das würde die Sache natürlich deutlich erleichtern.
Ich hoffe Sie haben noch eine weitere Idee.

Gruß Ro

Hallo _Ro_,

tut mir leid, da habe ich keine Idee, wie das
gehen könnte.

Gruß Peter

Hallo _Ro_,

tut mir leid, da habe ich keine Idee,
wie das gehen könnte.

Gruß Peter

hi!

tut mir leid, ich kann dir da leider nicht weiterhelfen.

Trotzdem Danke!

Gruß

Trotzdem Danke!

Gruß

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

???

Das verstehe ich nicht. Die Funktion DMin liefert das erste Datum ZUR GEGEBENEN AUFTRAGSNUMMER (das dritte Kriterium ist eine Bedingung). Zu diesem Datum kann dann der Abstand berechnet werden(Subtraktion oder Funktion DateDiff). So kommen dann z.B. die Zahlen 2, 3 und 10 zustande - unabhängig von der Sortierung!

Ausprobieren kann ich das alles nicht (bin wie gesagt gerade im Ausland). Aber bis auf höchstens minimale Fehler sollte das funktionieren (natürlich müssen die Spalten- und Tabellennamen noch angepasst werden)!

Noch einmal das „sezieren“ der vorgeschlagenen Funktion:
Dauer: DateDiff(„d“;Datum;DMin(„Datum“;„Auftrag“;„ANr=“ & [Auftrag].[ANr]))

Innen befindet sich die Funktion DMin, die das kleinste Datum zur aktuellen Auftragsnummer liefert. Das entspricht der Abfrage
„SELECT Datum FROM Auftrag WHERE ANr = [aktuelle Auftragsnummer];“ (die aktuelle Auftragsnummer sieht man in Auftrag.ANr).

Darum herum berechnet die Funktion DateDiff den Abstand (Tage) des berechneten Datums vom aktuellen Datum. Das Vorzeichen wäre hier allerdings negativ, da die beiden Datumsangaben „verdreht“ sind (die Funktion DMin müsste zuerst kommen).

Liebe Grüße,
Kurt

Hallo Kurt!

hab deinen Lösungsvorschlag jetzt nochmal ausprobiert, aber wie schon erwähnt, er bringt mir leider nicht das gewünschte Ergebnis. Ich denke wir haben uns da etwas mißverstanden. Hier das Ergebnis deiner Abfrage (leider hab ich das mit

 irgenwie nicht hinbekommen, hoffe du findest dich auch so zurecht :smile:):


AUFNR ERDAT STARTDAT DAUER
000002381341 27-Mai-10 27.05.2010 0
000002381341 27-Mai-10 27.05.2010 0
000002381341 28-Mai-10 27.05.2010 -1
000002381341 28-Mai-10 27.05.2010 -1
000002381341 28-Mai-10 27.05.2010 -1
000002381341 28-Mai-10 27.05.2010 -1
000002381341 28-Mai-10 27.05.2010 -1
000002381341 28-Mai-10 27.05.2010 -1
000002381341 31-Mai-10 27.05.2010 -4
000002381341 31-Mai-10 27.05.2010 -4
000002381341 31-Mai-10 27.05.2010 -4
000002381341 01-Jun-10 27.05.2010 -5
000002381342 27-Mai-10 27.05.2010 0
000002381342 31-Mai-10 27.05.2010 -4
000002381342 31-Mai-10 27.05.2010 -4
000002381342 25-Jun-10 27.05.2010 -29
000002381342 25-Jun-10 27.05.2010 -29
000002381343 27-Mai-10 27.05.2010 0
000002381343 28-Mai-10 27.05.2010 -1
000002381343 28-Mai-10 27.05.2010 -1
000002381343 28-Mai-10 27.05.2010 -1
000002381343 01-Jun-10 27.05.2010 -5
000002381343 01-Jun-10 27.05.2010 -5
000002381343 01-Jun-10 27.05.2010 -5
000002381343 01-Jun-10 27.05.2010 -5
000002381343 02-Jun-10 27.05.2010 -6
000002381343 02-Jun-10 27.05.2010 -6
000002381343 02-Jun-10 27.05.2010 -6
000002381343 02-Jun-10 27.05.2010 -6

Diese Abfrage liefert leider nur die Differenz zum Startdatum je Vorgang. Ich möchte allerdings immer die Differenz zum vorherigen Vorgang, außer die AUFNR wechselt, dann soll die null gesetzt werden. Heißt also:

neue AUFNR --\> ERDAT = STARTDAT; Dauer = 0; 
nächster Vorgang --\> DAUER = ERDAT VORGANG 2 - ERDAT VORGANG1
nächster Vorgang --\> DAUER = ERDAT VORGANG 3 - ERDAT VORGANG2
...

Kriegen wir das hin? Vielen Dank für deine Mühe bisher!

Gruß Roland

Hallo Roland,

da ich derzeit oft 12-Stunden-Tage habe, kann ich nicht wirklich viel Zeit mit diesem „Problem“ verbringen. Darum nur noch ein paar allgemeine Anmerkungen.

Die Tage sind negativ, weil ich die falsche Reihenfolge angegeben hatte - natürlich müssen Datum und DMin (mit den Parametern) vertauscht werden. Dann würde die Abfrage genau das liefern, was in Deinem ersten Beispiel angegeben war:

A.Nr Bereich Datum DAUER
2300000 PS 23.06.2010 Leer
2300000 F 25.06.2010 2
2300000 F 28.06.2010 3
2300000 S 09.07.2010 11

(die „0“ müsste natürlich noch entfernt werden)

Wenn nun der zeitliche Abstand zum letzten Vorgang gesucht wird, muss man natürlich etwas anderes verwenden: Das ist das Maximum aller Vorgänge zu dieser Nummer, die VOR dem aktuellen Vorgang lagen! Also verwendet man die Funktion DMax und als Kriterium die Einschränkung, dass das Datum vor dem Datum des aktuellen Vorgangs liegt.

Dauer: DateDiff(„d“;DMax(„Datum“;„Auftrag“;"(ANr=" & [Auftrag].[ANr] & ") AND (Datum

Hallo Ro,

tut mir leid wegen der späten Antwort, aber ich war in Urlaub.
Ich glaube nícht, dass du dein Problem mit einer Abfrage lösen kannst.
Das ist ein Fall für VBA. Du nimmst die obenstehende Tabelle/Abfage öffnest ein Recordset und durchläufst dieses nach den A.Nr. in einer Schleife.

Ich hoffe dieser Ansatz hilft dir weiter.

viele Grüsse
isis