Neuigkeiten:

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

Mobiles Hauptmenü

Nachtarbeitsstunden berechnen

Begonnen von Goon, Juni 29, 2016, 15:54:25

⏪ vorheriges - nächstes ⏩

Goon

Hallo,

ich möchte in einer Tabelle "Arbeitszeiten" (Access) eine Nachstundenberechnung durchführen. Der Arbeitszeitanfang (AZA) sowie das Arbeitszeitende (AZE) sind mir gegeben. Doch finde ich keine Formel die mir weiterhilft. Und auch mit den Makros komm ich nicht ganz zurecht, da ich nicht weiß wie ich die zum laufen bekomme. Ich habe mir dazu eine neue Spalte (dvNacht) hinzugefügt in die die Makro-Berechnung ausgeführt werden soll. Doch bringt er mir den Fehler, dass er das Feld AZA nicht findet. Kann ich in einer Tabelle überhaupt eine Makro-Berechnung durchführen.?  Gibt es eine Möglichkeit ohne Makros zu arbeiten, also eben eine Formel in der Tabelle zu hinterlegen die mir den richtigen Wert zurückgibt.

PS: Hier die rechachierte VBA-Funktion

Function NightHours(AZA, AZE)

End Function
    ' SW = Uhrzeit Arbeitsbeginn
    ' EW = Uhrzeit Arbeitsende
    If BeginNight = 0 Then BeginNight = TimeValue(ReadParameter("22:00:00", "00.01.1900"))
    If EndOfNight = 0 Then EndOfNight = TimeValue(ReadParameter("06:00:00", "00.01.1900"))
     
    If (TimeValue(AZA) > BeginNight Or TimeValue(AZA) < EndOfNight Or TimeValue(AZE) < EndOfNight Or TimeValue(AZE) > BeginNight) Then
        S = DateValue(AZA) + BeginNight
        E = DateValue(AZE) + EndOfNight
        If TimeValue(AZA) < EndOfNight And TimeValue(AZE) > BeginNight Then
            S1 = AZA
            E1 = EndOfNight
            S2 = BeginNight
            E2 = AZE
            NightHours = DateDiff("n", S1, E1) + DateDiff("n", S2, E2)
        Else
            If TimeValue(AZE) > BeginNight Then E = AZE
            If TimeValue(AZA) > BeginNight Then S = AZA
            If TimeValue(AZA) < EndOfNight Then S = AZA
            If TimeValue(AZE) < EndOfNight Then E = AZE
            NightHours = DateDiff("n", S, E)
        End If
    End If

Danek schon mal danke vorab, ich verzweifel hier noch !!!!

Beaker s.a.

Hallo,
1. Die Zeile
End Function
muss natürlich ganz ans Ende. Nehme aber mal, dass das nur ein C&P-Fehler ist.

ZitatGibt es eine Möglichkeit ohne Makros zu arbeiten, also eben eine Formel in der Tabelle zu hinterlegen die mir den richtigen Wert zurückgibt.
Das wäre ein so genanntes Daten-Macro. Damit kenne ich mich aber nicht aus.
ZitatKann ich in einer Tabelle überhaupt eine Makro-Berechnung durchführen.?
In einer Tabelle (ausser s.o.) nicht, aber in einer Abfrage.
Da schreibst du im Entwurf in die erste Zeile einer leeren Spalte:
NS: NightHours(AZA, AZE)
AZA und AZE sind die Felder mit der Anfangs- und Endzeit. Die musst du an
deine Feldnamen anpassen.

btw. Ob die Function korrekte Werte zurückgibt habe ich nicht getestet.

hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

Analog zu How to handle midnight in calculations vom The access Web erhalte ich folgendes im Direkt-Bereich.?TimeValue(Format(#22:00# - 1 - #06:00#, "short time")) * 24 * 60
480
In eine Funktion gepackt:Public Function GetMinutesBetweenTimes(StartTime, EndTime)
   If IsNull(StartTime) Or IsNull(EndTime) Then Exit Function

   On Error Resume Next
   GetMinutesBetweenTimes _
         = TimeValue(Format(TimeValue(CDate(StartTime)) _
                            - 1 - TimeValue(CDate(EndTime)), _
                            "short time")) * 24 * 60
End Function
wären das mögliche Aufrufe:?GetMinutesBetweenTimes(#22:00#, "6:00")
480
?GetMinutesBetweenTimes(1 / 3, #12:00#)
240
?GetMinutesBetweenTimes(#12:00#, #18:00#)
360
?GetMinutesBetweenTimes(#18:00#, #12:00#)
1080
Grüße von der (⌒▽⌒)

MzKlMu

Hallo,
@Lachtaube
ich glaube, das ist nicht das Problem.

AZA: 21:00 AZE: 23:00 Keine Nachtarbeit
AZA: 21:00 AZE: 03:00 1h (bis 22:00) keine Nachtarbeit, 5h Nachtarbeit
AZA: 00:00 AZE: 06:00 6h Nachtarbeit

Das heißt, gefragt ist die echte Nachtarbeit, wenn AZA und/oder AZE außerhalb der Nachtarbeitsgrenzen liegen liegen.
Und das ist aufwendiger.
Gruß Klaus

Goon

Vorab erst mal vielen Dank für die Hilfe, zumidestens bekomme ich die Makros zum laufen ( Party :-) ), doch leider ist AZA und AZE je Mitarbeiter und Tag variabel. Soll heißen, ich benötige eine Auswertung die ausdrückt: Wenn Arbeitszeit zwischen 20:00 Uhr und 6:00 Uhr = dann gib diese Stunden wieder.

Bsp:
Hr. Musstermann: Beginn 23:00 Uhr (AZA) und Ende 08:00 Uhr (AZE) = 7 Std. Nachtarbeit

Lachtaube

#5
Das könnte zum gewünschten Resultat führen.
Public Function GetMinutesOfNightShiftWork( _
       ByVal StartWork, ByVal EndWork, _
       Optional ByVal StartNightHour = #8:00:00 PM#, _
       Optional ByVal EndNightHour = #6:00:00 AM#)

   If IsNull(StartWork) Or IsNull(EndWork) Then Exit Function

   StartWork = TimeValue(CDate(StartWork))
   EndWork = TimeValue(CDate(EndWork))

   If StartWork < StartNightHour And StartWork > EndNightHour Then _
      StartWork = StartNightHour
   If EndWork > EndNightHour And EndWork < StartNightHour Then _
      EndWork = EndNightHour

   GetMinutesOfNightShiftWork _
         = CLng(TimeValue(Format(StartWork - 1 - EndWork, "short time")) * 24 * 60)
End Function
Grüße von der (⌒▽⌒)

Goon

Hallo Lachtaube,

ich verzweifle hier noch, wenn ich Das so ausführe komme ich auf einen Wert von 4995 ( vermutlich min.). Obwohl ich bei der Auswertung , die SAVE ist, auf 56,75 Stunden komme.

Was mach den da Falsch, die Ausgabe ist bei mir in Dezimal formatiert?! In Uhrzeit zeigt er bei mir nichts an.

Lachtaube

Hallo,

vielleicht kannst Du ja mal einige Daten (z. Bsp. als Anhang im Textformat) zur Verfügung stellen und das zu erwartende Resultat aufzeigen.

PS: ich habe die Funktion nicht auf Herz und Nieren geprüft.
Grüße von der (⌒▽⌒)

Goon

Hallo Lachtaube,

ich hab mal eine abgespeckte anonymisierte csv-Tabelle angefügt.

Danke nochmal für deine Bemühungen !!!!!!!!!

Lachtaube

Hallo,

ich habe die Funktion weiter oben korrigiert. Ergebnis mit den Testdaten:Mitarbeiter AZA AZE NSD
Mustermann 01:30:00 07:20:00 270
Mustermann 23:00:00 07:30:00 420
Mustermann 01:00:00 07:40:00 300
Mustermann 03:00:00 07:15:00 180
Mustermann 01:30:00 08:30:00 270
Mustermann 03:00:00 07:35:00 180
Mustermann 03:00:00 07:40:00 180
Mustermann 23:00:00 07:25:00 420
Mustermann 03:00:00 07:20:00 180
Mustermann 01:30:00 07:05:00 270
Mustermann 03:00:00 07:30:00 180
Mustermann 03:00:00 08:00:00 180
Mustermann 03:00:00 07:15:00 180
Mustermann 01:30:00 07:30:00 270
Mustermann 03:00:00 07:05:00 180
Grüße von der (⌒▽⌒)

Goon

Hallo Lachtaube,

das schaut ja richtig geil aus!!! :-D

jetzt muss ich mal blöd fragen, mach ich das über die Kreuztabelle überhaupt richtig, bzw. wo und wie hast du die Funktion dann eingesetzt, in der Tabelle oder über eine Abfrage und wenn dann wo?

Lachtaube

Hi Goon,

Die Funktion habe ich in einer Auswahlabfrage verwendet, wobei AZA und AZE als Argumente übergeben wurden. Zusätzlich habe ich beim Feld AZA ein Kriterium Ist Nicht Null eingestellt.

Zur Kreuztabelle: Kann man machen. Mitarbeiter und Jahr als Zeilenüberschrift aufführen, Kalenderwoche oder Monat als Spaltenüberschrift verwenden und die Summe des Funktionsergebnisses als Wert nehmen.
Grüße von der (⌒▽⌒)

Goon

Hi,

anscheinend weiß ich, dass ich absolut nichts weiß, aber wie übergebe ich AZA und AZE als Argument?

Goon

Hey Lachtaube,

wahrscheinlich hast du schon keinen Bock mehr. :-) Versteh ich ! Ich hätte da zwei Anhänge: 1 mal die Ausgabe wie sie bei mir aussieht, da werden die Nachtstunden unter Ausdruck 2 völlig fehlerhaft dargestellt ( nicht wie bei dir ) und beim 2. Anhang siehst die Befehlszeile vor dem Ausführen.

Ich bin dir für das bisher aber auch schon sehr dankbar!!!

Lachtaube

Hi,

das ist die von mir verwendete Abfrage basierend auf der Textdatei:SELECT Mitarbeiter,
       AZA,
       AZE,
       GetMinutesOfNightShiftWork(AZA, AZE) AS NSD
  FROM Arbeitszeiterfassung
WHERE AZA Is Not Null;
Und hiermitSELECT Mitarbeiter,
       Sum(GetMinutesOfNightShiftWork(AZA, AZE)) AS Sum_NSD
  FROM Arbeitszeiterfassung
WHERE AZA Is Not Null
GROUP BY Mitarbeiter;
könnte man die Minuten aufaddieren. Resultat:Mitarbeiter Sum_NSD
Mustermann 3660
Grüße von der (⌒▽⌒)