News

FAQ Access – Zeitdifferenzen ermitteln

Category:

Access, FAQ

0

Access Grundlagen- Zeitdifferenzen ermitteln

Problem

Eines der am häufigsten angefragten Themen ist die Verwaltung von Arbeitszeiten und die damit verbundene Berechnung der Differenzen beispielsweise bei Start- und Endzeiten für Projektarbeiten.

Lösung

Hier werden in der Regel Tabellen eingesetzt, die zum Beispiel zwei Felder „AZStart“ und „AZEnde“ enthalten, in denen im Format „Standarddatum“ beispielsweise eine Projektarbeit von „12.03.2004 08:45:00“ bis „12.03.2004 10:30:00“ festgehalten ist. Um hier die Differenz als Zeitangabe zu erhalten, können Sie das Feld „AZEnde“ einfach vom Feld „AZStart“ abziehen und entsprechend formatiert ausgeben:

Sub btnTest_Click ()
Dim ZeitDiff As Date
ZeitDiff = Me.AZEnde - Me.AZStart
MsgBox Format$(ZeitDiff, "hh:nn:ss")
End Sub
Access zeigt die korrekte Differenz von „1:45:00“ an. Was aber, wenn eine Nachtschicht notwendig war und die Projektarbeit erst am 14.03.2004 um 10:30 Uhr beendet war? Access errechnet als Differenz immer noch „1:45:00“! Das liegt daran, dass Access bei diesen Berechnungen das Datum nicht berücksichtigt. Es lässt sich also nicht vermeiden, hier eigene Funktionen einzusetzen, die eine entsprechende Umrechnung vornehmen und dabei auch das Datum berücksichtigen.

Am besten geht man dabei so vor, dass der Aufwand jeweils in Minuten gespeichert und für die Anzeige aufbereitet wird. Neben den Feldern für Start und Ende der Projektarbeit ist zunächst ein weiteres Feld
„AZSumme“ vom Datentyp „Zahl/Long“

notwendig. Außerdem benötigen Sie zwei Funktionen, die eine Zeitdifferenz in Minuten umrechnen bzw. die in Minuten gespeicherte Summe wieder im Format „Stunden:Minuten“ anzeigen.

Geben Sie also zunächst die beiden folgenden Funktionen in einem beliebigen VBA-Modul ein:

Function TDiffToMins (Diff As Variant)
Dim X As Variant
On Error Resume Next
X = Int(CSng(Diff * 24 * 60)) TDiff
ToMins = X
End Function
Die Funktion „TDiffToMins()“ erwartet als Parameter die Differenz zweier Datums/Zeit-Felder, so dass Sie die umzurechnenden Felder direkt beim Aufruf angeben können:
"X= TDiffToMins(AZEnde - AZStart)".
Diese Differenz verarbeitet die Routine dann wie folgt: Das „On Error Resume Next“ sorgt zunächst dafür, dass die Funktion keinen Laufzeitfehler erzeugt, wenn ein leeres Feld übergeben wurde. Das Funktionsergebnis ist dann einfach „0“. Andernfalls multipliziert die Routine die übergebene Differenz mit „24“ (Stunden pro Tag) und „60“ (Minuten pro Stunde) und liefert die Summe als Funktionsergebnis zurück.
Function MinsToTime (Mins As Long) As String
Dim H As Variant, M As Variant
H = Mins \\ 60
M = Mins Mod 60
MinsToTime = H & ":" & Format$(M, "00")
End Function
Die Funktion „MinsToTime()“ erwartet als Parameter eine Summe in Minuten, die in ein Ergebnis der Form „Stunden:Minuten“ konvertiert wird. Zunächst werden dazu die Minuten durch 60 geteilt, um die Anzahl Stunden zu ermitteln. Das Ergebnis nimmt die Variable „H“ auf. Über die Operation „Mins Mod 60“ werden die verbleibenden Minuten der letzten, nicht voll gearbeiteten Stunde ermittelt und in der Variablen „M“ festgehalten.
Die letzte Anweisung formatiert dann das Funktionsergebnis so, dass die Stunden immer ohne führende Nullen und die Minuten immer zweistellig, ggf. mit einer oder zwei Nullen, geliefert werden.Die beiden Funktionen bauen Sie nun in Ihren Formularen, in denen mit Zeitdifferenzen gearbeitet werden soll, wie folgt ein:
Öffnen Sie das Formular im Entwurfsmodus und markieren Sie das Feld, in dem die Startzeit eingegeben wird. Mit einem Doppelklick auf den Rand des Feldes rufen Sie das Eigenschaftenfenster für das Feld auf.· Stellen Sie die Eigenschaft „Nach Aktualisierung“ auf den Eintrag

[Ereignisprozedur]“ ein und rufen Sie den Modul-Editor durch einen Klick auf die Schaltfläche mit den drei Punkten auf.·

Geben Sie im Editor die folgenden Anweisungen ein

Dim varMinuten As Variant
varMinuten = TDiffToMins(AZEnde - AZStart)
Me.AZSumme = varMinuten·

Passen Sie die Feldnamen „AZStart“, „AZEnde“ und „AZSumme“ entsprechend den in Ihrem Formular verwendeten Feldnamen an und schließen Sie den Editor.· Wiederholen Sie diesen Vorgang für das Feld, in dem die Endzeit eingegeben wird. Vergessen Sie auch hier die Anpassung der Feldnamen nicht!· Legen Sie nun ein zusätzliches ungebundenes Textfeld im Formular an und rufen Sie dessen Eigenschaftenfenster über einen Doppelklick auf den Rahmen auf.·
Bei der Eigenschaft „Steuerelementeinhalt“ tragen Sie die folgende Anweisung ein:

=MinsToTime([AZSumme])

Passen Sie dabei den Feldnamen „AZSumme“ entsprechend dem in Ihrem Formular verwendeten Feld für die Speicherung der Minuten an.Wenn Sie das Formular nun anzeigen lassen und Werte in die Felder für Start- und Endzeit eingeben, wird die Differenz automatisch in Minuten umgerechnet und im entsprechenden Feld gespeichert. Im Zusatzfeld erfolgt gleichzeitig eine Anzeige des errechneten Aufwandes im Format

„Stunden:Minuten“.

Um diese Informationen auch in einem Bericht auszugeben, gehen Sie wie folgt vor:

1. Öffnen Sie den Bericht im Entwurfsmodus.

2. Legen Sie im Detailbereich ein zusätzliches ungebundenes Textfeld an und rufen Sie das Eigenschaftenfenster

3. In der Eigenschaft „Steuerelementeinhalt“ tragen Sie die folgende Anweisung ein:
=MinsToTime([AZSumme])

Passen Sie den Feldnamen „AZSumme“ entsprechend dem in Ihrem Bericht verwendeten Feld für die Speicherung der Minuten an. Wenn Sie den Bericht daraufhin in der Vorschau anzeigen lassen, wird auch hier der Aufwand pro Projekt im Klartext im Format „Stunden:Minuten“ angezeigt.Um zusätzlich in einem Gruppen- oder Berichtsfuß eine Gesamtsumme auszugeben, legen Sie hier ebenfalls ein zusätzliches ungebundenes Textfeld an und setzen dessen Eigenschaft „Steuerelementeinhalt“ auf

=MinsToTime(Summe([AZSumme]))

Tags:

Leave a Reply

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.