Office: Zeiten zwischen zwei/mehrern Datensätzen kalkulieren

Helfe beim Thema Zeiten zwischen zwei/mehrern Datensätzen kalkulieren in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo zusammen, kleines Problem - aber noch keine Lösung... Folgendes - ich habe Arbeiter im Schichtdienst denen ich einmal innerhalb von 7 Tagen 36... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von Schlauchi, 11. November 2009.

  1. Schlauchi Erfahrener User

    Zeiten zwischen zwei/mehrern Datensätzen kalkulieren


    Hallo zusammen,

    kleines Problem - aber noch keine Lösung... Folgendes - ich habe Arbeiter im Schichtdienst denen ich einmal innerhalb von 7 Tagen 36 Std. am Stück frei geben muss...
    Jeden Tag tragen die sich ein - wann sie kommen - wann sie gehen. Daraus errechne ich die Arbeitszeit.
    Nur - wie rechne ich die Zeit zwischen den zwei Tagen aus? So zusagen die Ruhezeit? Ne Idee?

    Hier mal meine Tabelle:

    Arbeiter Datum Kommt Geht Arbeitszeit min. Ruhe bis
    Meier 11.09.09 09:00 16:30 06:30 12.09.09 02:30
    Schulz 11.09.09 12:45 19:30 06:45 12.09.09 05:30
    Meier 12.09.09 04:00 14:00 10:00 13.09.09 00:00

    So - ich hab zwar ein frühestes "kommen" errechnet.... aber wie rechne ich mir die aktuelle Zeit zwischen den zwei Datensätzen 11.09.09 16:30 und 12.09.09 04:00 aus?? Und das immer zwischen zwei aufeinanderfolgenden Datenzeilen... rein theoretisch sind da auch mal 150 Std. dazwischen - Wochenende - Urlaub etc....

    Wie bekomme ich die zwei in Verbindung?? Bin ratlos.

    Gruß
    Schlauchi
     
    Schlauchi, 11. November 2009
    #1
  2. Exl121150 Erfahrener User
    Hallo Schlauchi,

    folgendes VBA-Programm geht davon aus, dass Deine oben beschriebene Tabelle sich in "Tabelle8" befindet
    Code:
    Public Sub Tabelle8_Intervalle()
      Dim Db As Database
      Dim Rst As DAO.Recordset
      Dim Ankunft1 As Date, Ankunft2 As Date
      Dim ErsterSatz As Boolean
      
      Set Db = CurrentDb
      
      'Erstellen der aktuellen Abfrage auf Tabelle8, gefiltert nach Arbeiter Meier und
      'sortiert nach den Feldern Arbeiter, Datum, Kommt:
      Set Rst = Db.OpenRecordset("SELECT Arbeiter, Datum, Kommt, Geht FROM Tabelle8 " & _
                                 "WHERE Arbeiter='Meier' " & _
                                 "ORDER BY Arbeiter, Datum, Kommt;", dbOpenDynaset)
      
      Ankunft1 = 0: Ankunft2 = 0: ErsterSatz = True
      'Hole den 1. Satz
      Rst.MoveFirst
      'Überprüfe, ob überhaupt noch ein Satz gelesen wurde;
      'falls nicht: beende die Schleife
      Do Until Rst.EOF
        If ErsterSatz Then
          'Feld Datum enthält nur ein Datum, Feld Kommt enthält nur eine Uhrzeit
          'Die Summe beider ergibt genauen Ankunfszeitpunkt:
          Ankunft1 = Rst!Datum + Rst!Kommt
          'Ausgabe der 1.Ankunft des Arbeiters in den Direktbereich:
          Debug.Print Rst!Arbeiter, Rst!Datum, Rst!Kommt
          'Überschrift ausgeben in den Direktbereich:
          Debug.Print "Arbeiter", "Datum", "Uhrzeit", "Zeit seit letzter Ankunft"
          '1.Satz-Modus ist vorbei:
          ErsterSatz = False
        Else
          'Feld Datum enthält nur ein Datum, Feld Kommt enthält nur eine Uhrzeit
          'Die Summe beider ergibt genauen Ankunfszeitpunkt:
          Ankunft2 = Rst!Datum + Rst!Kommt
          'Ausgabe des Arbeiters, des akt. Datums, der Differenz zur letzten Ankunft
          'in den Direktbereich:
          Debug.Print Rst!Arbeiter, Rst!Datum, Rst!Kommt, Format((Ankunft2 - Ankunft1) * 24, "##0.0000") & " Stunden"
          'Umspeichern um Anfangszeitpunkt für nächsten Satz zu haben:
          Ankunft1 = Ankunft2
        End If
        'Hole nächsten Satz
        Rst.MoveNext
      Loop
      'Es gibt nichts mehr zu lesen: Abfrage schließen!
      Rst.Close
      
    End Sub
    Ausgabe im Direktbereich von VBA sieht folgendermaßen aus:
    Code:
    tabelle8_intervalle
    Meier         11.09.2009    09:00:00 
    Arbeiter      Datum         Uhrzeit       Zeit seit letzter Ankunft
    Meier         12.09.2009    04:00:00      19,0000 Stunden
    Meier         13.09.2009    05:00:00      25,0000 Stunden
     
    Exl121150, 14. November 2009
    #2
  3. Schlauchi Erfahrener User
    Modul... und wie weiter?

    Hallo Exl121150,

    danke erst mal für deinen Code. Bekomm ja schon viel hin - hab mir jetzt ein "Modul" aus deinem Code gebastelt.
    Aber eben fehlt mir der "click" wie ich jetzt die Daten ein eine Liste bekomme.
    Hab bis jetzt noch keine Module verwendet...
    Also - wie bekomme ich nun die Daten aus Tabelle8 - so angezeigt, wie du das beschrieben hast?
    Was mach ich mit mehreren "Arbeitern".... brauche das immer von allen gleichzeitig als Übersicht.

    Kann ich daraus wieder eine neue Tabelle machen - und die Werte dann weiter verarbeiten? Nebenbei erwähnt - ich brauch ne Übersicht wo immer nach dem "Arbeiter" sortiert / gruppiert wird... und dann alle Zeiten "dazwischen" - es soll also immer von gleichen Arbeiter die zeit kalkuliert werden - bis zum letzten Event (datum).

    Danke
    Schlauchi
     
    Schlauchi, 5. Dezember 2009
    #3
  4. Exl121150 Erfahrener User

    Zeiten zwischen zwei/mehrern Datensätzen kalkulieren

    Hallo Schlauchi,

    ich habe für das Folgende diese 2 Tabellen vorausgesetzt:

    Tabelle 'TabArbeiter':
    IDFamName
    1Meier
    2Schulz

    Tabelle 'TabZeiterfassung':
    IDArbeiterDatumKommtGehtArbeitszeitMin_Ruhe_bisZeitIntervall
    5Meier11.09.200909:0016:30 12.09.2009 02:30 
    6Schulz11.09.200912:4519:30 12.09.2009 05:30 
    7Meier12.09.200904:0014:00 13.09.2009 00:0011,500
    8Meier13.09.200905:0015:00  15,000
    9Schulz12.09.200907:0016:00  11,500

    1) Folgendes VBA-Programm 'TabZeiterfassung_Intervalle()' geht von der Existenz der beiden vorigen Tabellen aus (am besten in ein allgem. Codemodul speichern):
    1a) Es gibt eine Tabelle 'TabArbeiter', in der alle Arbeiter enthalten sind im Feld 'FamName'
    1b) Es gibt eine Tabelle 'TabZeiterfassung', mit vorgenannten Feldern; insbesondere darf das Feld 'Arbeiter' nur solche Namen enthalten, die auch in der Tabelle 'TabArbeiter' im Feld 'FamName' vorkommen.

    Code:
    Public Sub TabZeiterfassung_Intervalle()
      Dim Db As Database
      Dim RstZeit As DAO.Recordset
      Dim Ankunft1 As Date, Ankunft2 As Date
      Dim ArbEnde1 As Date, ArbEnde2 As Date
      Dim Abfrage As String, Intervall As Double
      Dim ErsterSatz As Boolean, AktArbeiter As String
      
      'Erstellen der aktuellen Abfrage auf die Tabellen TabArbeiter und TabZeiterfassung,
      'wobei diese beiden Tabellen über ihre Felder FamName und Arbeiter verknüpft sind.
      'Die Abfrage wird sortiert nach den Feldern FamName, Datum, Kommt:
      Abfrage = _
          "SELECT   Z.ID, A.FamName, Z.Datum, Z.Kommt, " & _
          "         Z.Geht, Z.Arbeitszeit, Z.Min_Ruhe_bis, Z.ZeitIntervall " & _
          "FROM     TabArbeiter AS A INNER JOIN TabZeiterfassung AS Z ON A.FamName = Z.Arbeiter " & _
          "ORDER BY A.FamName, Z.Datum, Z.Kommt;"
      'Die Abfrage wird ausgeführt und ein Recordset RstZeit erstellt
      Set Db = CurrentDb
      Set RstZeit = Db.OpenRecordset(Name:=Abfrage, Type:=dbOpenDynaset, Options:=dbConsistent, LockEdit:=dbOptimistic)
    
      Ankunft1 = 0: Ankunft2 = 0: ErsterSatz = True: AktArbeiter = ""
      ArbEnde1 = 0: ArbEnde2 = 0
      
      With RstZeit
          'Hole den 1. Satz
          .MoveFirst
          'Überprüfe, ob überhaupt noch ein Satz gelesen wurde;
          'falls nicht: beende die Schleife
          Do Until .EOF
            'Überprüfen, ob ein neuer Arbeiter vorliegt
            ErsterSatz = AktArbeiter <> !FamName
            If ErsterSatz Then
              'Aktualisieren des Namens des neuen Arbeiters
              AktArbeiter = !FamName
              'Feld Datum enthält nur ein Datum, Feld Kommt enthält nur eine Uhrzeit
              'Die Summe beider ergibt genauen Ankunfszeitpunkt:
              Ankunft1 = !Datum + !Kommt
              ArbEnde1 = !Datum + !Geht
              'Ausgabe der 1.Ankunft des Arbeiters in den Direktbereich:
              Debug.Print !FamName, !Datum, !Kommt, !Geht
              'Überschrift ausgeben in den Direktbereich:
              Debug.Print "Arbeiter", "Datum", "Begin", "Ende", "Zeit seit letztem Arbeitsende"
              '1.Satz-Modus ist vorbei:
              ErsterSatz = False
            Else
              'Feld Datum enthält nur ein Datum, Feld Kommt enthält nur eine Uhrzeit
              'Die Summe beider ergibt genauen Ankunfszeitpunkt:
              Ankunft2 = !Datum + !Kommt
              ArbEnde2 = !Datum + !Geht
              Intervall = (Ankunft2 - ArbEnde1) * 24
              'Ausgabe des Arbeiters, des akt. Datums, der Differenz zum letzten Arbeitsende
              'in den Direktbereich:
              Debug.Print !FamName, !Datum, !Kommt, !Geht, Format(Intervall, "##0.0000") & " Stunden"
              'Felder der aktuellen Abfrage können geändert werden:
              .Edit
                 'Abfragefeld ZeitIntervall wird geändert
                 !ZeitIntervall = Intervall
              'Änderung des Abfragefeldes (=ZeitIntervall) wird wirksam
              .Update
              'Umspeichern um Anfangszeitpunkt für nächsten Satz zu haben:
              Ankunft1 = Ankunft2
              ArbEnde1 = ArbEnde2
            End If
            'Hole nächsten Satz
            .MoveNext
          Loop
          'Es gibt nichts mehr zu lesen: Abfrage schließen!
          .Close
      End With
    End Sub
    Das Programm erstellt aus den beiden Tabellen eine Abfrage und berechnet für 2 zeitlich aufeinanderfolgende Sätze eines jeden Arbeiters die Werte des Feldes 'ZeitIntervall' (Einheit = 1 Stunde), indem es im aktuellen Satz die beiden Felder 'Datum' und 'Kommt' addiert und davon die beiden Felder 'Datum' und 'Geht' des zeitlich vorausgehenden Satzes dieses Arbeiters subtrahiert.
    Die Aktualisierung des Feldes 'ZeitIntervall' geschieht zwischen den beiden Programmzeilen mit den Methoden '.Edit' und '.Update'.

    Das Programm erzeugt folgende Ausgabe im Direktbereich (eigentlich nur für Demo-Zwecke gedacht):
    Code:
    TabZeiterfassung_Intervalle
    Meier         11.09.2009    09:00:00      16:30:00 
    Arbeiter      Datum         Begin         Ende          Zeit seit letztem Arbeitsende
    Meier         12.09.2009    04:00:00      14:00:00      11,5000 Stunden
    Meier         13.09.2009    05:00:00      15:00:00      15,0000 Stunden
    Schulz        11.09.2009    12:45:00      19:30:00 
    Arbeiter      Datum         Begin         Ende          Zeit seit letztem Arbeitsende
    Schulz        12.09.2009    07:00:00      16:00:00      11,5000 Stunden
    Der Direktbereich ist ein Fenster im VBA-Editor. Falls dieses Fenster bei Dir nicht angezeigt wird, kannst Du es mit der Tastenkombination Strg+G einblenden. Dorthin gibt das Programm alle Programmzeilen aus, die mit 'Debug.Print ...' beginnen.
    Da ich diese Programmzeilen nur zu Demo- bzw. Testzwecken eingebaut habe, kann man sie auch wieder entfernen, ohne die Funktion des Programms zu beeinträchtigen.
    Genau diese Abfrage wird auch in vorgenannten VBA-Programm erstellt (allerdings als SQL-Abfrage); allerdings existiert sie nur während der Programmausführung.
    Um eine solche beständige Abfrage mit einem Namen in der Datenbank zu speichern, musst Du in der Multifunktionsleiste im Tabulator 'Erstellen', Gruppe 'Andere' auf den Button 'Abfrageentwurf' klicken. Dort dann die beiden Tabellen 'TabArbeiter' und 'TabZeiterfassung' auswählen; dann eine Verknüpfung zwischen dem Feld 'FamName' von TabArbeiter und dem Feld 'Arbeiter' von TabZeiterfassung herstellen. Daraufhin kannst Du in der Feldabfrageliste die von Dir gewünschten Tabellenfelder aus den beiden Tabellen auswählen; ferner kannst Du angeben, in welcher Abfolge welche Felder sortiert werden sollen. Das Ganze kannst Du dann unter einem Namen abspeichern und hinterher beliebig oft als Abfrage ausführen - aber wie gesagt, das gehört ohnehin zum elementaren Handwerkszeug von ACCESS (siehe ACCESS-Hilfe oder Einführungskurse, etc.)
     
    Zuletzt von einem Moderator bearbeitet: 30. November 2020
    Exl121150, 6. Dezember 2009
    #4
  5. Schlauchi Erfahrener User
    Hallo Exl121150,

    danke erst mal für diese Ausführliche Beschreibung. Hab nun erst mal das ganze mit deinem Feldbezeichnungen nachgebaut - damit funktioniert auch alles wunderbar.

    Hab aber erst mal grübeln müssen, warum in der oberen Tabelle schon was im "ZeitIntervall" drinnen stand... das ist natürlich erst da, nachdem man das Modul ausgelöst hat - nur so als Hinweis für andere.

    So - wie rufe ich nun dieses Modul auf? Als ich möchte sobald ein User seine "Tageszeiten" eingegeben hat - sofort den Datensatz im Hintergrund aktualisieren. Hab mir schon eine Abfrage gebaut - die eben nur diesen User wiedergibt.

    Manuell kann ich wunderbar nun in VBA das Modul auslösen - wenn ich das aber im Formular versuche - bekomme ich einen Fehler:

    Fehler beim Kompilieren:
    Variable oder Prozedur anstelle eines Moduls erwartet

    Hab das im Formular wie folgt aufgerufen:
    Private Sub Befehl109_Click()
    Call TabZeiterfassung_Intervalle
    End Sub


    Mit der Hilfe bin ich auch nicht schlauer geworden.. hab versucht das schon als Funktion zu deklarieren - geht aber auch nicht.

    Habs nun als VBA Code einfach in den Private Sub eingebaut - das funktioniert ohne Probleme.

    Danke nochmals für deine Zeit - bin wieder etwas Schlauer geworden :-)

    Schlauchi
     
    Schlauchi, 6. Dezember 2009
    #5
  6. Exl121150 Erfahrener User
    Hallo,

    Hast Du etwa das Modul selbst 'TabZeiterfassung_Intervalle' genannt?
    Bitte für den Modulnamen unbedingt etwas anderes wählen zB. 'Modul_TabZeiterfassung' oder so etwas Ähnliches.
    Access findet den Namen der Prozedur anhand ihres Namens und der steht in der 1. Zeile der Sub und heißt 'TabZeiterfassung_Intervalle'. Da vor dem Wort 'Sub' in derselben Zeile das Wort 'Public' und nicht 'Private' steht, weiß Access auch von außerhalb des Moduls, wo die 'Sub TabZeiterfassung_Intervalle' steht.

    Benennst Du jedoch das Modul selbst auch so, ergibt das einen Namenskonflikt. Da nach dem Wort 'Call' unbedingt ein Function- oder Sub-Name stehen muss und nicht etwa ein Modul-Name, ist klar, wie es zu dieser Fehlermeldung kam.

    Am Aufruf der Sub mithilfe des 'Call...' ist nichts auszusetzen, der ist bestens.

    (Anmerkung: Dagegen steht vor Deinem 'Sub Befehl109_Click' ein 'Private', weil diese Sub Bestandteil eines Formularobjektes ist und niemand soll von außerhalb dieses Objektes auf diese Sub zugreifen können. Das soll nur Dein Button können und der befindet sich ohnehin innerhalb des Objektes).
     
    Exl121150, 6. Dezember 2009
    #6
  7. Schlauchi Erfahrener User
    Danke

    Name geändert.. und es läuft :-)
     
    Schlauchi, 6. Dezember 2009
    #7
Thema:

Zeiten zwischen zwei/mehrern Datensätzen kalkulieren

Die Seite wird geladen...
  1. Zeiten zwischen zwei/mehrern Datensätzen kalkulieren - Similar Threads - Zeiten mehrern Datensätzen

  2. Zeit an dem mehrere Arbeitsplätze belegt sind

    in Microsoft Excel Hilfe
    Zeit an dem mehrere Arbeitsplätze belegt sind: Guten Tag Da ich leider nicht sehr viel Erfahrung mit Excel habe, suche ich hier Hilfe, ob mir jemand bei meinem Problem helfen kann. Ich soll berechnen an wie vielen Tagen, Stunden und Minuten,...
  3. Zeit Berechnung mit mehreren kriterien (Datum/Uhrzeit)

    in Microsoft Excel Hilfe
    Zeit Berechnung mit mehreren kriterien (Datum/Uhrzeit): Hallo zusammen, leider weiss ich nicht wie ich die Start- und Endzeit von "Datum und Uhrzeit" mit mehreren kriterienin über Summewenns einbauen kann. Hab hier im Forum nach einer Lösung geschaut...
  4. Autozeit Formel

    in Microsoft Excel Hilfe
    Autozeit Formel: Hallo, ich bin jetzt schon Tage auf der Suche wenn ich etwas in B4-B11 schreibe soll in B2 die Zeit erscheinen, in anderen Tabellen habe ich das per Makro gelöst, doch auf Tablet und Handy Android...
  5. Uhrzeit subtrahieren bei mehr als 24h

    in Microsoft Excel Hilfe
    Uhrzeit subtrahieren bei mehr als 24h: Hallo, ich habe folgendes Problem: Zelle A1 = 11.10.2023 07:54 Zelle A2 = 12.10.2023 07:59 Wie berechne ich die Differenz (A3) ? Wie viele Minuten sind das? Habe es auch schon über die...
  6. Verbringen Sie weniger Zeit mit dem Sammeln von Daten und mehr Zeit mit der Analyse

    in Microsoft Excel Tutorials
    Verbringen Sie weniger Zeit mit dem Sammeln von Daten und mehr Zeit mit der Analyse: Verbringen Sie weniger Zeit mit dem Sammeln von Daten und mehr Zeit mit der Analyse Excel für Microsoft 365 Excel 2019 Power BI Microsoft Teams Mehr......
  7. Zeit werte aus mehreren Zellen In eine Zelle schreiben.

    in Microsoft Excel Hilfe
    Zeit werte aus mehreren Zellen In eine Zelle schreiben.: Hallo Leute *Smilie Ich hab wieder ein Problem, ich hoffe ihr könnt mir helfen. Und zwar ich hab Ursprünglich Ausgewählte Einträge aus Tab2 in Tab1 übertragen. Diese zwei Listen waren...
  8. Outlook 2013: IMAP-Nachrichten werden seit geraumer Zeit nicht mehr angezeigt.

    in Microsoft Outlook Hilfe
    Outlook 2013: IMAP-Nachrichten werden seit geraumer Zeit nicht mehr angezeigt.: Hallo liebe Office-Mitstreiter, ich habe folgende Aufgabenstellung: in Outlook 2013 habe ich 4 IMAP-Konten, offensichtlich werden alle Mails noch abgeholt und das versenden funktioniert...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden