Zeit ist Geld – Zeiterfassung mit Access

Autor: Christoph Spielmann, Düsseldorf

Die Erfassung von Arbeitszeiten einzelner Mitarbeiter eines Unternehmens spielt zur Kontrolle und zur Motivation eines Teams eine wichtige Rolle. Oft werden Arbeitszeiten über ein entsprechendes Gerät mit Hilfe von Codekarten erfasst. Solche Zeiterfassungsgeräte sind üblicherweise im Eingangsbereich untergebracht, sodass jeder Mitarbeiter beim Betreten oder Verlassen des Gebäudes seine Zeiterfassung starten bzw. beenden kann. Die hier vorgestellte Lösung zeigt Ihnen, wie Sie solche Zeiten ohne den Kauf eines teuren Zeiterfassungsgeräts alleine mit Hilfe Ihres PCs realisieren können.

Voraussetzung für die hier vorgestellte Lösung ist, dass jeder Mitarbeiter einen eigenen PC besitzt und diese PCs miteinander vernetzt sind. Vorteilhaft ist es außerdem, wenn sich die Benutzer am Betriebssystem über einen Benutzernamen und ein Passwort anmelden können. So ist dem Betriebssystem und damit auch der Software stets bekannt, welcher Benutzer mit dem Zeiterfassungssystem arbeitet.

Die Datenstruktur der Zeiterfassung besteht aus den drei Tabellen tblMitarbeiter, tblZeit- eintragsarten und tblZeiteinträge. Die Tabellen sind wie in Tab. 1, Tab. 2 und Tab. 3 aufgebaut.

Die Tabelle tblMitarbeiter speichert die Namen sowie die Anmeldenamen der einzelnen Benutzer der Zeiterfassung. Verknüpft ist die Mitarbeitertabelle mit der Tabelle tblZeit-einträge, in denen die einzelnen Zeitblöcke mit Start- und Enddatum bzw. -zeit festgehalten werden.

MitarbeiterID

Zahl (Feldgröße Replikations-ID)

Mitarbeitername

Text (Feldgröße 100)

Anmeldename

Text (Feldgröße 255)

Feldname

Felddatentyp

Tab. 1: Die Tabelle tblMitarbeiter

Feldname

Felddatentyp

ZeiteintragsID

Zahl (Feldgröße Replikations-ID)

ZeiteintragsartID

Zahl (Feldgröße Replikations-ID)

MitarbeiterID

Text (Feldgröße Replikations-ID)

Start

Datum/Uhrzeit

Ende

Datum/Uhrzeit

Bemerkung

Text (Feldgröße 255)

Tab. 2: Die Tabelle tblZeiteinträge

Feldname

Felddatentyp

ZeiteintragsartID

Zahl (Feldgröße Replikations-ID)

Zeiteintragsart

Text (Feldgröße 100)

Tab. 3: Die Tabelle tblZeiteintragsarten

Um die Einträge klassifizieren zu können, ist die Zeiteintragstabelle mit der Tabelle tblZeit-eintragsarten verknüpft. Hier sind beispielsweise Einträge wie Arbeit vor Ort beim Kunden, Wochenendarbeit oder Urlaub enthalten. Dies ermöglicht Ihnen das manuelle Eintragen von Zeitblöcken, die nicht über die automatische Zeiterfassung erfasst werden können.

Als Primär- und Fremdschlüssel kommen in allen Tabellen GUIDs zum Einsatz, die unter Access auch als Replikations-IDs bezeichnet werden.

Hinweis

Eine genaue Beschreibung über den Sinn und Zweck von GUIDs finden Sie in dem Beitrag Die Geheimnisse der GUID, den Sie ebenfalls in dieser Ergänzungslieferung finden.

Die Erfassung von Zeiteinträgen sollte für den Benutzer möglichst einfach sein. Ideal ist ein Formular mit einer Start- und einer Stop-Schaltfläche, die die Zeiterfassung jeweils startet oder beendet. Zur Anlage des Formulars gehen Sie wie folgt vor:

  • Legen Sie eine neue Datenbank mit dem Namen Zeiterfassung.mdb an.
  • Erfassen Sie die oben angegebenen Tabellen und verknüpfen Sie diese gemäß Bild 1. Aktivieren Sie auch die referentielle Integrität.
  • Erstellen Sie ein neues Formular und platzieren Sie hier zwei neue Schaltflächen mit den Namen btnStart und btnStopp.
  • Beschriften Sie die Schaltflächen entsprechend mit Start und Stopp.
  • Stellen Sie die in Tab. 4 angegebenen Eigenschaften des Formulars wie aufgeführt ein.
  • Speichern Sie das Formular unter dem Namen frmZeiterfassung.
  • Bildlaufleisten

    Nein

    Datensatzmarkierer

    Nein

    Navigationsschaltflächen

    Nein

    Rahmenart

    Dialog

    Beschriftung

    Zeiterfassung

    Eigenschaft

    Wert

    Tab. 4: Eigenschaften des Formulars frmZeiterfassung

    Speichern von Einträgen

    Um die Aufnahme von Zeiteinträgen möglichst wenig anfällig für Abstürze des Rechners zu machen, setzt die Zeiterfassung folgende Vorgehensweise zur Erfassung der Einträge ein: Zu Beginn der Arbeit wird in der Tabelle tblZeiteinträge ein neuer Datensatz angelegt, bei dem zunächst nur das Start-Feld gefüllt ist. Das Ende-Feld behält also den Wert Null. Erst wenn die Arbeit beendet ist, wird die Ende-Zeit eingetragen. Sollte der PC des Benutzers also zwischenzeitlich neu gestartet werden, ist die Zeiterfassung hiervon nicht betroffen.

    Den Start der Zeiterfassung erledigt eine VBA-Ereignisprozedur, die mit der Schaltfläche btnStart verknüpft ist. Legen Sie diese Prozedur wie folgt an:

    Private Sub btnStart_Click()
        Dim rstData As New Recordset
        With rstData
            .ActiveConnection = CurrentProject.Connection
            .CursorType = adOpenDynamic
            .CursorLocation = adUseClient
            .LockType = adLockOptimistic
            .Source = "tblZeiteinträge"
            .MaxRecords = 1
            .Open
            .AddNew
                !ZeiteintragID = CreateGUID()
                !MitarbeiterID = GetMitarbeiterID()
                ''GUID zur Zeiteintragsart ''Arbeit im Büro''
                !ZeiteintragsartID = _
                    "{18903C6D-C737-4824-9688-346E07A12CBB}"
                !Start = Now
            .Update
        End With
  • Wählen Sie über das Kontextmenü der Schaltfläche btnStart den Befehl Ereignis aus.
  • Klicken Sie im nachfolgenden Fenster doppelt auf den Eintrag Code-Generator.
  • Geben Sie den nachfolgenden Programmcode aus Quellcode 1 ein.
  • Die Prozedur öffnet zunächst ein neues ADO-Recordset auf Basis der Tabelle tblZeiteinträge. Da nur Datensätze hinzugefügt werden sollen, wird die Anzahl der zu ladenden Datensätze auf 1 begrenzt (MaxRecords-Eigenschaft).

    Dies erhöht die Performance beim Einsatz der Software im Netzwerk. Alternativ können Sie die Datensatzanzahl auch durch die SQL-Anweisung

    SELECT * FROM tblZeiteinträgeWHERE False

    begrenzen. Diese Abfrage liefert keine Datensätze zurück, eignet sich also ideal zum Hinzufügen von Datensätzen.

    Nach dem öffnen des Recordsets wird mit Hilfe der AddNew-Methode ein neuer Datensatz angelegt. Direkt danach wird der Primärschlüsselwert vergeben. Da es sich bei dem Feld ZeiteintragID um eine GUID handelt, wird zunächst mit Hilfe der Funktion CreateGUID eine neue GUID erzeugt. Diese Funktion finden Sie im Modul modGUID der Beispieldatenbank.

    Im nächsten Schritt muss die ID des momentan angemeldeten Mitarbeiters ermittelt werden. Diese Aufgabe erledigt die Prozedur GetMitarbeiterID. Diese Prozedur ist in dem Modul modTools untergebracht. Den Aufbau der Prozedur können Sie Quellcode 2 entnehmen.

    Die Prozedur prüft, ob der momentan angemeldete Benutzer in der Tabelle tblMitarbeiter vorhanden ist. Sollte dies nicht der Fall sein, fügt sie den Benutzer automatisch hinzu. Als Ergebnis liefert die Funktion die GUID des angemeldeten Benutzers zurück.

    Public Function GetMitarbeiterID() As String
        Dim rstData As New Recordset
        Dim MitarbeiterID As String
        Dim SQL As String
        SQL = "SELECT * FROm tblMitarbeiter"
        SQL = SQL & " WHERE Anmeldename = ''"
        SQL = SQL & GetLogonUserName() & "''"
        With rstData
            .ActiveConnection = CurrentProject.Connection
            .LockType = adLockOptimistic
            .CursorLocation = adUseClient
            .CursorType = adOpenDynamic
            .Source = SQL
            .Open
            If .RecordCount = 0 Then
                MitarbeiterID = CreateGUID()
                .AddNew
                    !MitarbeiterID = MitarbeiterID
                    !AnmeldeName = GetLogonUserName()
                    !Mitarbeitername = !AnmeldeName
                .Update
            Else
                MitarbeiterID = !MitarbeiterID
            End If
        End With
        GetMitarbeiterID = MitarbeiterID

    Quellcode 2

    Anmeldenamen aus dem Betriebssystem ermitteln

    Wie bereits zu Beginn dieses Beitrags erwähnt, liest die Software den Namen des angemeldeten Benutzers aus dem Betriebssystem aus. Sie bewerkstelligt dies mit Hilfe der Funktion GetLogonUserName, die wiederum eine API-Funk-tion namens WNetGetUser verwendet.

    Den Aufbau der Funktion finden Sie im Modul modTools der Beispieldatenbank zu diesem Beitrag.

    Eine Alternative zum Einsatz der API-Funktion besteht in der Funktion Environ, die fest in Access eingebaut ist. Diese Funktion liefert den Wert von Umgebungsvariablen zurück, die unter Ihrem Betriebssystem deklariert sind. Der Ausdruck

    Environ("USERNAME")

    liefert beispielsweise ebenfalls den Namen des momentan angemeldeten Benutzers zurück. Eine Einschränkung hierbei ist jedoch, dass die Systemvariable Username nicht unter allen Windows-Betriebssystemen unterstützt wird.

    Sicherheit verschaffen Sie sich, indem Sie die DOS-Eingabeaufforderung öffnen, hier den Befehl SET eingeben und mit der Return-Taste bestätigen. Sie erhalten dadurch eine Auflistung aller Variablen sowie deren aktuelle Werte (siehe Bild 2).

    Unter Windows NT bzw. Windows 2000 finden Sie neben dem Benutzernamen noch weitere interessante Informationen wie beispielsweise den Domänennamen, den Pfad des Programmverzeichnisses oder das Temp-Verzeichnis.

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar