Wenn Mitarbeiter Urlaub machen, krank sind oder eine Schulung besuchen, erfassen Sie diese Fehltage in einer Tabelle. Die dazu benötigten Abfragen sind auf den ersten Blick schnell erstellt, aber bei genauerer Betrachtung wird es durch die Berücksichtigung von Wochenenden und Feiertagen etwas komplizierter. Im Folgenden zeigen wir effektive Lösungen für diese Problemstellung.
Damit Sie die folgenden Erläuterungen einfacher nachvollziehen können, haben wir eine Personalverwaltung in Form des Formulars „Personal“ vorbereitet, das die Erfassung von Basisdaten, persönlichen Daten und Fehltagen auf verschiedenen Registerkarten erlaubt.
Laden Sie zunächst die Beispieldatenbank herunter und installieren Sie sie in ein beliebiges Verzeichnis auf Ihrer Festplatte.
Anschließend können Sie die Datenbank öffnen und die Personalverwaltung nutzen. Für die einzelnen Mitarbeiter sind bereits einige Fehltage mit unterschiedlichen Gründen eingetragen, sodass wir uns gleich mit den Abfragen auseinandersetzen können. Technische Details zum Aufbau der Personalverwaltung finden Sie bei Bedarf im Dokument „Hinweise zur Personalverwaltung.doc“ im Installationsverzeichnis der Beispieldatenbank.
Zunächst soll eine Abfrage erstellt werden, die eine allgemeine Übersicht liefert:
- Erstellen Sie eine neue Auswahlabfrage auf Basis der Tabellen „Personal“ und „Fehltage“. Access richtet automatisch eine Verknüpfung über das Feld „Personal- Nr“ ein.
- Schalten Sie die Abfrage per Klick auf das Symbol SUMMEN in eine Gruppierungsabfrage um.
- Geben Sie in die Zeile „Feld:“ der ersten Spalte den folgenden Ausdruck ein:NV: [Nachname] & „, “ & [Vorname]
Dieser Ausdruck fasst die Einzelfelder „Nachname“ und „Vorname“ in einem Feld „NV“ getrennt mit „,<Leerzeichen>“ zusammen und ergibt beispielsweise „Müller, Johannes“.
- Stellen Sie in der Zeile „Funktion:“ den Eintrag „Gruppierung“ und die „Sortierung“ auf „Absteigend“ ein.
- Fügen Sie das Feld „Grund“ per Doppelklick in die Feldliste zum Abfrageentwurf hinzu, stellen Sie „Funktion:“ auf „Gruppierung“ und „Sortierung“ auf „Aufsteigend“ ein. Bitte beachten Sie, dass die Sortierung auf Basis des Byte-Wertes „0“ bis „255“ des Feldes „Grund“ erfolgt und sich somit je nach Werteliste nicht unbedingt eine alphabetische Sortierung ergibt!
- Geben Sie in die Zeile „Feld:“ der nächsten Spalte den folgenden Ausdruck ein und stellen Sie unter „Funktion:“ entsprechend „Ausdruck“ ein:Fehltage:Summe(AnzahlArbeitstage([FehltageVon];[FehltageBis]))
Dieser Ausdruck ruft für jeden Datensatz die Funktion „AnzahlArbeitstage()“ mit dem aktuellen Zeitraum gemäß „FehltageVon“ und „Fehltage- Bis“ auf. Das Ergebnis ist die reine Anzahl an Arbeitstagen.
- Speichern Sie die Abfrage und lassen Sie sie testweise ausführen.
Das Ergebnis ist eine Auflistung der Fehltage, gruppiert nach Mitarbeiter und Grund der Abwesenheit.
Wenn Sie eine nach dem Abwesenheitsgrund gegliederte Übersicht benötigen, schieben Sie einfach die Spalte „Grund“ vor die Spalte „NV“. Die Abfrage zeigt dann zunächst beispielsweise alle Fehltage „Urlaub“ der einzelnen Mitarbeiter an, anschließend alle Fehltage mit dem Grund „Krank“, „Schulung“ etc.
Möchten Sie eine alphabetische Sortierung des Grundes vornehmen, geben Sie in die Zeile „Feld:“ des Feldes „Grund“ den folgenden Ausdruck ein und schalten die gewünschte Sortierung auf „Auf-/Absteigend“:
G: Wahl([Grund];“Urlaub“;“Schulung“;“Krank“;“Freier Tag“;“Unentschuldigt“)
Eine weitere Anforderung bei der Auswertung von Fehltagen ist eine Übersicht der Fehltage für einen bestimmten Grund und einen bestimmten Zeitraum. Das Problem dabei ist der Auswertungszeitraum: Wird dieser z. B. mit „Von: 1.4.2011“ und „Bis: 30.6.2011“ auf das zweite Quartal festgelegt und ein Mitarbeiter war vom 22.3.2011 bis 9.4.2011 krank oder hatte vom 21.6.2011 bis 9.7.2011 Urlaub, dürfen nur die in den Auswertungszeitraum fallenden Tage berücksichtigt werden.
Um das sicherzustellen, nutzen Sie in der Abfrage als Kriterium die Funktion „FehltageInZeitraum()“:
Public Function FehltageInZeitraum(ZeitraumVon As Date, _ZeitraumBis As Date, _FehltageVon As Date, _FehltageBis As Date) As Integer
Dieser Funktion (siehe Modul „modWerk-Arbeitstage“ in der Beispieldatenbank) werden als Parameter Start und Ende des Auswertungszeitraumes sowie Start und Ende der Fehltage übergeben. Das Ergebnis ist die Anzahl der Arbeitstage, bereinigt um Wochenenden und Feiertage, die aus dem Zeitraum „Fehltage“ in den Zeit – raum „Auswertung“ fallen.
Um beispielsweise eine Abfrage zu erstellen, die alle Fehltage „Krank“ für einen per Parameter festzulegenden Zeitraum auflistet, gehen Sie folgendermaßen vor:
- Erstellen Sie eine neue Abfrage auf Basis der Tabellen „Personal“ und „Fehltage“ und schalten Sie sie auf eine Gruppierungsabfrage um.
- Richten Sie zwei Parameter „Zeitraum von“ und „Zeitraum bis“ vom Datentyp „Datum/Zeit“ ein.
- Fügen Sie das Feld „Grund“ per Doppelklick in die Feldliste zum Abfrageentwurf hinzu, stellen Sie „Funktion“ auf „Gruppierung“ ein und geben Sie in die Zeile „Kriterien“ den folgenden Ausdruck ein:=3
Damit werden nur die Datensätze berücksichtigt, die im Feld „Grund“ den Inhalt „3/Krank“ haben. Für die Auswertung nach anderen Gründen geben Sie hier den entsprechenden Byte-Wert gemäß Werteliste an, also z. B. „1“ für „Urlaub“ oder „4“ für „Freier Tag“.
- Geben Sie in der nächsten Spalte in die Zeile „Feld:“ den folgenden Ausdruck ein und stellen Sie „Funktion:“ auf „Gruppierung“ sowie die „Sortierung“ auf „Aufsteigend“ ein:NV: [Nachname] & „, “ & [Vorname]
Damit fassen wir wieder Nach- und Vorname in einem Feld zusammen und lassen danach alphabetisch sortieren.
- Geben Sie in der nächsten Spalte in die Zeile „Feld:“ den folgenden Ausdruck ein und stellen Sie „Funktion“ auf „Summe“ um:Fehltage:FehltageInZeitraum([Zeitraumvon];[Zeitraum bis];[FehltageVon];[FehltageBis])
Weiterhin geben Sie für das Feld als Kriterium folgenden Ausdruck ein:
>0
Dieser Ausdruck ermittelt für jeden Datensatz die Anzahl der Fehltage, die möglicherweise in den per Parameter festgelegten Auswertungszeitraum fallen. Diese Anzahl von Tagen werden per „Summe“ pro Mitarbeiter addiert. Das Kriterium „>0“ stellt sicher, dass Mitarbeiter ohne Fehltage ausgeblendet werden.
- Speichern Sie die Abfrage und lassen Sie sie testweise ausführen.
Sie erhalten nun eine Liste für den jeweiligen Grund, wie beispielsweise „Krank“, mit den Namen und Fehltagen der betreffenden Mitarbeiter.
In der Beispieldatenbank finden Sie die Abfragen „Allgemeine Übersicht Fehltage, Sortierung Name“, „Allgemeine Übersicht Fehltage, Sortierung Grund“ und „Übersicht Fehltage, Grund und Zeitraum“, die diese Technik demonstrieren.
So werden Wochenenden und Feiertage in Abfragen berücksichtigt
Um Fehltage der Art „Krank vom 2.8.2010 bis 20.8.2010“ korrekt auswerten zu können, müssen Wochenenden und Feiertage berücksichtigt werden. Es ist also nicht möglich, einfach per „DatDiff(„d“;“[Von]“;“[Bis])“ eine Anzahl von Tagen zu berechnen. Das Ergebnis „19“ wäre falsch, da noch Wochenenden sowie eventuell in den Zeitraum fallende Feiertage abgezogen werden müssen.
In der Beispieldatenbank zu diesem Beitrag haben wir ein paar Funktionen für Berechnungen von Feier- und Arbeitstagen zusammengefasst. Sie finden hier die Tabelle „Feiertage“ sowie die Module „modWerkArbeitstage“ und „modFeiertage“. Die für eine korrekte Auswertung von Fehltagen wichtigste Funktion ist „AnzahlArbeitstage()“, die aus einem Zeitraum alle Wochenenden und Feiertage herausrechnet, sodass nur die tatsächlich zu berücksichtigenden Arbeitstage als Ergebnis geliefert werden. Wenn Sie diese Funktion in den Abfragen Ihrer eigenen Datenbanken verwenden möchten, sind die oben genannten Objekte in Ihre Datenbank zu übertragen. Möchten Sie die Tabelle „Feiertage“ zum Jahreswechsel um Feiertage des neuen Jahres erweitern, wechseln Sie in die VBA-Entwicklungsumgebung und geben im Direktbereich die folgende Anweisung ein:
FeiertageInTabelle „Feiertage“, „FTBezeichnung“, „FTDatum“, <Jahr>, „FTFaktor“
„<Jahr>“ ersetzen Sie dabei durch das betreffende Jahr, also 2013, 2014, 2015 usw. Die Tabelle wird dann mit den Feiertagen gefüllt. Individuelle, bundesland- oder kantonsspezifische Feiertage sind manuell nachzutragen.
Hinweise zur Lösung „Personalverwaltung“
Basis ist die Haupttabelle „Personal“, die über die Personalnummer mit einer Detailtabelle „Fehltage“ verknüpft ist. In dieser Detailtabelle werden pro Mitarbeiter Zeiträume „Von/Bis“ mit einem Grund wie „Urlaub“, „Krank“, „Schulung“ usw. gespeichert. Das Feld „Grund“ speichert einen Bytewert von „0“ bis „255“. Über „Nachschlagen“ ist ein Kombinationsfeld mit einer Werteliste als Basis definiert, dass die Auswahl vereinfacht. Vorgegeben sind folgende Werte bzw. Gründe, die Sie ggf. an eigene Anforderungen anpassen können:
1;Urlaub;2;Schulung;3;Krank;4;Freier Tag;5;Unentschuldigt
Der Standardwert für das Feld ist „0“, steht somit für „Nicht angegeben“ und wird per Gültigkeitsregel „<>0“ überprüft. Würde man hier als Standardwert beispielsweise „1“ für „Urlaub“ angeben, bestände die Gefahr, dass die Einstellung bei einer Neuerfassung unverändert übernommen und somit falsch gespeichert werden würde.
Wichtig: Wenn Sie die Werteliste des Feldes „Grund“ im Tabellenentwurf unter „Nachschlagen“ ändern, müssen Sie auch die Werteliste des Feldes „Grund“ im Unterformular „UF Fehltage“ anpassen! Access übernimmt die Änderungen aus dem Tabellenentwurf nicht automatisch in ggf. davon betroffene Steuerelemente in Formularen oder anderen Datenbankobjekten!
Für die Erfassung und Darstellung der Fehltage auf dem Register „Fehltage“ wird das Unterformular „UF Fehltage“ verwendet, das über das Feld „Personal-Nr“ mit dem Hauptformular „Personal“ verknüpft ist. Das Unterformular basiert auf der Abfrage „AF Fehltage“, die die Felder der Detailtabelle „Fehltage“ sortiert nach dem Feld „FehltageVon“ liefert. Dadurch ist sichergestellt, dass zum Beispiel ein nachträglich erfasster freier Tag oder ein in der Zukunft liegender Urlaub auch an der chronologisch korrekten Position im Unterformular angezeigt wird.