Zeitfunktionen mit verschiedenen Datensätzen

Hey Leute,

nun habe ich bereits den dritten Artikel gepostet („peinlich, peinlich“) Ich hoffe ich poste nicht zu viel, aber wenn man schön dabei ist dann kommt man auf neue Ideen aber weiss nicht wie man iese direkt umsetzen kann, somit zu euch :wink:

Man stelle sich von es gibt eine Tabelle mit zwei spalten „Anfangszeit“ und „Endzeit“ und z.B. drei Einträgen. Ich vorfolge folgendes Ziel: Ich möchte die Endzeit des ersten Datensatzes von der Anfangszeit des zweiten Datensatzes subtrahieren --> [Anfangszeit]-[Endzeit]

Wie bringe ich also Access in einer Abfrage bei sich auf bestimmte Datensätze zu beziehen?

Danke, Danke, Danke!!!

Hallo,

Wie bringe ich also Access in einer Abfrage bei sich auf
bestimmte Datensätze zu beziehen?

Du kannst mit der „ORDER BY …“-Klausel die Datensätze in eine definierte Reihenfolge bringst. Oder mit der „WHERE …“-Klausel nur bestimmte Datensätze ausfiltern.

ujk

Halli hallo ujk,

schön dass du geantwortet hast, doch da ich lediglich ein VBA Anfänger bin könntest du mir noch etwas deutlicher beschreiben wie dieses in einer Abfrage aussehen könnte.

Du kannst mit der „ORDER BY …“-Klausel die Datensätze in
eine definierte Reihenfolge bringst. Oder mit der „WHERE
…“-Klausel nur bestimmte Datensätze ausfiltern.

Das würde mir unheimlich helfen, vielen lieben Dank!!!

Hallo,

das Problem ist, dass in einer relationalen Datenbank (wie Access) die Datensätze in den Tabellen per Definition ungeordnet sind. Die Bezeichnung erster oder zweiter Datensatz macht daher keinen Sinn.

Haben Deine Datensätze aber eine laufende Nummer, kannst Du im Abfrageeditor unter Sortieren in der Abfrage eine definierte Reihenfolge erstellen. Genauso kannst Du über Funktionen (Ansicht - Funktionen im Abfrageeditor) zum Beispiel den maximalen oder minimalen Wert eines Felds aussortieren.

Was willst Du konkret tun? Beispiel?

ujk

Hi ujk,

vielen Dank für dein Engagement und nun zum Problem.

Man stelle sich eine Tabelle „Datentabelle“ vor. Diese enthält folgende spalten:

  1. OP - Saal --> z.B. 1,2,3,4,…
  2. OP_Ende --> Datum/Zeit z.B. 01.01.2005 16:30:00 --> Zeit der Beendigung der OP
  3. OP_Anfang --> Datum/Zeit z,B. 02.03.2005 17:20:00 --> Zeit des OP Anfangs

Kurze Beschreibung zum Verständnis: an einem Tag werden verschiedene OP’s durchgeführt und natürlich in verschiedenen OP-Sälen. Die Abfrage muss die Daten zuerst nach OP sälen sorteren

OP1
OP1
OP1
OP2
OP2

und dann nach datum sowie Uhrzeit, also chronologisch. Zur Berechnung müssten (betrachtet man nur einen OP Saal) die Uhrzeit zwischen den OP’s ausgerechnet werden --> OP_Anfang der zweiten OP am Tag minus OP_Ende der ersten OP an diesem Tag usw. 3. minus 2., 4. minus 3. …

Ich hoffe du hast das Problem verstehen können und nun bin ich am Ende meiner Weißheiten und bitte um Hilfe und bin für jeden Hinweis dankbar!!!

Schönen Gruß aus Köln

Hallo,

wie das mit einer Abfrage geht, fällt mir so nicht ein.

Mit VBA geht das etwa so

Dim db As Database, rst1 As Recordset
 Dim stSQL As String
 Dim qdfNew As QueryDef, qdfLoop As QueryDef
 Dim stAbfrage As String
 Dim stOP\_Saal As String
 Dim dtOP\_Ende As Date
 Dim varDifferenz As Variant

 'Löschen und Neuerstellen der Abfrage

 stAbfrage = "Name\_der\_Abfrage"
 Set db = CurrentDb
 For Each qdfLoop In db.QueryDefs
 If qdfLoop.Name = stAbfrage Then
 db.QueryDefs.Delete stAbfrage
 Else
 'Nichts tun
 End If
 Next qdfLoop
 stSQL = "SELECT Datentabelle.OP\_Saal, Datentabelle.OP\_Anfang, " \_
 & "Datentabelle.OP\_Ende, Datentabelle.Differenz " \_
 & "FROM Datentabelle " \_
 & "ORDER BY Datentabelle.OP\_Saal, Datentabelle.OP\_Anfang"
 Set qdfNew = db.CreateQueryDef(stAbfrage, stSQL)
 Set qdfNew = Nothing


 'Schleife durch die nach Saal und Anfang geordneten Datensätze

 Set rst1 = db.OpenRecordset(stAbfrage, dbOpenDynaset)
 rst1.MoveFirst
 stOP\_Saal = rst1![OP\_Saal]
 dtOP\_Ende = rst1![OP\_Ende]
 rst1.MoveNext
 Do Until rst1.EOF = True
 If rst1![OP\_Saal] = stOP\_Saal Then
 rst1.Edit
 rst1![Differenz] = DateDiff(n, dtOP\_Ende, rst1![OP\_Anfang])
 rst1.Update
 dtOP\_Ende = rst1![OP\_Ende]
 Else
 stOP\_Saal = rst1![OP\_Saal]
 dtOP\_Ende = rst1![OP\_Ende]
 End If
 rst1.MoveNext
 Loop
 rst1.Close
 Set rst1 = Nothing
 Set db = Nothing

Zunächst wird eine Abfrage erstellt, die nach OP_Saal und OP_Anfang geordnet ist. Dann wird in einer Schleife durch alle Datensätze durchgegangen und ab dem jeweils zweiten Datensatz die Zeitdifferenz in Minuten zwischen Ende des vorhergehenden und Anfang des aktuellen Datensatzes in ein Feld „Differenz“ geschrieben, um das Du Deine Datentabelle noch ergänzen müßtest (Typ Integer).

ujk

Einen wunderschönen guten Morgen ujk,

ich bin sprachlos… vielen Dank für deine Mühe, ich werde es am Wochenende Mal austesten und bin gespannt ob alles klappt.

Kannst du mir evtl. noch verraten wo ich diesen VBA Code einsetzen müsste? Ich schätze Mal ein extra Modul daraus machen oder geht es sinnvoller?

Herzlichen Dank!

Gruß aus Köln!

Hallo,

die Frage ist, wie Du es triggerst (auslöst). Zu Testzwecken vielleicht einfach einen Button auf Deinen Formular anlegen und den Code über den Code-Editor hereinkopieren. Dann wird das Feld „Differenz“ bei jedem Buttonklick neuberechnet.

Aus Gründen der Redundanzvermeidung sollte man berechnete Daten nicht in den Tabellen ablegen, ich hab es hier der Einfachheit halber gemacht.

ujk

hi,

ich danke dir für deine Hilfe. Ich wedre es am Wochenende antesten und hoffe, dass alles glatt läuft. Wenn nicht, dann werde ich mich noch Mal melden, wenn du nichts dagegen hast aber nun vielen herzlichen Dank!!!

Grüße aus Köln!

Hi ujk,

Dim db As Database, rst1 As Recordset

beim Ausführen der Prozedur bekomme ich einen Fehler angezeigt

–> „Benutzerdefinierter Typ nicht definiert“

Habe ich etwas falsch gemacht? Oder etwas vergessen?

Danke dir!

Hi ujk,

Dim db As Database, rst1 As Recordset

beim Ausführen der Prozedur bekomme ich einen Fehler angezeigt

–> „Benutzerdefinierter Typ nicht definiert“

Habe ich etwas falsch gemacht? Oder etwas vergessen?

Danke dir!

Hallo.

Habe ich etwas falsch gemacht? Oder etwas vergessen?

Nein und ja. Da fehlt ein Verweis auf eine MS-Bibliothek. Den kannst Du in „Extras/Verweise“ setzen - ich weiß im Moment nur nicht auswendig, welche Bibliothek Du für diesen Fall brauchst (evtl. MS DAO 3.6?). Und an diesem Mickymauscomputer hier habe ich auch kein Access … aber Du könntest mal http://www.donkarl.com in den FAQs zu VB gucken. Ich meine mich da dumpf zu entsinnen, dass genau Dein Fehlertext da behandelt wird.

Gruß Eillicht zu Vensre

Gutemn Morgen Eillicht zu Vensre,

stimmt danke, als ich den Verweis auf die MS DAO 3.6 gemacht habe wurde dieser Fehler nicht mehr angezeigt.

Doch jetzt habe ich einen anderen:

'Schleife durch die nach Saal und Anfang geordneten Datensätze

Set rst1 = db.OpenRecordset(stAbfrage, dbOpenDynaset)
rst1.MoveFirst
stOP_Saal = rst1![OP_Saal]
dtOP_Ende = rst1![OP_Ende]
rst1.MoveNext
Do Until rst1.EOF = True
If rst1![OP_Saal] = stOP_Saal Then
rst1.Edit
rst1![Differenz] = DateDiff(n, dtOP_Ende, rst1!
[OP_Anfang])
rst1.Update
dtOP_Ende = rst1![OP_Ende]
Else
stOP_Saal = rst1![OP_Saal]
dtOP_Ende = rst1![OP_Ende]
End If
rst1.MoveNext

in der Zeile mit „rst1.Edit“ zeigt Access mir wieder einen Fehler

–> „Methode oder Datenobjekt nicht gefunden“

Aaaaaaaaahhhh was ist hier los??? :wink:
Hiiiiiiilfe!

PS: Schon Mal Danke, Danke für die Tipps!

Hallo,

ich habe einmal getestet, finde aber nur einen Fehler in der Zeile

rst1![Differenz] = DateDiff(n, dtOP\_Ende, rst1![OP\_Anfang])

korrigiert zu

rst1![Differenz] = DateDiff( **"n"** , dtOP\_Ende, rst1![OP\_Anfang])

läuft es durch.

Verweise sind gesetzt zu „Visual Basic For Applications“, „Microsoft Access 8.0 Object Library“ und „Microsoft DAO 3.51 Object Library“.

ujk

Hallo ujk,

freut mich dass du geantwortet hast. Ich habe den Fehler ausgebessert, doch bei der Ausführung verweist Access mich auf die besagte Zeile mit „Edit“ wobei „Edit“ markiert wird.

Was meinst du woran das liegen kann? Kann es an dem Aufbau liegen, mögilcherweise habe ich ja etw. übersehen?

Vielen Dank!

Beste Grüße

Hallo,

Du kannst noch folgendes versuchen: Bei der Variabelendeklarierung oben mit

Dim db As Database, rst1 As **DAO.** Recordset

ausdrücklich darauf hinweisen, dass Access auf DAO statt ADO zurückgreifen soll. Bis Access97 (meine Version hier) war das das Standard-Datenzugriffsmodell. Mit Access2000 kam ADO. Ich nehme an, Du hast >= A2000?

Sonst bliebe nur noch, die betroffenen Zeilen in den ADO-Syntax umzuschreiben.

ujk

Hi ujk,

Eigentlich funktioniert das Konzept es aber nur „fast“:

ID OP_Anfang OP_Ende Differenz
1 08:20:00 10:30:00
2 10:40:00 10:50:30 2.4.1884 --> wie es aussieht nur ein Datumswert
3 12:40:00 14:00:00 22.8.1876 --> wie es aussieht nur ein Datumswert
P.S: vor den Uhrzeiten muss man sich noch das Datum vorstellen

in der Spalte „Diferenz“ hätte ich erwartet in der 2. Zeile: 00:10:00 usw. hast du eine Idee woran das liegen kann?

Ich danke dir herzlich!

Schöne Grüße!

Hallo,

in „Differenz“ wird die Anzahl der Minuten als Zahl, nicht als Zeit- oder Datumswert ausgegeben. Liegt am Parameter „n“ in der DateDiff-Funktion. Hast Du in der Tabelle für „Differenz“ Long oder Integer als Felddatentyp angegeben?

ujk

HI,

jetzt habe ich deine Änderungen eingefügt und folgendes hat sich ergeben:

OP_Anfang-----------OP_Ende-------------Differenz
10.5.1995 08:20:00–10.5.1995 10:30:00
10.5.1995 10:40:00–10.5.1995 10:50:30–10
18.5.1995 08:20:00–18.5.1995 08:25:00–11370
18.5.1995 13:30:00–18.5.1995 13:50:00–305

die Differenz von 10 min. stimmt, doch noch eine Frage: kann man folgendes machen, dass in der Spalte „Differenz“ die Zelle mit der ersten OP des Tages (wenn man ein OP-saal betrachtet) leer bleibt, da man je logischerweise von der ersten OP des Tages nicht anziehen kann, das heißt hier müsste die 3. Zelle von oben in der Spalte „Different“ leer bleiben.

Und noch eine Frage_ gibt es eine Möglichkeit die Zahlendifferenz in ein Uhrzeitenformat umzuwandelt (00:00:00) aber so dass man damit noch weiterrechnen kann?

Vielen riesen Dank!!!

Hallo,

  1. Du meinst Differenz soll leer bleiben, wenn es sich um den ersten Eintrag eines Tage handelt? Lösungsansatz wäre, in der Schleife das Datum in einer Variablen zu speichern, beim nächsten Datensatz beim nächsten Datensatz, ob der Tagesanteil des Datums gleichgeblieben ist und die Differenz nur dann zu bilden, wenn dies zutrifft. Wenn ein neuer Tag vorliegt, dann dieses Datum in die Variable zu schreiben (für die Prüfung beim nächsten Datensatz).

  2. Mit Zeiten zu rechnen ist prizipiell kein Problem, weil Datumsausdrücke in Access als Gleitkommazahlen behandelt werden. Der ganzzahlige Anteil repräsentiert die vergangenen Tage, der Rest die angebrochenen Stunden und Minuten.

Habe leider keine Zeit für eine konkrete Lösung, bin auch erst wieder übermorgen erreichbar. Mach doch ein neues Posting auf.

ujk