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