{"id":55000032,"date":"2001-10-01T00:00:00","date_gmt":"2021-02-10T18:44:04","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=32"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Zeit_ist_Geld__Zeiterfassung_mit_Access","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/","title":{"rendered":"Zeit ist Geld &#8211; Zeiterfassung mit Access"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/3099dc03d1a14b149806a4604599f164\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Autor: Christoph Spielmann, D&uuml;sseldorf<\/p>\n<p><\/b><\/p>\n<p><b>Die Erfassung von Arbeitszeiten einzelner Mitarbeiter eines Unternehmens spielt zur Kontrolle und zur Motivation eines Teams eine wichtige Rolle. Oft werden Arbeitszeiten &uuml;ber ein entsprechendes Ger&auml;t mit Hilfe von Codekarten erfasst. Solche Zeiterfassungsger&auml;te sind &uuml;blicherweise im Eingangsbereich untergebracht, sodass jeder Mitarbeiter beim Betreten oder Verlassen des Geb&auml;udes seine Zeiterfassung starten bzw. beenden kann. Die hier vorgestellte L&ouml;sung zeigt Ihnen, wie Sie solche Zeiten ohne den Kauf eines teuren Zeiterfassungsger&auml;ts alleine mit Hilfe Ihres PCs realisieren k&ouml;nnen.<\/b><\/p>\n<p>Voraussetzung f&uuml;r die hier vorgestellte L&ouml;sung ist, dass jeder Mitarbeiter einen eigenen PC besitzt und diese PCs miteinander vernetzt sind. Vorteilhaft ist es au&szlig;erdem, wenn sich die Benutzer am Betriebssystem &uuml;ber einen Benutzernamen und ein Passwort anmelden k&ouml;nnen. So ist dem Betriebssystem und damit auch der Software stets bekannt, welcher Benutzer mit dem Zeiterfassungssystem arbeitet.<\/p>\n<p>Die Datenstruktur der Zeiterfassung besteht aus den drei Tabellen tblMitarbeiter, tblZeit- eintragsarten und tblZeiteintr&auml;ge. Die Tabellen sind wie in Tab. 1, Tab. 2 und Tab. 3 aufgebaut.<\/p>\n<p>Die Tabelle tblMitarbeiter speichert die Namen sowie die Anmeldenamen der einzelnen Benutzer der Zeiterfassung. Verkn&uuml;pft ist die Mitarbeitertabelle mit der Tabelle tblZeit-eintr&auml;ge, in denen die einzelnen Zeitbl&ouml;cke  mit Start- und Enddatum bzw. -zeit festgehalten werden.<\/p>\n<\/p>\n<table border=1>\n<tr>\n<td>\n<p><b>Feldname<\/b><\/p>\n<\/td>\n<td>\n<p><b>Felddatentyp<\/b><\/p>\n<\/td>\n<\/tr>\n<p>MitarbeiterID<\/p>\n<p>Zahl (Feldgr&ouml;&szlig;e Replikations-ID)<\/p>\n<p>Mitarbeitername<\/p>\n<p>Text (Feldgr&ouml;&szlig;e 100)<\/p>\n<p>Anmeldename<\/p>\n<p>Text (Feldgr&ouml;&szlig;e 255)<\/p>\n<\/table>\n<p><b>Tab. 1: Die Tabelle tblMitarbeiter<\/b><\/p>\n<p>Feldname<\/p>\n<p>Felddatentyp<\/p>\n<p>ZeiteintragsID<\/p>\n<p>Zahl (Feldgr&ouml;&szlig;e Replikations-ID)<\/p>\n<p>ZeiteintragsartID<\/p>\n<p>Zahl (Feldgr&ouml;&szlig;e Replikations-ID)<\/p>\n<p>MitarbeiterID<\/p>\n<p>Text (Feldgr&ouml;&szlig;e Replikations-ID)<\/p>\n<p>Start<\/p>\n<p>Datum\/Uhrzeit<\/p>\n<p>Ende<\/p>\n<p>Datum\/Uhrzeit<\/p>\n<p>Bemerkung<\/p>\n<p>Text (Feldgr&ouml;&szlig;e 255)<\/p>\n<\/table>\n<p><b>Tab. 2: Die Tabelle tblZeiteintr&auml;ge<\/b><\/p>\n<p>Feldname<\/p>\n<p>Felddatentyp<\/p>\n<p>ZeiteintragsartID<\/p>\n<p>Zahl (Feldgr&ouml;&szlig;e Replikations-ID)<\/p>\n<p>Zeiteintragsart<\/p>\n<p>Text (Feldgr&ouml;&szlig;e 100)<\/p>\n<table border=1>\n<tr>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<\/table>\n<p><b>Tab. 3: Die Tabelle tblZeiteintragsarten<\/b><\/p>\n<p>Um die Eintr&auml;ge klassifizieren zu k&ouml;nnen, ist die Zeiteintragstabelle mit der Tabelle tblZeit-eintragsarten verkn&uuml;pft. Hier sind beispielsweise Eintr&auml;ge wie Arbeit vor Ort beim Kunden, Wochenendarbeit oder Urlaub enthalten. Dies erm&ouml;glicht Ihnen das manuelle Eintragen von Zeitbl&ouml;cken, die nicht &uuml;ber die automatische Zeiterfassung erfasst werden k&ouml;nnen.<\/p>\n<p><IMG height=\"309\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic001.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p>Als Prim&auml;r- und Fremdschl&uuml;ssel kommen in allen Tabellen GUIDs zum Einsatz, die unter Access auch als Replikations-IDs bezeichnet werden.<\/p>\n<h3>Hinweis<\/h3>\n<p>Eine genaue Beschreibung &uuml;ber den Sinn und Zweck von GUIDs finden Sie in dem Beitrag Die Geheimnisse der GUID, den Sie ebenfalls in dieser Erg&auml;nzungslieferung finden. <\/p>\n<p>Die Erfassung von Zeiteintr&auml;gen sollte f&uuml;r den Benutzer m&ouml;glichst einfach sein. Ideal ist ein Formular mit einer Start- und einer Stop-Schaltfl&auml;che, die die Zeiterfassung jeweils startet oder beendet. Zur Anlage des Formulars gehen Sie wie folgt vor:<\/p>\n<li>Legen Sie eine neue Datenbank mit dem Namen Zeiterfassung.mdb an.<\/li>\n<li>Erfassen Sie die oben angegebenen Tabellen und verkn&uuml;pfen Sie diese gem&auml;&szlig; Bild 1. Aktivieren Sie auch die referentielle Integrit&auml;t.<\/li>\n<li>Erstellen Sie ein neues Formular und platzieren Sie hier zwei neue Schaltfl&auml;chen mit den Namen btnStart und btnStopp.<\/li>\n<li>Beschriften Sie die Schaltfl&auml;chen entsprechend mit Start und Stopp.<\/li>\n<li>Stellen Sie die in Tab. 4 angegebenen Eigenschaften des Formulars wie aufgef&uuml;hrt ein.<\/li>\n<li>Speichern Sie das Formular unter dem Namen frmZeiterfassung.<\/li>\n<table border=1>\n<tr>\n<td>\n<p><b>Eigenschaft<\/b><\/p>\n<\/td>\n<td>\n<p><b>Wert<\/b><\/p>\n<\/td>\n<\/tr>\n<p>Bildlaufleisten<\/p>\n<p>Nein<\/p>\n<p>Datensatzmarkierer<\/p>\n<p>Nein<\/p>\n<p>Navigationsschaltfl&auml;chen<\/p>\n<p>Nein<\/p>\n<p>Rahmenart<\/p>\n<p>Dialog<\/p>\n<p>Beschriftung<\/p>\n<p>Zeiterfassung<\/p>\n<\/table>\n<p><b>Tab. 4: Eigenschaften des Formulars frmZeiterfassung<\/b><\/p>\n<h3>Speichern von Eintr&auml;gen<\/h3>\n<p>Um die Aufnahme von Zeiteintr&auml;gen m&ouml;glichst wenig anf&auml;llig f&uuml;r Abst&uuml;rze des Rechners zu machen, setzt die Zeiterfassung folgende Vorgehensweise zur Erfassung der Eintr&auml;ge ein: Zu Beginn der Arbeit wird in der Tabelle tblZeiteintr&auml;ge ein neuer Datensatz angelegt, bei dem zun&auml;chst nur das Start-Feld gef&uuml;llt ist. Das Ende-Feld beh&auml;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.<\/p>\n<p>Den Start der Zeiterfassung erledigt eine VBA-Ereignisprozedur, die mit der Schaltfl&auml;che btnStart verkn&uuml;pft ist. Legen Sie diese Prozedur wie folgt an:<\/p>\n<pre>Private Sub btnStart_Click()\r\n    Dim rstData As New Recordset\r\n    With rstData\r\n        .ActiveConnection = CurrentProject.Connection\r\n        .CursorType = adOpenDynamic\r\n        .CursorLocation = adUseClient\r\n        .LockType = adLockOptimistic\r\n        .Source = \"tblZeiteintr&auml;ge\"\r\n        .MaxRecords = 1\r\n        .Open\r\n        .AddNew\r\n            !ZeiteintragID = CreateGUID()\r\n            !MitarbeiterID = GetMitarbeiterID()\r\n            ''GUID zur Zeiteintragsart ''Arbeit im B&uuml;ro''\r\n            !ZeiteintragsartID = _\r\n                \"{18903C6D-C737-4824-9688-346E07A12CBB}\"\r\n            !Start = Now\r\n        .Update\r\n    End With<\/pre>\n<li>W&auml;hlen Sie &uuml;ber das Kontextmen&uuml; der Schaltfl&auml;che btnStart den Befehl Ereignis aus.<\/li>\n<li>Klicken Sie im nachfolgenden Fenster doppelt auf den Eintrag Code-Generator.<\/li>\n<li>Geben Sie den nachfolgenden Programmcode aus Quellcode 1 ein.<\/li>\n<p>Die Prozedur &ouml;ffnet zun&auml;chst ein neues ADO-Recordset auf Basis der Tabelle tblZeiteintr&auml;ge. Da nur Datens&auml;tze hinzugef&uuml;gt werden sollen, wird die Anzahl der zu ladenden Datens&auml;tze auf 1 begrenzt (MaxRecords-Eigenschaft). <\/p>\n<p>Dies erh&ouml;ht die Performance beim Einsatz der Software im Netzwerk. Alternativ k&ouml;nnen Sie die Datensatzanzahl auch durch die SQL-Anweisung<\/p>\n<pre>SELECT * FROM tblZeiteintr&auml;geWHERE False<\/pre>\n<p>begrenzen. Diese Abfrage liefert keine Datens&auml;tze zur&uuml;ck, eignet sich also ideal zum Hinzuf&uuml;gen von Datens&auml;tzen.<\/p>\n<p>Nach dem &ouml;ffnen des Recordsets wird mit Hilfe der AddNew-Methode ein neuer Datensatz angelegt. Direkt danach wird der Prim&auml;rschl&uuml;sselwert vergeben. Da es sich bei dem Feld ZeiteintragID um eine GUID handelt, wird zun&auml;chst mit Hilfe der Funktion CreateGUID eine neue GUID erzeugt. Diese Funktion finden Sie im Modul modGUID der Beispieldatenbank.<\/p>\n<p>Im n&auml;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&ouml;nnen Sie Quellcode 2 entnehmen.<\/p>\n<p>Die Prozedur pr&uuml;ft, ob der momentan angemeldete Benutzer in der Tabelle tblMitarbeiter vorhanden ist. Sollte dies nicht der Fall sein, f&uuml;gt sie den Benutzer automatisch hinzu. Als Ergebnis liefert die Funktion die GUID des angemeldeten Benutzers zur&uuml;ck.<\/p>\n<pre>Public Function GetMitarbeiterID() As String\r\n    Dim rstData As New Recordset\r\n    Dim MitarbeiterID As String\r\n    Dim SQL As String\r\n    SQL = \"SELECT * FROm tblMitarbeiter\"\r\n    SQL = SQL & \" WHERE Anmeldename = ''\"\r\n    SQL = SQL & GetLogonUserName() & \"''\"\r\n    With rstData\r\n        .ActiveConnection = CurrentProject.Connection\r\n        .LockType = adLockOptimistic\r\n        .CursorLocation = adUseClient\r\n        .CursorType = adOpenDynamic\r\n        .Source = SQL\r\n        .Open\r\n        If .RecordCount = 0 Then\r\n            MitarbeiterID = CreateGUID()\r\n            .AddNew\r\n                !MitarbeiterID = MitarbeiterID\r\n                !AnmeldeName = GetLogonUserName()\r\n                !Mitarbeitername = !AnmeldeName\r\n            .Update\r\n        Else\r\n            MitarbeiterID = !MitarbeiterID\r\n        End If\r\n    End With\r\n    GetMitarbeiterID = MitarbeiterID<\/pre>\n<p><IMG height=\"400\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic002.png\" width=\"500\" border=\"0\"><\/p>\n<p><b>Quellcode 2<\/b><\/p>\n<p><IMG height=\"155\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic003.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<h3>Anmeldenamen aus dem Betriebssystem ermitteln<\/h3>\n<p>Wie bereits zu Beginn dieses Beitrags erw&auml;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.<\/p>\n<p>Den Aufbau der Funktion finden Sie im Modul modTools der Beispieldatenbank zu diesem Beitrag.<\/p>\n<p>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&uuml;ck, die unter Ihrem Betriebssystem deklariert sind. Der Ausdruck<\/p>\n<pre>Environ(\"USERNAME\")<\/pre>\n<p>liefert beispielsweise ebenfalls den Namen des momentan angemeldeten Benutzers zur&uuml;ck. Eine Einschr&auml;nkung hierbei ist jedoch, dass die Systemvariable Username nicht unter allen Windows-Betriebssystemen unterst&uuml;tzt wird.<\/p>\n<p>Sicherheit verschaffen Sie sich, indem Sie die DOS-Eingabeaufforderung &ouml;ffnen, hier den Befehl SET eingeben und mit der Return-Taste best&auml;tigen. Sie erhalten dadurch eine Auflistung aller Variablen sowie deren aktuelle Werte (siehe Bild 2).<\/p>\n<p>Unter Windows NT bzw. Windows 2000 finden Sie neben dem Benutzernamen noch weitere interessante Informationen wie beispielsweise den Dom&auml;nennamen, den Pfad des Programmverzeichnisses oder das Temp-Verzeichnis. <\/p>\n<p><IMG height=\"302\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic004.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><IMG height=\"344\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic005.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<h3>Benutzername ohne Anmeldung<\/h3>\n<p>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.<\/p>\n<p>Nachdem Sie f&uuml;r den neuen Zeiteintrag den Benutzernamen in Erfahrung gebracht haben, fehlt schlie&szlig;lich noch die Angabe der Startzeit<\/p>\n<pre>!Start = Now<\/pre>\n<p>sowie der Zeiteintragsart. Letztere ist in der Ereignisprozedur der Start-Schaltfl&auml;che fest im Programmcode hinterlegt:<\/p>\n<pre>!ZeiteintragsartID = \"{18903C6D-C737-4824-9688-346E07A12CBB}\"<\/pre>\n<p>Damit dies funktioniert, muss die Tabelle tblZeiteintragsarten einen entsprechenden Datensatz enthalten (siehe Bild 3). Hierzu gehen Sie wie folgt vor:<\/p>\n<li>&ouml;ffnen Sie die Tabelle tblZeiteintragsarten aus dem Datenbankfenster heraus.<\/li>\n<li>Legen Sie einen neuen Datensatz an.<\/li>\n<li>Geben Sie als Zeiteintragsart-ID die GUID inklusive geschweifter Klammern ein: {18903C6D-C737-4824-9688-346E07A12CBB}<\/li>\n<li>Geben Sie unter Zeiteintragsart den Text Arbeit im B&uuml;ro ein.<\/li>\n<h3>Hinweis<\/h3>\n<p><!--30percent--><\/p>\n<p>Die Erfassung weiterer Zeiteintragsarten ge-staltet sich schwierig, da f&uuml;r neue Datens&auml;tze immer auch eine neue GUID eingetippt werden muss. Zur L&ouml;sung dieses Problems generieren Sie auf Basis der Tabelle tblZeit-eintragsarten ein Standardformular und tragen f&uuml;r die Standardwert-Eigenschaft des Zeiteintragsart-Steuerelements den Ausdruck =CreateGUID() ein.<\/p>\n<h3>Hinweis<\/h3>\n<p>Ein entsprechendes Formular finden Sie in der Beispieldatenbank unter dem Namen frmZeiteintragsarten (siehe Bild 4) <\/p>\n<pre>Function L&auml;uftZeiterfassung() As Boolean\r\n    Dim SQL As String\r\n    Dim rstData As New Recordset\r\n    SQL = \"SELECT Count(*) As Anzahl FROM tblZeiteintr&auml;ge WHERE MitarbeiterID=''\" \r\n    SQL = SQL & GetMitarbeiterID() & \"'' AND Ende IS NULL\"\r\n        With rstData\r\n        .ActiveConnection = CurrentProject.Connection\r\n        .LockType = adLockReadOnly\r\n        .CursorLocation = adUseClient\r\n        .CursorType = adOpenStatic\r\n        .Source = SQL\r\n        .Open\r\n        If !Anzahl = 0 Then\r\n            L&auml;uftZeiterfassung = False\r\n        Else\r\n            L&auml;uftZeiterfassung = True\r\n        End If\r\n    End With\r\nEnd Function\r\nPrivate Sub btnStart_Click()\r\n    Dim rstData As New Recordset\r\n    If ZeiterfassungL&auml;uft() = True Then\r\n        MsgBox \"Die Zeiterfassung l&auml;uft bereits!\", vbInformation\r\n        Exit Sub\r\n    End If\r\n. . . <\/pre>\n<h3>Pr&uuml;fung des aktuellen Status<\/h3>\n<p>Eine wichtige Funktion beim Start der Zeiterfassung fehlt noch: Sofern die Zeiterfassung bereits l&auml;uft, darf durch einen erneuten Klick auf die Start-Schaltfl&auml;che kein neuer Datensatz angelegt werden. Hierzu muss gepr&uuml;ft werden, ob zum aktuellen Benutzer ein Datensatz existiert, dessen Ende-Feld noch den Wert Null hat. Sollte dies der Fall sein, muss eine entsprechende Warnung erscheinen.<\/p>\n<p>Da eine entsprechende Funktion sp&auml;ter noch ein weiteres Mal ben&ouml;tigt wird, bietet sich eine Auslagerung als Function-Prozedur an (s. Quellcode 3).<\/p>\n<p>Die Prozedur z&auml;hlt die Anzahl der Zeiteintr&auml;ge mit offener Ende-Angabe des aktuellen Benutzers. Falls diese gleich 0 ist, l&auml;uft die Zeiterfassung nicht und die Funktion liefert False als Ergebnis.<\/p>\n<p>Diese Funktion kann nun in die Ereignisprozedur der Start-Schaltfl&auml;che integriert werden (s. Quellcode 4).<\/p>\n<p>Nachdem Sie nun die Prozeduren zum Start der Zeiterfassung fertig gestellt haben, folgt die Ereignisprozedur der Stopp-Schaltfl&auml;che. Sie finden ihren Aufbau in Quellcode 5.<\/p>\n<p>Diese Ereignisprozedur setzt das Ende-Feld aller noch offenen Zeiteintr&auml;ge zu dem angemeldeten Benutzer auf die aktuelle Uhrzeit.<\/p>\n<p>Eine wichtige Information f&uuml;r den Benutzer ist eine Anzeige des aktuellen Status seiner Zeiterfassung. Hier&uuml;ber kann er erkennen, ob die Zeiterfassung momentan l&auml;uft oder gestoppt ist.<\/p>\n<pre>Private Sub btnStopp_Click()\r\n    Dim SQL As String\r\n    If ZeiterfassungL&auml;uft() = False Then\r\n        MsgBox \"Die Zeiterfassung l&auml;uft momentan nicht!\", vbInformation\r\n        Exit Sub\r\n    End If\r\n    SQL = \"UPDATE tblZeiteintr&auml;ge SET Ende=Now() WHERE MitarbeiterID=''\"\r\n    SQL = SQL & GetMitarbeiterID & \"'' AND Ende IS NULL\"\r\n    CurrentProject.Connection.Execute SQL<\/pre>\n<p><IMG height=\"270\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic006.png\" width=\"444\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p>Zur Anzeige des Status platzieren Sie auf dem Formular ein Bezeichnungsfeld namens lblStatus (siehe Bild 5).<\/p>\n<pre>Private Sub StatusAktualisieren()\r\n    If L&auml;uftZeiterfassung() = True Then\r\n        With Me.lblStatus\r\n            .Caption = \"Zeiterfassung l&auml;uft\"\r\n            .BackColor = QBColor(12)\r\n        End With\r\n    Else\r\n        With Me.lblStatus\r\n            .Caption = \"Zeiterfassung l&auml;uft nicht\"\r\n            .BackColor = QBColor(10)\r\n        End With\r\n    End If\r\nSELECT TOP 10 tblZeiteintr&auml;ge.ZeiteintragID,\r\ntblZeiteintr&auml;ge.MitarbeiterID,\r\ntblZeiteintragsarten.Zeiteintragsart,\r\ntblZeiteintr&auml;ge.Start, tblZeiteintr&auml;ge.Ende,\r\ntblZeiteintr&auml;ge.Bemerkung\r\nFROM tblZeiteintragsarten\r\nINNER JOIN tblZeiteintr&auml;ge \r\nON tblZeiteintragsarten.ZeiteintragsartID =\r\ntblZeiteintr&auml;ge.ZeiteintragsartID<\/pre>\n<p><IMG height=\"219\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic007.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p>Die Anzeige des Status erledigt die Prozedur aus Quellcode 6, die Sie im Formularmodul anlegen.<\/p>\n<p>Die Prozedur setzt den entsprechenden Text in das Bezeichnungsfeld und &auml;ndert anschlie&szlig;end die Hintergrundfarbe in gr&uuml;n bzw. rot (siehe Bild 6). Damit der Farbwechsel funktioniert, setzen Sie die Eigenschaft Hintergrundart des Bezeichnungsfeldes auf Normal.<\/p>\n<p>Der Aufruf der Prozedur erfolgt an drei Stellen:<\/p>\n<li>Am Ende der Ereignisprozedur der Schaltfl&auml;che btnStart<\/li>\n<li>Am Ende der Ereignisprozedur der Schaltfl&auml;che btnStopp<\/li>\n<li>Beim &ouml;ffnen des Formulars innerhalb des Load-Ereignisses (BeimLaden-Ereigniseigenschaft), wie das folgende Beispiel zeigt:<\/li>\n<pre>Private Sub Form_Load()\r\n    StatusAktualisieren\r\nEnd Sub<\/pre>\n<p>Damit die eingetragenen Zeiteintr&auml;ge nachvollziehbar sind, bietet sich die Anzeige einer Liste an, welche die letzten zehn Zeitbl&ouml;cke anzeigt.<\/p>\n<pre>Private Sub ZeiteintragslisteAktualisieren()\r\n    Me.frmZeiterfassung_Zeiteintr&auml;ge.Form.Filter = \"MitarbeiterID=''\" _ \r\n        & GetMitarbeiterID() & \"''\"\r\n    Me.frmZeiterfassung_Zeiteintr&auml;ge.Form.FilterOn = True<\/pre>\n<p>Hierzu gehen Sie wie folgt vor:<\/p>\n<li>Legen Sie ein neues Formular mit dem Namen frmZeiterfassung_Zeiteintr&auml;ge an.<\/li>\n<li>Stellen Sie die Standardansicht-Eigenschaft des Formulars auf Datenblatt ein.<\/li>\n<li>Geben Sie als Datenherkunft die SQL-Anweisung aus Quellcode 7 ein.<\/li>\n<li>Diese Abfrage ermittelt die letzten zehn Zeiteintr&auml;ge und sortiert diese absteigend nach dem Start-Feld.<\/li>\n<li>&ouml;ffnen Sie die Feldliste mit dem Befehl Ansicht\/Feldliste und ziehen Sie alle Felder bis auf ZeiteintragsartID in das Formular.<\/li>\n<li>Entfernen Sie die Doppelpunkte der einzelnen Bezeichnungsfelder.<\/li>\n<p>Danach schlie&szlig;en Sie das Formular und f&uuml;gen es als Unterformular in das Formular frmZeit-erfassung ein.<\/p>\n<p>Dies erledigen Sie beispielsweise, indem Sie das Formular frmZeiterfassung_Zeiteintr&auml;ge per Drag&#038;Drop aus dem Datenbankfenster in die Entwurfsansicht des Formulars frmZeiterfassung ziehen.<\/p>\n<p>Achten Sie darauf, dass das hierdurch angelegte Unterformular-Steuerelement ebenfalls den Namen frmZeiterfassung_Zeiteintr&auml;ge tr&auml;gt.<\/p>\n<h3>Filtern der Zeiteintr&auml;ge<\/h3>\n<p>Um sicherzustellen, dass in der Liste nur die Zeiteintr&auml;ge zum aktuellen Mitarbeiter aufgelistet werden, muss diese gefiltert werden. Dies erledigt die Prozedur aus Quellcode 8, die Sie im Modul des Formulars frmZeiterfassung an-legen. Die Prozedur filtert die Zeiteintr&auml;ge des Unterformulars nach dem aktuellen Benutzer.<\/p>\n<p>Der Aufruf der Prozedur sollte innerhalb der drei Ereignisprozeduren btnStart_Click, btnStopp_Click und Form_Load direkt nach dem Aufruf der Prozedur StatusAktualisieren erfolgen. Das folgende Beispiel zeigt dies exemplarisch f&uuml;r das Load-Ereignis des Formulars:<\/p>\n<pre>Private Sub Form_Load()\r\n    StatusAktualisieren\r\n    ZeiteintragslisteAktualisieren\r\nEnd Sub<\/pre>\n<p>Beim Einsatz der Zeiterfassung im Netzwerk mit mehreren Mitarbeitern ist die Anzeige des Status der &uuml;brigen Mitarbeiter eine hilfreiche Information. So kann beispielsweise jeder Mitarbeiter erkennen, ob andere Mitarbeiter momentan im Hause sind, was insbesondere bei der Vermittlung von Telefongespr&auml;chen sinnvoll ist.<\/p>\n<p>Zur Anlage einer entsprechenden Liste gehen Sie wie folgt vor:<\/p>\n<li>Legen Sie auf Basis der Tabelle tblZeit-eintr&auml;ge eine neue Abfrage an (siehe Bild 7).<\/li>\n<li>&uuml;bernehmen Sie alle Felder in den Ergebnisbereich.<\/li>\n<li>Definieren Sie f&uuml;r das Feld Ende das Kriterium Ist Null. Hierdurch werden nur die offenen Zeiteintr&auml;ge abgefragt.<\/li>\n<li>Speichern Sie die Abfrage unter dem Namen qryOffeneZeiteintr&auml;ge.<\/li>\n<p><IMG height=\"310\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic008.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><IMG height=\"323\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic009.png\" width=\"456\" border=\"0\"><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7:  Offene Zeiteintr&auml;ge werden mit Hilfe einer Abfrage ermittelt. <\/span><\/b><\/p>\n<p><IMG height=\"265\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic010.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<li>Im n&auml;chsten Schritt legen Sie eine weitere Abfrage an:<\/li>\n<li>Legen Sie eine neue Abfrage an und f&uuml;gen Sie dieser die Tabelle tblMitarbeiter und die eben angelegte Abfrage qryOffeneZeit-eintr&auml;ge hinzu (siehe Bild 8).<\/li>\n<li>Markieren Sie die bereits von Access angelegte Verkn&uuml;pfungslinie zwischen den beiden Feldlisten und w&auml;hlen Sie aus dem Kontextmen&uuml; den Befehl Verkn&uuml;pfungseigenschaften aus.<\/li>\n<li>W&auml;hlen Sie die Option 2 aus und best&auml;tigen Sie mit OK.<\/li>\n<li>F&uuml;gen Sie dem Entwurfsbereich die Felder MitarbeiterID und Mitarbeitername hinzu.<\/li>\n<li>Geben Sie in der Zeile Feld der dritten Spalte den folgenden Ausdruck ein:<\/li>\n<pre>IstAnwesend: Wenn(IstNull([ZeiteintragID]);Falsch;Wahr)<\/pre>\n<li>Speichern Sie die Abfrage unter dem Namen qryMitarbeiterstatus.<\/li>\n<p><IMG height=\"424\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic011.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p>Zur Erkl&auml;rung: Durch die Verkn&uuml;pfungseigenschaft werden generell alle Mitarbeiter abgefragt. Sollte ein offener Zeiteintrag existieren &#8211; der Mitarbeiter also anwesend sein &#8211; ist auch eine ZeiteintragID vorhanden. Andernfalls ist dieses Feld Null. Der Wenn-Ausdruck pr&uuml;ft dies ab und liefert True oder False zur&uuml;ck.<\/p>\n<p>Die neu erstellte Abfrage setzen Sie nun in einem neuen Unterformular ein:<\/p>\n<li>Legen Sie ein leeres Formular an, dem Sie den Namen frmZeiteintr&auml;ge_Mitarbeiterstatus geben.<\/li>\n<li>Stellen Sie die Standardansicht-Eigenschaft des Formulars auf Datenblatt ein.<\/li>\n<li>Stellen Sie die folgenden Eigenschaften auf Nein ein:  Bearbeitungen zulassen, L&ouml;schen zulassen, Anf&uuml;gen zulassen.<\/li>\n<li>Geben Sie als Datenherkunft die Abfrage qryMitarbeiterstatus an.<\/li>\n<li>&ouml;ffnen Sie die Feldliste mit dem Befehl Ansicht\/Feldliste und ziehen Sie die Felder Mitarbeiter und Bemerkung in das Formular.<\/li>\n<li>Markieren Sie in der Toolbox das Kontrollk&auml;stchen-Steuerelement und ziehen Sie das Feld IstAnwesend in das Formular.<\/li>\n<li>Entfernen Sie die Doppelpunkte der einzelnen Bezeichnungsfelder.<\/li>\n<p>Anschlie&szlig;end f&uuml;gen Sie dieses Formular wieder als Unterformular in das Formular frmZeiterfassung ein. Hierbei bietet sich der Einsatz eines Register-Steuerelements an, um das Formular &uuml;bersichtlich zu gestalten (siehe Bild 9).<\/p>\n<h3>Automatische Aktualisierung desMitarbeiterstatus<\/h3>\n<p>Damit die Statusanzeige der Mitarbeiter aktuell ist, sollte diese mit Hilfe eines Timers regelm&auml;&szlig;ig aktualisiert werden. Zus&auml;tzlich sollte die Aktualisierung beim Start und beim Stopp der eigenen Zeiterfassung erfolgen.<\/p>\n<pre>Private Sub MitarbeiterstatusAktualisieren()\r\n    Me.frmZeiterfassung_Mitarbeiterstatus.Requery\r\nEnd Sub\r\nPrivate Sub btnStopp_Click()\r\n    Dim SQL As String\r\n    If L&auml;uftZeiterfassung() = False Then\r\n        MsgBox \"Die Zeiterfassung l&auml;uft momentan nicht!\", vbInformation\r\n        Exit Sub\r\n    End If\r\n*   If IsNull(Me.cmbAbwesenheitsgrund) Then\r\n*       MsgBox \"Bitte geben Sie einen Abwesenheitsgrund an!\", vbInformation\r\n*       Exit Sub\r\n*   End If\r\n    SQL = \"UPDATE tblZeiteintr&auml;ge SET Ende=Now(),\"\r\n*   SQL = SQL & \" Bemerkung=''\" & Me.cmbAbwesenheitsgrund & \"'' WHERE MitarbeiterID=''\"\r\n    SQL = SQL & GetMitarbeiterID & \"'' AND Ende IS NULL\"\r\n    CurrentProject.Connection.Execute SQL\r\n    Me.cmbAbwesenheitsgrund = Null\r\n    StatusAktualisieren\r\n    ZeiteintragslisteAktualisieren\r\n    MitarbeiterstatusAktualisieren\r\nEnd Sub<\/pre>\n<p>Hierzu legen Sie im Modul des Formulars frmZeiterfassung die Prozedur aus Quellcode 8 an.<\/p>\n<p>Der Aufruf der Prozedur erfolgt wieder innerhalb der folgenden drei Ereignisprozeduren btnStart_Click, btnStopp_Click und Form_Load.<\/p>\n<p>Um den regelm&auml;&szlig;igen Start &uuml;ber einen Timer zu realisieren, generieren Sie f&uuml;r das Ereignis Bei Zeitgeber des Formulars frmZeiterfassung eine neue Ereignisprozedur, von der aus Sie ebenfalls die Prozedur MitarbeiterstatusAktualisieren aufrufen:<\/p>\n<pre>Private Sub Form_Timer()\r\n    MitarbeiterstatusAktualisieren\r\nEnd Sub<\/pre>\n<p>Das Aktualisierungsintervall stellen Sie &uuml;ber die Zeitgeberintervall-Eigenschaft des Formulars ein. Ein Wert von 10.000 bewirkt beispielsweise eine Aktualisierung im Zehn-Sekunden-Inter-vall.<\/p>\n<p>Durch die Anzeige des Mitarbeiterstatus k&ouml;nnen Sie erkennen, ob ein bestimmter Mitarbeiter momentan am Platz ist oder nicht.  Sie wissen jedoch nicht, ob er nur kurz in der Mittagspause ist oder bereits Feierabend gemacht hat. F&uuml;r solche Abwesenheitsgr&uuml;nde ist das Feld Bemerkung der Tabelle tblZeiteintr&auml;ge vorgesehen. Zur Erfassung des Abwesenheitsgrunds erweitern Sie das Formular frmZeit-eintr&auml;ge wie folgt:<\/p>\n<pre>Public Function AbwesenheitsgrundErmitteln(MitarbeiterID As Variant) As String\r\n    Dim SQL As String\r\n    Dim rstData As New Recordset\r\n    If Len(Nz(MitarbeiterID)) = 0 Then\r\n        Exit Function\r\n    End If\r\n    SQL = \"SELECT TOP 1 Bemerkung FROM tblZeiteintr&auml;ge WHERE MitarbeiterID=''\" \r\n    SQL = SQL & GetMitarbeiterID() & \"'' ORDER BY Start DESC\"\r\n    With rstData\r\n        .ActiveConnection = CurrentProject.Connection\r\n        .LockType = adLockReadOnly\r\n        .CursorLocation = adUseClient\r\n        .CursorType = adOpenStatic\r\n        .Source = SQL\r\n        .Open\r\n        If .RecordCount &lt;&gt; 0 Then\r\n            AbwesenheitsgrundErmitteln = Nz(!Bemerkung, \"\")\r\n        End If\r\n    End With\r\nEnd Function<\/pre>\n<li>&ouml;ffnen Sie das Formular frmZeitein-tr&auml;ge in der Entwurfsansicht.<\/li>\n<li>Legen Sie ein neues Kombinationsfeld mit dem Namen cmbAbwesenheitsgrund an und &auml;ndern Sie die Beschriftung entsprechend.<\/li>\n<li>W&auml;hlen Sie unter der Eigenschaft Herkunftstyp den Eintrag Werteliste aus.<\/li>\n<li>Geben Sie unter Datensatzherkunft h&auml;ufig ben&ouml;tigte Abwesenheitsgr&uuml;nde durch Semikolons getrennt ein:<\/li>\n<li>Mittagspause;Urlaub;Einkaufen<\/li>\n<li>&auml;ndern Sie die Ereignisprozedur der Schaltfl&auml;che Stopp wie in Quellcode 9 ab. Die neuen Zeilen sind durch ein vorangestelltes Sternchen (*) markiert. <\/li>\n<p>Bevor der Benutzer die Zeiterfassung nun stoppen kann, muss er einen Abwesenheitsgrund eingeben oder aus der Kombinationsfeldliste ausw&auml;hlen.<\/p>\n<h3>Abwesenheitsgrund ermitteln<\/h3>\n<p>Um nun den Grund der Abwesenheit aller Mitarbeiter zu ermitteln und in der Statusliste anzuzeigen, muss der letzte Zeiteintrag pro Mitarbeiter ermittelt werden. Diese Aufgabe erledigt die Funktion aus Quellcode 10, die Sie in das Modul modTools einf&uuml;gen.<\/p>\n<p>Diese Funktion ermittelt mit Hilfe einer Abfrage den letzten Zeiteintrag zu einem Mitarbeiter und liefert den Inhalt des Bemerkungsfeldes dieses Datensatzes zur&uuml;ck.<\/p>\n<p>Zum Einsatz dieser Prozedur gehen Sie wie folgt vor:<\/p>\n<li>&ouml;ffnen Sie die Abfrage qryMitarbeiterstatus in der Entwurfsansicht.<\/li>\n<li>F&uuml;gen Sie der Abfrage ein neu berechnetes Feld hinzu:<\/li>\n<li>Abwesenheitsgrund: AbwesenheitsgrundErmitteln(tblMitarbeiter.MitarbeiterID)<\/li>\n<li>Speichern Sie die Abfrage.<\/li>\n<li>&ouml;ffnen Sie das Formular frmZeiterfassung_Mitarbeiterstatus in der Entwurfsansicht.<\/li>\n<li>Aktivieren Sie die Feldliste.<\/li>\n<li>F&uuml;gen Sie das neue Feld Abwesenheitsgrund hinzu.<\/li>\n<li>Speichern und schlie&szlig;en Sie das Formular.<\/li>\n<p><IMG height=\"319\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic012.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p>Der Abwesenheitsgrund wird nun zu jedem Mitarbeiter angezeigt, falls dieser abwesend ist.<\/p>\n<p>Zur Kontrolle der Mitarbeiter bietet sich eine Auswertung der Wochenstunden an. Idealerweise erfolgt die Anzeige der Auswertung ebenfalls im Formular frmZeiterfassung, sodass jeder Mitarbeiter seine eigene Arbeitsleistung pr&uuml;fen kann.<\/p>\n<p>Die Daten der Auswertung werden mit Hilfe einer Abfrage ermittelt, die Sie wie folgt erzeugen:<\/p>\n<li>Legen Sie eine neue Abfrage an.<\/li>\n<li>F&uuml;gen Sie der Abfrage die Tabelle tblZeiteintr&auml;ge hinzu.<\/li>\n<li>F&uuml;gen Sie das Feld MitarbeiterID dem Entwurfsbereich hinzu.<\/li>\n<li>Geben Sie in die Zeile Feld der zweiten Spalte den folgenden Ausdruck ein:<\/li>\n<pre>KW: ZString(Jahr([Start])) & \"-\" & Format([Start];\"ww\")<\/pre>\n<li>Dieser Ausdruck ermittelt aus dem Start-Feld die Kalenderwoche und verkn&uuml;pft diese mit der Jahresangabe zu einer Zeichenkette der Form YYYY-KW.<\/li>\n<li>Geben Sie in die Zeile Feld der zweiten Spalte den folgenden Ausdruck ein:<\/li>\n<pre>Wochenarbeitszeit: DatDiff(\"n\";[Start];[Ende])\/60<\/pre>\n<p>Hierdurch ermittelt Access die Anzahl der Stunden, die ein Zeiteintrag gedauert hat (siehe Bild 10).<\/p>\n<pre>Private Sub ZeiteintragslisteAktualisieren()\r\n    Me.frmZeiterfassung_Zeiteintr&auml;ge.Form.Filter = \"MitarbeiterID=''\" _        & GetMitarbeiterID() & \"''\"\r\n    Me.frmZeiterfassung_Zeiteintr&auml;ge.Form.FilterOn = True\r\n    Me.frmZeiterfassung_Wochenarbeitszeiten.Form.Filter = \"MitarbeiterID=''\" _        & GetMitarbeiterID() & \"''\"\r\n   Me.frmZeiterfassung_Wochenarbeitszeiten.Form.FilterOn = True\r\nEnd Sub<\/pre>\n<h3>Hinweis<\/h3>\n<p>Um eine m&ouml;glichst exakte Berechnung zu erhalten, wird die Differenz in Minuten berechnet und dann durch 60 geteilt. Dies ergibt eine gen&uuml;gend exakte Angabe in Stunden. <\/p>\n<li>W&auml;hlen Sie den Men&uuml;punkt Ansicht\/Funktionen aus.<\/li>\n<li>W&auml;hlen Sie f&uuml;r die ersten beiden Spalten die Funktion Gruppierung und f&uuml;r die dritte Spalte die Funktion Summe aus. Dies bewirkt die Summierung aller Zeiteintr&auml;ge pro Woche und Mitarbeiter.<\/li>\n<li>Speichern Sie die Abfrage unter dem Namen qryWochenarbeitszeiten.<\/li>\n<h3>Anzeige der Wochenarbeitszeit imZeiterfassungsformular<\/h3>\n<p><IMG height=\"287\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic013.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p>Die Integration dieser Abfrage funktioniert auf &auml;hnliche Weise, wie dies beim Unterformular frmZeiterfassung_Zeiteintr&auml;ge der Fall ist.<\/p>\n<li>Legen Sie ein neues Formular auf Basis der neu erstellten Abfrage an. <\/li>\n<li>Formatieren Sie das Formular als Datenblatt und f&uuml;gen Sie die Felder KW und Wochenarbeitszeit hinzu.<\/li>\n<li>Speichern Sie das Formular unter dem Namen frmZeiterfassung_Wochenarbeitszeiten.<\/li>\n<li>Erg&auml;nzen Sie das Register im Formular frmZeiterfassung um eine neue Seite.<\/li>\n<li>Platzieren Sie das neue Formular als Unterformular auf diese Registerseite. Achten Sie darauf, dass das Unterformular-Steuerelement den Namen frmZeiterfassung_Wochenarbeitszeiten tr&auml;gt (siehe Bild 11).<\/li>\n<li>Erg&auml;nzen Sie die Prozedur ZeiteintragslisteAktualisieren wie in Quellcode 10.<\/li>\n<p><IMG height=\"287\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic014.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12:  Zur grafischen Auswertung m&uuml;ssen die Achsen korrekt ausgew&auml;hlt werden.<\/span><\/b><\/p>\n<p><IMG height=\"287\" src=\"..\/fileadmin\/_temp_\/{9357F090-B91E-496A-A10D-69562269A36E}\/pic015.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p>Zum Vergleich der einzelnen Mitarbeiter bietet ein Liniendiagramm die beste &uuml;bersicht. Basis f&uuml;r ein solches Diagramm ist zun&auml;chst einmal eine Abfrage, welche die Daten in der ben&ouml;tigten Form aufbereitet:<\/p>\n<li>Legen Sie eine neue Abfrage an, der Sie die Tabelle tblMitarbeiter sowie die Abfrage qryWochenarbeitszeiten hinzuf&uuml;gen. Access sollte die beiden Feldlisten &uuml;ber das Feld MitarbeiterID hierbei automatisch verkn&uuml;pfen.<\/li>\n<li>F&uuml;gen Sie dem Ergebnisbereich die Felder Mitarbeitername, KW und Wochenarbeitszeit hinzu.<\/li>\n<li>Speichern Sie die Abfrage unter dem Namen qryDia-gramm.<\/li>\n<p>Auf der Basis dieser Abfrage erzeugen Sie anschlie&szlig;end das Diagramm mit Hilfe des Diagrammassistenten:<\/p>\n<li>Wechseln Sie im Datenbankfenster zum Register Formulare und klicken Sie auf Neu.<\/li>\n<li>W&auml;hlen Sie im Dialogfenster Neues Formular den Diagramm-Assistenten sowie die Abfrage qryDiagramm aus. Best&auml;tigen Sie mit OK.<\/li>\n<li>F&uuml;gen Sie alle Felder der Abfrage hinzu und best&auml;tigen Sie mit Weiter.<\/li>\n<li>W&auml;hlen Sie das Liniendia-gramm als Diagrammform aus.<\/li>\n<li>Ordnen Sie das Feld KW auf der horizontalen und das Feld Mitarbeiter auf der vertikalen Achse an (siehe Bild 12). Best&auml;tigen Sie mit Weiter.<\/li>\n<li>Tragen Sie den Diagrammnamen frmWochenarbeitszeitenDiagramm ein und starten Sie den Assistenten &uuml;ber die Schaltfl&auml;che Fertig stellen.<\/li>\n<li>&ouml;ffnen Sie das neu generierte Formular in der Entwurfsansicht und passen Sie das Layout an (siehe Bild 13).<\/li>\n<li>Der Verwendung der Zeiterfassung steht nun nichts mehr im Wege. Sie k&ouml;nnen die Datenbankdatei nun so im Netzwerk installieren, dass alle Mitarbeiter darauf zugreifen k&ouml;nnen. Auch eventuelle Erweitungen sind leicht zu realisieren: Sie k&ouml;nnen z. B. ein zus&auml;tzliches Kombinationsfeld zur Auswahl des aktuell bearbeiteten Projektes anlegen, um die Analyse der Arbeitszeiten weiter zu verfeinern.<\/li>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Zeiterfassung00.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/CF22C17D-E39F-4E62-928E-7C796411146E\/aiu_32.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Erfassung von Arbeitszeiten einzelner Mitarbeiter eines Unternehmens spielt zur Kontrolle und zur Motivation eines Teams eine wichtige Rolle. Oft werden Arbeitszeiten &uuml;ber ein entsprechendes Ger&auml;t mit Hilfe von Codekarten erfasst. Soche Zeiterfassungsger&auml;te sind &uuml;blicherweise im Eingangsbereich untergebracht, sodass jeder Mitarbeiter beim Betreten oder Verlassen des Geb&auml;udes seine Zeiterfassung starten beziehungsweise beenden kann. Die hier vorgestellte L&ouml;sung zeigt Ihnen, wie Sie solche Zeiten ohne den Kauf eines teuren Zeiterfassungsger&auml;ts alleine mit Hilfe Ihres PCs realisieren k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662001,66052001,44000027],"tags":[],"class_list":["post-55000032","post","type-post","status-publish","format-standard","hentry","category-662001","category-66052001","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Zeit ist Geld - Zeiterfassung mit Access - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zeit ist Geld - Zeiterfassung mit Access\" \/>\n<meta property=\"og:description\" content=\"Die Erfassung von Arbeitszeiten einzelner Mitarbeiter eines Unternehmens spielt zur Kontrolle und zur Motivation eines Teams eine wichtige Rolle. Oft werden Arbeitszeiten &uuml;ber ein entsprechendes Ger&auml;t mit Hilfe von Codekarten erfasst. Soche Zeiterfassungsger&auml;te sind &uuml;blicherweise im Eingangsbereich untergebracht, sodass jeder Mitarbeiter beim Betreten oder Verlassen des Geb&auml;udes seine Zeiterfassung starten beziehungsweise beenden kann. Die hier vorgestellte L&ouml;sung zeigt Ihnen, wie Sie solche Zeiten ohne den Kauf eines teuren Zeiterfassungsger&auml;ts alleine mit Hilfe Ihres PCs realisieren k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-10T18:44:04+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/3099dc03d1a14b149806a4604599f164\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Zeit ist Geld &#8211; Zeiterfassung mit Access\",\"datePublished\":\"2021-02-10T18:44:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/\"},\"wordCount\":3451,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/3099dc03d1a14b149806a4604599f164\",\"articleSection\":[\"2001\",\"5\\\/2001\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/\",\"name\":\"Zeit ist Geld - Zeiterfassung mit Access - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/3099dc03d1a14b149806a4604599f164\",\"datePublished\":\"2021-02-10T18:44:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/3099dc03d1a14b149806a4604599f164\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/3099dc03d1a14b149806a4604599f164\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Zeit_ist_Geld__Zeiterfassung_mit_Access\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zeit ist Geld &#8211; Zeiterfassung mit Access\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Zeit ist Geld - Zeiterfassung mit Access - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/","og_locale":"de_DE","og_type":"article","og_title":"Zeit ist Geld - Zeiterfassung mit Access","og_description":"Die Erfassung von Arbeitszeiten einzelner Mitarbeiter eines Unternehmens spielt zur Kontrolle und zur Motivation eines Teams eine wichtige Rolle. Oft werden Arbeitszeiten &uuml;ber ein entsprechendes Ger&auml;t mit Hilfe von Codekarten erfasst. Soche Zeiterfassungsger&auml;te sind &uuml;blicherweise im Eingangsbereich untergebracht, sodass jeder Mitarbeiter beim Betreten oder Verlassen des Geb&auml;udes seine Zeiterfassung starten beziehungsweise beenden kann. Die hier vorgestellte L&ouml;sung zeigt Ihnen, wie Sie solche Zeiten ohne den Kauf eines teuren Zeiterfassungsger&auml;ts alleine mit Hilfe Ihres PCs realisieren k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-10T18:44:04+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/3099dc03d1a14b149806a4604599f164","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Zeit ist Geld &#8211; Zeiterfassung mit Access","datePublished":"2021-02-10T18:44:04+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/"},"wordCount":3451,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/3099dc03d1a14b149806a4604599f164","articleSection":["2001","5\/2001","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/","url":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/","name":"Zeit ist Geld - Zeiterfassung mit Access - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/3099dc03d1a14b149806a4604599f164","datePublished":"2021-02-10T18:44:04+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/3099dc03d1a14b149806a4604599f164","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/3099dc03d1a14b149806a4604599f164"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Zeit_ist_Geld__Zeiterfassung_mit_Access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Zeit ist Geld &#8211; Zeiterfassung mit Access"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000032","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000032"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000032\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000032"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000032"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}