Feiertage verwalten, Teil 2

Im ersten Teil dieser Artikelreihe haben Sie die Tabelle zum Speichern der Basisdaten der Feiertage sowie die Formulare zum Verwalten der Feiertage sowie für die Zuordnung zu den Bundesländern kennengelernt. Im vorliegenden zweiten Teil schauen wir uns an, wie die flexiblen Feiertage ermittelt werden und wie Sie aus den ermittelten Informationen eine Liste der Feiertage für einen bestimmten Zeitraum erstellen können.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1302_FeiertageErmitteln.mdb.

Fixe und flexible Feiertage

Die fixen Feiertage finden immer am gleichen Datum statt: Neujahr am 1. Januar, Heilige drei Könige am 6. Januar, der Maifeiertag am 1. Mai et cetera. Diese vermerken wir in der Tabelle tblFeiertageBasis, indem wir den Namen des Feiertags eintragen, den Tag und den Monat festlegen, das Feld TageBisStichtag leer lassen und das Feld FeiertagArt mit Datum konstant füllen (siehe Bild 1).

Basisdaten zu den Feiertagen

Bild 1: Basisdaten zu den Feiertagen

Für die flexiblen Feiertage, von denen es zwei Varianten gibt, tragen wir ebenfalls den Feiertagnamen ein. Für den Tag und den Monat legen Sie allerdings jeweils den Wert 0 fest. Dafür tragen Sie im Feld TageBisStichtag einen Zahlenwert ein, der angibt, wieviele Tage der Feiertag vor oder hinter dem jeweiligen fixen Tag liegt. Um festzulegen, um welche Variante der flexiblen Feiertage es sich handelt, tragen Sie unter Feiertagsart entweder Abstand zu Stichtag Ostersonntag konstant oder Abstand zu Stichtag Vierter Advent konstant ein.

Stichtage für flexible Feiertage

Nun benötigen wir noch die Stichtage für die beiden flexiblen Feiertage, und zwar für Ostersonntag und für den vierten Advent. Im Falle des vierten Advents ist dies einfach: Es handelt sich dabei um den letzten Sonntag vor dem ersten Weihnachtsfeiertag. Um diesen Stichtag zu berechnen, verwenden Sie die Funktion aus Listing 1. Die Prozedur erwartet die Zahl des zu untersuchenden Jahres als Parameter mit dem Datentyp Integer (für Werte bis 32.767) und liefert einen Wert des Typs Date zurück (siehe Bild 2).

Test der Funktion zum Ermitteln des vierten Advents

Bild 2: Test der Funktion zum Ermitteln des vierten Advents

Die Funktion füllt eine temporäre Variable namens datTemp mit einem Datum, dass dem 24. Dezember des angegebenen Jahres entspricht. Dazu setzt es die Zeichenkette 24.12. und die mit der Variablen lngJahr übergebene Jahreszahl zusammen und konvertiert den Ausdruck mit der Funktion CDate zu einem Datumswert zusammen.

Dies könnten Sie theoretisch auch mit der DateSerial-Funktion erledigen. Die entsprechende Zeile sieht dann wie folgt aus:

datTemp = DateSerial(intJahr, 12, 24)

Nun startet die Prozedur eine Do While-Schleife. Diese wird solange durchlaufen, bis der Wochentag des in datTemp gespeicherten Datums dem Sonntag entspricht. Innerhalb der Schleife zieht die Funktion mit jedem Durchlauf einen Tag vom Datum ab.

Im Jahr 2012 etwa fiel Heiligabend auf einen Montag, der vierte Advent dementsprechend auf den Sonntag davor. Die Funktion prüft beim ersten Aufruf der Do While-Zeile, ob der Wochentag des Datums den Wert vbSunday zurückliefert. Das ist im ersten Durchlauf des Beispiels für 2012 nicht der Fall, stattdessen liefert die Weekday(datTemp) für den 24.12.2012 den Wert 2 (vbMonday). Also ist die Abbruchbedingung nicht erfüllt und der in der Schleife enthaltene Befehl wird durchlaufen. Dieser subtrahiert vom in datTemp gespeicherten Wert die Zahl 1 – dies entspricht genau einem Tag (Tage sind ganze Zahlen, Uhrzeiten der Bereich hinter dem Komma). Im nächsten Durchlauf hat datTemp den Wert 23.12.2012 und Weekday liefert den gewünschten Wert 1 (vbSunday). Die Abbruchbedingung ist erfüllt und die Schleife wird kein weiteres Mal durchlaufen.

Schließlich stellt die Funktion datTemp als Wert der Rückgabevariablen VierterAdvent ein (gleichzeitig Funktionsname).

Berechnung des Datums des Ostersonntags

Die Berechnung des Ostersonntags ist etwas komplizierter als die des vierten Advents. Um ehrlich zu sein: Wir sollten die Formel zur Berechnung, die durch die Funktion aus Listing 2 abgebildet wird, einfach hinnehmen.

Public Function Ostersonntag(intJahr As Integer) As Date
     Dim a As Integer
     Dim b As Integer
     Dim c As Integer
     Dim d As Integer
     Dim e As Integer
     Dim intTag As Integer
     Dim intMonat As Integer
     a = intJahr Mod 19
     b = intJahr Mod 4
     c = intJahr Mod 7
     d = (19 * a + 24) Mod 30
     e = (2 * b + 4 * c + 6 * d + 5) Mod 7
     intTag = 22 + d + e
     intMonat = 3
     If intTag > 31 Then
         intTag = d + e - 9
         intMonat = 4
     End If
     Ostersonntag = intTag & "." & intMonat & "." & intJahr
End Function

Listing 2: Berechnung des Datums des Ostersonntags

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar