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
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?
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.
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!!!
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.
vielen Dank für dein Engagement und nun zum Problem.
Man stelle sich eine Tabelle „Datentabelle“ vor. Diese enthält folgende spalten:
OP - Saal --> z.B. 1,2,3,4,…
OP_Ende --> Datum/Zeit z.B. 01.01.2005 16:30:00 --> Zeit der Beendigung der OP
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!!!
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).
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.
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!!!
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.
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?
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.
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?
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?
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?
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).
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.