Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Subtraktion Zeiten unter Bedingungen

Begonnen von Jochen_1983, Juli 06, 2010, 17:40:40

⏪ vorheriges - nächstes ⏩

Jochen_1983

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

database

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



Jochen_1983

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

database

#3
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

Jochen_1983

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