Moin zusammen,
vielleicht kann mir jemand weiterhelfen. Ich beschäftige mich erst seit letzter Woche mit VBA, daß sollte reichen um ein Bild meiner VBA-Kenntnisse zu vermitteln.
Ich habe eine Tabelle in meiner DB in der ich Uhrzeiten voneinander subtrahieren will um zeitliche Abstände zu ermitteln. Später sollen daraus Frequenzen errechnet werden. Dies soll allerdings nur unter bestimmten Bedingungen geschehen.
In der Tabelle gibt es die Spalten calc_nr (Autowert) obs_date (Datum, dd.mm.yyyy), obs_time (Zeit, hh:mm), walker (Zahl, integer), biker (Zahl, integer) und noch weitere, ähnliche Kategorien sowie frq_walker (Zeit, hh:mm), frq_biker (hh:mm) etc.
Die Tabelle ist nach Datum und Uhrzeit aufsteigend sortiert (dementsprechend auch die Spalte calc_nr), diese Werte sind auch immer vorhanden. In walker, biker etc. stehen häufig Nullwerte bzw. nur in einer der Kategorien eine Zahl größer Null.
Ich würde gerne die zeitlichen Abstände zwischen einer Zeit und der nachfolgenden Zeit berechnen bei der beispielsweise jeweils walker >=1 ist und das Datum übereinstimmt. Zwischendurch habe ich weitere Zeiten, bei denen jedoch walker immer 0 ist.
Ich habe mal einen Code "zusammengetippt" (siehe unten), könnte man sagen. Er funktioniert natürlich nicht (Fehler beim Kompilieren: Do ohne Loop), aber davon mal ganz abgesehen glaube ich nicht, daß der läuft. Vielleicht erbarmt sich ja jemand...
Viele Grüße
Jochen
Dim Zeit1 As Date
Dim ZDatum As Date
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("Select calc_nr, obs_date, obs_time, walker, frq_walker from tbl_prep_disturbance_frequence")
rst.MoveFirst
Do While Not rst.EOF
If walker >= 1 Then
Zeit1 = rst("obs_time")
ZDatum = rst("obs_date")
End If
rst.MoveNext
If rst("obs_date") = ZDatum And walker >= 1 Then
rst.Edit
rst("frq_walker") = rst("obs_time") - Zeit1
rst.Update
End If
If rst("obs_date") > Zeit1 Or walker <= 1 Then
rst.MoveNext
End If
Do Until rst("calc_nr") = 1820
rst.Close
Loop
End Function
Hallo,
ohne jetzt die Funktionalität deiner Berechnungen näher analysiert zu haben -
Die Fehlermeldung entstammt den letzten 3 Zeilen deines Codes.
Du eröffnest 2 Schleifen und 'Loopst' jedoch nur eine - Fehler Nr 1
Innerhalb deines Schleifencodes darfst du das Recordset nicht schließen sonst kann es nicht weiter durchlaufen werden - Fehler Nr 2
Wenn du einen Datensatz anspringst um daraus zu lesen und dann auf den nächsten wechselst um dort zu prüfen und ev. zu editieren steht dein Zeiger beim kommenden Schleifendurchlauf auf Datensatz Nummer 3 sollte aber im gleichen Schleifenedurchlauf auch diese Bedingung erfüllt sein ---> If rst("obs_date") > Zeit1 Or walker <= 1 Then <--- dann steht der Zeiger auf Datensatz 4 und wird beim Starten unrichtige Daten zum Vergleich heranziehen ...
Ich würde hier eher mit 2 identen Recordsets arbeiten eines zum Editieren und eines zum überprüfen und 'springen' - die Datensätze solltest du dann über den Primärschlüssel identifizieren.
Zum Sicherstellen der Reihenfolge solltest du ins SQL-Statement einen Order By Primäschlüssel einfügen.
HTH
Peter
Moin Peter,
besten Dank für Deine Hilfe. Das mit der Schleife leuchtet mir ein und auch die Zeiger-Geschichte. Was Du mit 2 identen Recordsets meinst leider nicht. Vielleicht guckst Du ja nochmal hier rein und hast Lust mir das mit wenigen Zeilen zu erklären.
Viele Grüße,
Jochen
Hallo,
die Lösung über 2 Recordsets stellt EINE der Möglichkeiten dar, die in dem Fall anwendbar wären.
Mein Gedankengang dazu war, 2 Recordsets aus der gleichen SQL zu erzeugen.
Danach springst du im Recordset 2 auf die relevanten Datensätze, liest und vergleichst, ermittelst die entsprechende ID und stellst dich dann im Recordset 1 auf den entsprechenden Datensatz um diesen zu ändern.
So, denke ich wird die Sucherei und Springerei ein wenig übersichtlicher und ist nicht so fehleranfällig.
Grüße
Peter
Ha, das ist ja mal ne gute Idee, denke ich hab's verstanden! Hoffe daß, ich das hinkriege...
Besten Dank für Deine Hilfe!
Grüße
Jochen