Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2001.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

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.

Aufbau der Datenstruktur

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. (

Erfassung von Zeiteinträgen

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äß Abb. 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äge
    WHERE 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.

    Ermitteln der MitarbeiterID

    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 (s. Abb. 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. (

    Benutzername ohne Anmeldung

    Sofern sowohl die API-Funktion als auch die Environ-Funktion auf Ihrem PC fehlschlagen, bleibt Ihnen zur Identifikation des Benutzers nur die Erstellung eines Anmeldedialoges, in dem der Benutzer seinen Namen und ggf. ein Kennwort eingibt.

    Vervollständigen des
    Zeiteintrags

    Nachdem Sie für den neuen Zeiteintrag den Benutzernamen in Erfahrung gebracht haben, fehlt schließlich noch die Angabe der Startzeit

    !Start = Now

    sowie der Zeiteintragsart. Letztere ist in der Ereignisprozedur der Start-Schaltfläche fest im Programmcode hinterlegt:

    !ZeiteintragsartID = "{18903C6D-C737-4824-9688-346E07A12CBB}"

    Damit dies funktioniert, muss die Tabelle tblZeiteintragsarten einen entsprechenden Datensatz enthalten (s. Abb. 3). Hierzu gehen Sie wie folgt vor:

  • Öffnen Sie die Tabelle tblZeiteintragsarten aus dem Datenbankfenster heraus.
  • Legen Sie einen neuen Datensatz an.
  • Geben Sie als Zeiteintragsart-ID die GUID inklusive geschweifter Klammern ein: {18903C6D-C737-4824-9688-346E07A12CBB}
  • Geben Sie unter Zeiteintragsart den Text Arbeit im Büro ein.
  • Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.