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

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2002.

Urlaubsverwaltung mit Access

von Klaus Giesen, Wuppertal

Urlaub, Krankheit oder sonstige Abwesenheit von Mitarbeitern sind in jedem Betrieb an der Tagesordnung. Das mag in manchen Fällen unangenehm sein, ist aber in der Regel nicht zu ändern. Der vorliegende Beitrag zeigt Ihnen, wie Sie die Fehlzeiten der Mitarbeiter Ihrer Firma mit einer Access-Datenbank verwalten und kontrollieren können. Ein wichtiger Gesichtspunkt bei der Konzeption einer solchen Lösung ist es, den zur Verwaltung der Fehlzeiten notwendigen Zeitaufwand - das heißt gleichzeitig auch die Kosten dafür - zu minimieren. Der folgende Beitrag soll dazu einen Ansatzpunkt bieten.

Aufgaben einer
Urlaubsverwaltung

Die Aufgaben einer Urlaubsverwaltung mit Access lassen sich unter den Stichwörtern Erfassung, Übersicht und Auswertung zusammenfassen.

Erfassung

Bei der Erfassung der entsprechenden Datumswerte in Tabellen ist die Tatsache zu berücksichtigen, dass Kalendertage nicht nur Arbeitstage sind. Hinzu kommen noch die verschiedenen beweglichen und unbeweglichen Feiertage, die auch noch in den einzelnen Bundesländern unterschiedlich sein können.

Es geht bei dieser Datenbanklösung also zunächst darum, aus zwei Datumsangaben die reinen Werk- oder Arbeitstage zu berechnen.

Im Ergänzungsheft 6/2001 von Access im Unternehmen finden Sie den Beitrag Feiertage berechnen mit Access, in dem eine programmgesteuerte Feiertagsberechnung vorgestellt wird. Diese Lösung können Sie ohne weiteres in die bestehende Anwendung übernehmen. Die Vorgehensweise wird daher hier nicht erneut behandelt. (

In der vorliegenden Musterlösung finden Sie ein einfaches Endlosformular zur Erfassung von Feiertagen (s. Abb. 1).

Abb. 1: Eingabeformular zur Erfassung von Feiertagen

Die Datenherkunft des Formulars ist die Abfrage qryfrmFeiertage. Sie sortiert den Inhalt der Tabelle tblFeiertage aufsteigend nach dem Datum.

Abb. 2: Die Tabelle tblPersonal in der Entwurfsansicht

Diese Erfassungsmethode erlaubt Ihnen unter anderem die Berücksichtigung der unterschiedlichen Feiertagregelungen in den einzelnen Bundesländern.

Übersicht

Zu einer Übersicht über die Fehlzeiten eines Mitarbeiters gehört die automatische Auswertung und Präsentation von Informationen wie z. B.

  • Urlaubsanspruch
  • eventueller Resturlaub und
  • bereits genommener Urlaub.
  • Dazu bieten sich bei dieser Access-Datenbank entsprechend gestaltete Übersichtsformulare an, die die notwendigen Informationen auf einen Blick liefern.

    Auswertung

    Die Auswertung einer Fehlzeitenübersicht erfolgt in der Regel auf Papier. Bei dieser Access-Lösung geht es also in erster Linie um die Erstellung entsprechender Berichte, die der Anwender anschließend ausdrucken und weiter verwenden kann.

    Vorüberlegungen zur Musterlösung

    Ein wesentlicher Aspekt der Betriebsorganisation ist die stringente Verwaltung der Fehlzeiten von Mitarbeitern. Die vorliegende Musterlösung geht von einem stark vereinfachten Modell aus:

  • Für die Arbeitstage sind drei Abwesenheitsgründe denkbar: Krankheit, Urlaub und sonstige Gründe.
  • Bei jeder der verschiedenen Abwesenheitsarten, die sich über einen oder mehrere Tage erstreckt, kann genau ein Vertreter für die Abwesenheit des betreffenden Mitarbeiters angegeben werden.
  • Bei der Auswahl eines Vertreters erfolgt eine erste einfache Plausibilitätskontrolle: Es wird geprüft, ob der zu vertretende Mitarbeiter und sein Vertreter nicht identisch sind.
  • Es lassen sich natürlich weitere, an spezielle Betriebsabläufe angepasste Plausibilitätsüberprüfungen, implementieren.

    Das Datenmodell

    Im folgenden Abschnitt lernen Sie das Datenmodell mit den wichtigsten Tabellen der Beispieldatenbank kennen.

    Hinweis

    Die Beispieldatenbanken Urlaub97.mdb und Urlaub2000.mdb finden Sie auf der beiliegenden Heft-CD. (

    Die Tabelle tblPersonal

    Die Tabelle tblPersonal dient der Erfassung der Stammdaten der Mitarbeiter. Die Auswahl der Felder ist beispielhaft und kann leicht an Ihre individuellen Bedürfnisse angepasst werden (s. Abb.2).

    Für das Feld Urlaubsanspruch ist ein Standardwert festgelegt, der bei der Erstellung eines neuen Datensatzes automatisch übernommen wird (s. Abb. 2).

    Abb. 3: Feldeigenschaften

    Dieses Feld hat ebenso wie das Feld RestUrlaubVorjahr den Felddatentyp Zahl.

    Für die Feldgröße reicht die Einstellung Byte mit ihrem Wertebereich für Ganzzahlen bis 255 vollkommen aus. Die Verwendung der Feldgröße Long Integer wäre für diesen Zweck ist nicht nur in Bezug auf den Wertebereich überflüssig, sondern verschwendet auch unnötig Speicherplatz und Ressourcen (s. Abb. 3).

    Die Tabelle tblAbwesenheit

    Die Tabelle tblAbwesenheit speichert die Datumswerte und den Grund der Fehlzeiten (s. Abb. 4).

    Abb. 4: Die Tabelle tblAbwesenheit in der Entwurfsansicht

    Außerdem ist in dieser Tabelle noch das Sekundärschlüsselfeld zur Tabelle tblPersonal vorhanden.

    Beziehungen

    Interessant ist in diesem Zusammenhang lediglich die Beziehung zwischen den Tabellen tblPersonal und tblAbwesenheit. Die Tabellenbeziehungen werden im Dialogfenster Beziehungen angezeigt (s. Abb. 5).

    Abb. 5: Das Dialogfenster Beziehungen

  • Klicken Sie im Dialogfenster Beziehungen doppelt auf die Verbindungslinie zwischen den beiden Tabellen (s. Abb. 5). Daraufhin öffnet sich das Dialogfenster Beziehungen bearbeiten (s. Abb. 6).
  • Klicken Sie dort auf die Schaltfläche Verknüpfungstyp (s. Abb. 6). Das Dialogfenster Verknüpfungseigenschaften wird angezeigt (s. Abb. 7). (
  • Die zweite Option legt eine Links-Inklusionsverknüpfung oder LEFT JOIN fest. Dabei werden alle Datensätze aus der Tabelle auf der linken Seite der Verknüpfung angezeigt, auch wenn sie keine entsprechenden Werte im verknüpften Feld der Tabelle auf der rechten Seite besitzen.

  • Schließen Sie die beiden Dialoge.
  • Abb. 6: Das Dialogfenster Beziehungen bearbeiten

    Abb. 7: Das Dialogfenster Verknüpfungseigenschaften

    Die Formulare

    Die Beispieldatenbank besteht aus dem Hauptformular frmPersonal und dem Formular zur Eingabe der Feiertage, frmFeiertage. Vier der fünf weiteren Formulare sind Unterformulare von frmPersonal und daher nicht von nebensächlicher Bedeutung.

    Anders verhält es sich jedoch mit verschiedenen Unterformularen dieser Musterlösung, die für deren Funktionalität von entscheidender Bedeutung sind.

    Diese Unterformulare werden im weiteren Verlauf dieses Beitrags im Zusammenhang vorgestellt und beschrieben.

    Das Formular frmPersonal

    Das Formular frmPersonal besteht im Wesentlichen aus einem Registersteuerelement und zwei Schaltflächen. Die vier Seiten des Registersteuerelements enthalten die erwähnten Unterformulare.

    Abb. 8: Das Formular frmPersonal mit dem Registersteuerelement

    Formular mit Registersteuerelement erstellen

  • Legen Sie ein neues Formular mit dem Namen frmPersonal an. Die Datenherkunft ist die Abfrage qryfrmPersonal.
  • Fügen Sie in der Entwurfsansicht des Formulars frmPersonal aus der Toolbox ein Registersteuerelement mit vier Registerkarten oder
    -seiten ein.
  • Beschriften Sie die einzelnen Registerseiten wie in Abb. 8. (
  • Hinweis

    Weitere Einzelheiten zu Registersteuerelementen finden Sie im Beitrag Das Register-Steuerelement, der im Heft 3/2001 von Access im Unternehmen erschienen ist. (

    Erfassung der Fehlzeiten

    Zentrales Element zur Erfassung der Fehlzeiten ist das Unterformular SubfrmAbwesenheit, das sich auf der Registerseite Abwesenheiten im Formular frmPersonal befindet (s. Abb. 10).

    Abb. 9: Das Unterformular auf der Registerseite Abwesenheiten

    Das Unterformular SubfrmAbwesenheit

    Dieses Unterformular, das auf der Abfrage qrySubfrmAbwesenheit beruht, ist mit folgenden Funktionen ausgestattet:

  • Auswahl einer Abwesenheitsart
  • Eingabe von Anfangs- und Enddatum der Fehlzeit
  • Anzeige der Fehltage
  • Auswahl eines Vertreters
  • Löschen einer Fehlzeit
  • Die Punkte Berechnung der Fehltage und Auswahl einer Vertretung werden in separaten Abschnitten behandelt.

    Auswahl einer Abwesenheitsart

    Die Auswahl einer Abwesenheitsart erfolgt über das Kombinationsfeld CboAbwesenheitart, das mittels einer Werteliste gefüllt wird (s. Abb. 11).

    Abb. 10: Das Eigenschaftsfenster des Kombinationsfelds CboAbwesenheitart

    Löschen einer Fehlzeit

    Beim Klick auf die Schaltfläche btnDel wird eine Ereignisprozedur aufgerufen, die den betreffenden Datensatz nach einer Sicherheitsabfrage löscht. Verantwortlich dafür ist die folgende VBA-Codezeile:

    DoCmd.RunCommand acCmdDeleteRecord

    Berechnung der Fehltage

    Die Berechnung der Fehltage erfolgt in der Abfrage qrySubfrmAbwesenheit. Die Abfrage enthält alle Felder der Tabelle TblAbwesenheit sowie ein weiteres Feld namens TageAbwesend mit folgendem Ausdruck:

    WerktageZwischen(Nz([StartDatum]);Nz([EndDatum]))

    Dieser Ausdruck berechnet mit Hilfe der Funktion WerktageZwischen aus den beiden im Formular eingegebenen Datumswerten (Anfangs- und Enddatum der Abwesenheit), die als Parameter übergeben werden, die Anzahl der Werktage.

    Praxis-Tipp

    Falls der Wert eines der beiden Steuerelemente gleich Null ist, wandelt die Funktion Nz() diesen Nullwert in eine leere Zeichenfolge um. (

    Die Funktion WerktageZwischen()

    Sie finden die Funktion WerktageZwischen() im Modul basFristen der Beispieldatenbank unter Quellcode 1 abgedruckt.

    Function WerktageZwischen(ErstesDatum As Variant, ZweitesDatum As Variant) As Long

        Dim AktuellerTag As Date

          If Not (IsEmpty(ErstesDatum) Or IsEmpty(ZweitesDatum)) Then

            WerktageZwischen = ZweitesDatum - ErstesDatum + 1

               For AktuellerTag = ErstesDatum To ZweitesDatum

                If IstFeiertag(AktuellerTag) Or Weekday(AktuellerTag) = 1 Or Weekday(AktuellerTag) = 7 Then

                    WerktageZwischen = WerktageZwischen - 1

                End If

            Next

        Else

            WerktageZwischen = Empty

        End If

    End Function

    Diese Funktion stammt in abgewandelter Form aus dem Beitrag Fristen berechnen aus dem Heft 6/2001 der Reihe Access im Unternehmen.

    Die Veränderung besteht darin, mit Hilfe der Funktion IsEmpty() sicherzustellen, dass die Berechnung der Werktage erst dann ausgeführt wird, nachdem Datumswerte in beide Eingabefelder eingegeben wurden. Anderenfalls tritt der Effekt auf, der in Abb. 13 zu sehen ist:

    Abb. 11: Das Unterformular SubFrmAbwesenheit

    Nach der Eingabe des Anfangsdatums wird als Ergebnis so lange eine negative fünfstellige Zahl angezeigt, bis auch das Enddatum eingegeben wurde.

    Vertreter auswählen

    Die Auswahl einer Urlaubs- oder Abwesenheitsvertretung erfolgt im Kombinationsfeld CboVertretung.

    Datensatzherkunft für dieses Kombinationsfeld ist die Abfrage qryMitarbeiter, die eigentlich nur dazu dient, die Felder Nachname und Vorname im Feld Mitarbeiter zusammenzufassen und zu sortieren (s. Abb. 15).

    Abb. 12: Die Abfrage qryMitarbeiter in der Entwurfsansicht

    Plausibilitätsprüfung

    Ein abwesender Mitarbeiter kann nur durch andere Mitarbeiter, aber nicht durch sich selbst vertreten werden. Deshalb ist bei der Auswahl einer Vertretung eine Plausibilitätsprüfung notwendig.

    Diese erfolgt durch eine kleine Ereignisprozedur, die durch das Vor Aktualisierung- oder BeforeUpdate-Ereignis des Kombinationsfelds aufgerufen wird. Der Code ist in Quellcode 2 abgedruckt.

    Private Sub CboVertretung_BeforeUpdate(Cancel As Integer)

      If Me!PersonalID = Me!Vertretung Then

        MsgBox "Bei Abwesenheit kann man nicht" & vbCrLf & "sich selbst vertreten!"

        Cancel = True

        Me!CboVertretung.Undo

      End If

    End Sub

    Durch diese Ereignisprozedur wird überprüft, ob die Werte der PersonalID von Formular und Kombinationsfeld übereinstimmen oder nicht. Falls ja, wird eine entsprechende Meldung angezeig und die Auswahl im Kombinationsfeld rückgängig gemacht.

    Darstellung und Aktualisierung von Urlaubsdaten

    Die Darstellung und Aktualisierung der Urlaubsdaten erfolgt auf der Registerseite Urlaubsdaten im Formular frmPersonal (s. Abb. 17).

    Abb. 13: Das Register Urlaubsdaten im Formular frmPersonal

    Die beiden oberen Felder ResturlaubVorjahr und Urlaubsanspruch sind gebundene Textfelder, die drei unteren Felder dagegen berechnete Felder.

    Das Feld Gesamturlaub

    Der Gesamturlaub errechnet sich logischerweise aus dem eventuell vorhandenen Resturlaub aus dem Vorjahr und dem noch vorhandenen Jahresurlaub.

    Dies erfolgt in der Beispieldatenbank durch den Ausdruck

    =Nz([ResturlaubVorjahr])+Nz([Urlaubsanspruch])

    Praxis-Tipp

    Ohne die Verwendung der Nz()-Funktion an dieser Stelle würde bei nicht vorhandenem Resturlaub auch der Wert für den Urlaubsanspruch unterschlagen. Die Berechnung wäre also falsch. (

    Das Feld Urlaub genommen

    Der Wert im Feld UrlaubGenommen errechnet sich aus den in Unterformular eingegebenen Urlaubswerten.

    Für die Ausführung einer solchen Berechnung gibt es, wie so oft bei Access, mehrere Möglichkeiten. Diese Musterlösung schlägt folgende vor:

  • Erstellen Sie als ersten Schritt eine Auswahlabfrage auf Grundlage der Tabelle tblAbwesenheit.
  • Fügen Sie die Felder PersonalID und Abwesenheitart hinzu.
  • Stellen Sie für das Feld Abwesenheitart das Kriterium 1 (= Urlaub) ein und klicken Sie auf das Symbol Funktionen in der Symbolleiste.
  • Erstellen Sie in der Abfrage das berechnete Feld TageAbwesend mit Hilfe des nachstehenden Ausdrucks. Durch diesen Ausdruck wird die bereits bekannte Funktion WerktageZwischen() aufaddiert. (
  • TageAbwesend: Summe(WerktageZwischen(Nz([StartDatum]);Nz([EndDatum])))

    Das Ergebnis der Abfrage zeigt die Summe der Urlaubstage für jeden einzelnen Mitarbeiter an (s. Abb. 19).

    Abb. 14: Ergebnis der Abfrage

    Das war der erste Schritt. Als Nächstes greifen Sie einfach vom Feld UrlaubGenommen im Formular frmPersonal auf den gewünschten Wert aus dieser Abfrage zu. Der folgende Ausdruck verwendet die DLookup-Funktion, um aus der Abfrage qryUrlaubstage den Wert des Feldes TageAbwesend für den aktuell im Formular angezeigten Mitarbeiter zu ermitteln:

    Der vollständige Ausdruck für das Feld UrlaubGenommen lautet:

    =DomWert("[TageAbwesend]";"qryUrlaubstage";"[PersonalID] =" & Formulare!frmPersonal!PersonalID)

    Das Feld Restlicher Jahresurlaub

    Der restliche Jahresurlaub ergibt sich aus der Differenz der Felder UrlaubGesamt und UrlaubGenommen. Der Ausdruck für diese Berechnung lautet:

    =Nz([UrlaubGesamt])-Nz([UrlaubGenommen])

    Gesamtübersicht der Fehlzeiten

    Eine Gesamtübersicht aller Fehlzeiten pro Mitarbeiter zeigt das gleichnamige Register im Formular frmPersonal an (s. Abb. 20).

    Abb. 15: Das Register Gesamtübersicht im Formular frmPersonal

    Die Registerseite Gesamtübersicht enthält drei Unterformulare zur Anzeige von Urlaubstagen, Krankheitstagen und sonstigen Fehltagen (s. Abb. 21).

    Abb. 16: Die Unterformulare auf der Registerseite

    Der Aufbau wird in den folgenden Abschnitten beispielhaft für die Anzeige der Krankheitstage gezeigt.

    Grundlage für alle Übersichtsdaten ist die Abfrage qryUebersicht.

    Die Abfrage qryUebersicht

    Die Abfrage qryUebersicht errechnet wieder mit Hilfe der Funktion WerktageZwischen() die Anzahl der Abwesenheitstage (s. Abb. 22).

    Abb. 17: Die Abfrage qryUebersicht in der Entwurfsansicht

    Weiterhin dient diese Abfrage auch als Datenherkunft für das Unterformular SubfrmUebersichtKrank und alle weiteren Übersichts-Unterformulare.

    Das Formular SubfrmUebersichtKrank

    Die Datenherkunft dieses Unterformulars ist folgende SQL-Anweisung:

    SELECT qryUebersicht.* FROM qryUebersicht WHERE ((qryUebersicht.Abwesenheitart)=2);

    Das Formular SubfrmUebersicht wird auf Grundlage der Abfrage qryUebersicht mit dem Kriterium für die Abwesenheitart 2 = Krank geöffnet.

    Die einzige Funktionalität in diesem Unterformular liegt in der Addition der Urlaubstage in dem berechneten Feld TageAbwesend im Formularfuß (s. Abb. 23).

    Abb. 18: Das Unterformular SubfrmUebersichtKrank in der Entwurfsansicht

    Die Verknüpfung des Unterformulars zum Hauptformular erfolgt über das Feld PersonalID. Dadurch ist gewährleistet, dass die Krankheitstage eines jeden Mitarbeiters korrekt zugeordnet werden.

    Auswertung

    Der letzte Abschnitt dieses Beitrags behandelt die Auswertung der Daten durch einen Papierausdruck.

    Vorbemerkung

    Grundsätzlich gilt: Gerade die Gestaltung von Berichten ist in vielen Access-Datenbankanwendungen von den spezifischen Wünschen und Bedürfnissen des Anwenders abhängig.

    Aus diesem Grund ist in dieser Musterlösung ein Bericht vorhanden, der im Prinzip das im letzten Abschnitt vorgestellte Formular zur Gesamtübersicht mit reduziertem Feldumfang wiedergibt.

    Der Bericht repAbwesenheit

    Der Bericht repAbwesenheit enthält drei Unterberichte, die die Daten für einen ausgewählten Mitarbeiter anzeigen (s. Abb. 24).

    Abb. 19: Der Bericht repAbwesenheit

    Darstellung der Urlaubsdaten

    Die Urlaubsdaten eines Mitarbeiters werden im oberen Teil des Berichts angezeigt. Sie stammen aus dem berechneten Steuerelement UrlaubGenommen im Unterbericht.

    Wenn ein Mitarbeiter jedoch noch keinen Urlaub genommen hat, ist dieses Feld also leer. Als Folge ist in diesem Feld und allen anderen Feldern, die sich auf dieses Feld beziehen, die Anzeige #Fehler zu sehen.

    Die Abhilfe gegen diesen unschönen Zustand liegt in einer Wenn-Bedingung mit eingeschlossener Fehlerbehandlung.

    Der passende Ausdruck für das Feld UrlaubGenommen lautet in der ausführlichen Schreibweise:

    =Wenn(IsError(Berichte!repAbwesenheit!SubrepUrlaub.Bericht!TageUrlaub);0;Berichte!repAbwesenheit!SubrepUrlaub.Bericht!TageUrlaub)

    Im Fehlerfall enthält das Feld UrlaubGenommen den Wert 0, mit dem es problemlos rechnen bzw. den es anzeigen kann.

    Die Unterberichte

    Die drei Unterberichte basieren wie die Übersichtsunterformulare auf der Abfrage qryUebersicht, die die notwendige Berechnung der Abwesenheitstage leistet.

    Ebenso ist auch die Datenherkunft wieder eine SQL-Anweisung, die ein Kriterium für die Abwesenheitsart setzt. Hier das Beispiel für Urlaub:

    SELECT qryUebersicht.* FROM qryUebersicht WHERE (([qryUebersicht].Abwesenheitart)=1);

    Abb. 20: Der Unterbericht SubrepUrlaub in der Entwurfsansicht

    Die Verknüpfung der Unterberichte zum Hauptbericht erfolgt wieder über die Felder PersonalID.

    Der Berichtsaufruf

    Der Aufruf des Berichts repAbwesenheit erfolgt aus dem Formular frmPersonal heraus durch einen Klick auf die Schaltfläche btnDrucken.

    Die dabei aufgerufene Ereignisprozedur öffnet den Bericht repAbwesenheit in der Vorschau für den Mitarbeiter, der im aktuellen Datensatz angezeigt wird.

    Private Sub btnDrucken_Click()

      DoCmd.OpenReport "repAbwesenheit", acViewPreview, , "PersonalID = " & Me.PersonalID

    End Sub

    Zusammenfassung und Ausblick

    Diese Musterlösung stellt einen ausbaufähigen Ansatz zu einer Fehlzeiten- und Urlaubverwaltung dar.

    Folgende Punkte könnten im Rahmen einer Erweiterung dieser Musterlösung in Betracht gezogen werden:

  • Grafische Vergleichsdarstellung von Abwesenheiten,
  • Verwaltung von Urlaubsperren bei wichtigen betrieblichen Ereignissen,
  • Automatik beim Verfall des Resturlaubs im folgenden Jahr,
  • Verwendung eines Kalendersteuerelements bei der Datumseingabe.
  • 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.