Zeiträume komfortabel auswählen

Die Auswahl von Zeiträumen erfolgt üblicherweise durch das Eingeben zweier Datumsangaben in entsprechende Textfelder. Gegebenenfalls unterstützt die Anwendung den Benutzer noch durch das Bereitstellen einer Schaltfläche zum öffnen eines Kalenders, aus dem sich die gewünschten Daten einfach auswählen lassen. Das reicht für viele Fälle aus, zum Beispiel bei denen, die nach individuellen Zeiträumen ohne Regelmäßigkeiten verlangen.

Die im Beitrag Kassenbuch (s. Shortlink 486) vorgestellte Lösung dient der Verwaltung von Buchungsvorgängen, die beispielsweise als Grundlage für die Erstellung verschiedener Steuererklärungen wie etwa der Umsatzsteuervoranmeldung oder auch als übersicht über die angefallenen Ein- und Ausgänge dienen.

Bei der Auswertung geht es dort meist um fest definierte Zeiträume: Umsatzsteuervoranmeldungen reicht man vierteljährlich oder monatlich ein, eine Einnahme-überschuss-Rechnung erstreckt sich über ein Kalenderjahr und auch für individuelle übersichten kommen wohl feste Intervalle wie Wochen, Monate, Quartale oder Jahre zum Tragen.

Das Formular aus Bild 1 berücksichtigt dies: Damit kann der Benutzer zunächst die Art des Intervalls festlegen (Woche, Monat, Quartal oder Jahr), dann das Intervall selbst auswählen und schließlich den ausgewählten Zeitraum in den beiden unteren Textfeldern des Formulars manuell anpassen.

abb001.tif

Bild 1: Das Formular zur
komfortablen Auswahl von Zeiträumen

Die Anzahl der in den Kombinationsfeldern vorgegebenen Intervalle, das jeweilige Standardintervall sowie das angezeigte Start- und Enddatum können Sie beim öffnen des Formulars festlegen – dazu später mehr.

Um Fehleingaben zu verhindern, validiert das Formular den Inhalt der beiden Textfelder und gibt Meldungen aus, wenn eines der beiden Textfelder kein Datum enthält oder das Datum im ersten Textfeld hinter dem des zweiten Textfeldes liegt.

Zeitraumformular im Einsatz

Das Formular können Sie ganz gewöhnlich über einen Doppelklick auf den Eintrag im Datenbankfenster oder in der Navigationsleiste (Access 2007) öffnen. Nach der Auswahl des gewünschten Zeitraums schaltet das Betätigen der OK-Schaltfläche das Formular unsichtbar. Die aufrufende Routine kann nun noch den Inhalt der beiden Textfelder mit dem ersten und dem letzten Tag auslesen und sollte das Formular dann schließen.

Das Formular enthält aber zusätzlich einige öffentliche Eigenschaften, mit denen Sie dieses beim öffnen konfigurieren können. Das zieht allerdings nach sich, dass Sie es nicht wie üblich mit DoCmd.OpenForm öffnen, sondern es wie eine Klasse instanzieren.

Betrachten Sie zunächst, was passiert, wenn Sie das Formular ganz einfach mit der folgenden Anweisung öffnen:

DoCmd.OpenForm "frmZeitraumAuswaehlen"

Diese Anweisung benötigt den Parameter WindowMode:=acDialog nicht, denn seine Eigenschaften Popup und Modal sind bereits auf Ja eingestellt, was den gleichen Effekt hat: Das Formular gibt den Fokus erst beim Schließen oder Einstellen der Sichtbar-Eigenschaft auf Nein wieder an andere Access-Elemente ab.

Der Aufruf des Formulars löst zunächst das Ereignis Beim öffnen und damit die Prozedur aus Listing 1 aus. Diese Routine stellt eine ganze Reihe von Eigenschaften ein und speichert diese in passenden Variablen, die später ausgelesen werden. Bei diesen Eigenschaften handelt es sich beispielsweise um die beim Start anzuzeigenden Intervalle für die vier verfügbaren Zeitraum-Varianten Woche, Monat, Quartal und Jahr.

Private Sub Form_Open(Cancel As Integer)
mZeitraum = eWoche mWoche = Kalenderwoche(Date) mMonat = Month(Date) mQuartal = Format(Date, "q") mJahr = Year(Date) mWochenVergangenheit = 52 mWochenZukunft = 52 mMonateVergangenheit = 12 mMonateZukunft = 12 mQuartaleVergangenheit = 12 mQuartaleZukunft = 12 mJahreVergangenheit = 20 mJahreZukunft = 20 mStartdatum = Date mEnddatum = Date mReferenzdatum = Date Me!cboWoche.RowSourceType = "Wochen" Me!cboWoche.Requery Me!cboMonat.RowSourceType = "Monate" Me!cboMonat.Requery Me!cboQuartal.RowSourceType = "Quartale" Me!cboQuartal.Requery Me!cboJahr.RowSourceType = "Jahre" Me!cboJahr.Requery ZeitraumAktualisieren End Sub

Diese hängen entsprechend Listing 1 vom aktuellen Datum ab: Die im Kombinationsfeld cboWoche angezeigte Kalenderwoche soll zum Beispiel die Woche sein, in der sich das mit Date ermittelte aktuelle Datum befindet. Neben diesen „Standardwerten“ soll auch die Anzahl der verfügbaren Werte je Kombinationsfeld einstellbar sein. So enthalten beispielsweise die beiden Variablen mWochenVergangenheit und WochenZukunft die Anzahl der Einträge im Kombinationsfeld cboWochen, die das Kombinationsfeld zusätzlich zur in mWoche gespeicherten Kalenderwoche auflisten soll.

Schließlich weist die Form_Open-Routine den vier Kombinationsfeldern noch die Werte für die Eigenschaft Herkunftstyp (RowSourceType) zu und sorgt mit der Requery-Methode dafür, dass die Kombinationsfelder bei nächster Gelegenheit aktualisiert werden. Die Werte der RowSourceType-Eigenschaft der vier Kombinationsfelder entsprechen vier passenden VBA-Funktionen, die die Kombinationsfelder bei Bedarf füllen. Wie diese so genannten Callback-Funktionen genau funktionieren und welche Alternativen es gibt, lesen Sie im Beitrag Kombinationsfelder dynamisch füllen (Shortlink 476).

Die letzte Anweisung der Form_Open-Prozedur ruft die Routine ZeitraumAktualisieren auf (s. Listing 2). Diese wird nicht nur hier, sondern auch später nach jeder Aktualisierung der Optionsgruppe zum Auswählen des Intervalltyps und des Intervalls ausgeführt. Die erste Aktion dieser Routine ist die Prüfung der aktuell ausgewählten Option und die daraus folgende Aktivierung beziehungsweise Deaktivierung der Kombinationsfelder – wobei das zur aktuell ausgewählten Option gehörende Kombinationsfeld natürlich aktiviert und die anderen deaktiviert werden.

Listing 2: Diese Routine sorgt für die Auswertung der Optionen und Kombinationsfeldinhalte zum Füllen der Textfelder zur Angabe des Start- und Enddatums des festgelegten Intervalls.

Private Sub ZeitraumAktualisieren()
Dim byteWoche As Byte Dim byteMonat As Byte Dim intJahr As Integer With Me!ogrZeitraum Me!cboWoche.Enabled = .value = 1 Me!cboMonat.Enabled = .value = 2 Me!cboQuartal.Enabled = .value = 3 Me!cboJahr.Enabled = .value = 4 End With Select Case ogrZeitraum.value Case 1 byteWoche = Split(Me!cboWoche, "/")(0) intJahr = Split(Me!cboWoche, "/")(1) Me!txtStartdatum = MontagEinerKalenderwoche(byteWoche, intJahr) Me!txtEnddatum = DateAdd("d", 6, Me!txtStartdatum) Case 2 byteMonat = Split(Me!cboMonat, "/")(0) intJahr = Split(Me!cboMonat, "/")(1) Me!txtStartdatum = CDate("1." & byteMonat & "." & intJahr) Me!txtEnddatum = DateAdd("d", -1, DateAdd("m", 1, Me!txtStartdatum)) Case 3 byteMonat = Split(Me!cboQuartal, "/")(0) * 3 intJahr = Split(Me!cboQuartal, "/")(1) Me!txtStartdatum = QuartalsbeginnErmitteln("1." & byteMonat & "."
& intJahr) Me!txtEnddatum = QuartalsendeErmitteln("1." & byteMonat & "." & intJahr) Case 4 intJahr = Me!cboJahr Me!txtStartdatum = CDate("1.1." & intJahr) Me!txtEnddatum = CDate("31.12." & intJahr) Case 5 Me!txtStartdatum = mStartdatum Me!txtEnddatum = mEnddatum End Select
End Sub

Das folgende Select Case-Konstrukt enthält fünf Case-Bedingungen, die mit den fünf Optionen der Optionsgruppe ogrZeitraum korrespondieren. Sie ermitteln den jeweils aktuellen Inhalt des zurzeit aktiven Kombinationsfeldes und leiten daraus den in den beiden Textfeldern txtStartdatum und txtEnddatum anzuzeigenden Zeitraum ab.

Am Beispiel der Kalenderwoche sieht das so aus: Zunächst speichern zwei Variablen die in einem Ausdruck wie 25/2007 enthaltenen Informationen, nämlich die Woche (25) und das Jahr (2007). Das Startdatum ermittelt daraus dann die VBA-Funktion MontagEinerKalenderwoche, das Enddatum die Funktion SonntagEinerKalenderwoche. Das Füllen der Textfelder für die anderen Optionen erfolgt auf ähnliche Weise. Lediglich die fünfte Variante weicht ab: Sie sieht vor, dass die aufrufende Routine ein Start- und ein Enddatum vorgeben kann – dazu jedoch später mehr.

Die Callback-Funktionen zum Füllen der Kombinationsfelder sind ebenfalls alle vier ähnlich aufgebaut, daher soll dieser Beitrag nur eine davon beispielhaft vorstellen.

Dabei handelt es sich um diejenige zum Füllen des Kombinationsfeldes cboMonate. Callback-Funktionen, deren Name als Wert der Eigenschaft RowSourceType eines Kombinationsfeldes angegeben ist, müssen einer bestimmten Syntax gehorchen und werden mehrfach mit unterschiedlichen Parameterwerten aufgerufen, die in den einzelnen Teilen des Select Case-Konstrukts abgearbeitet werden.

Im Fall der Routine aus Listing 3 wird zunächst der acLBInitialize-Teil ausgeführt, der lediglich den im Kombinationsfeld anzuzeigenden Wert entsprechend der voreingestellten oder der von der aufrufenden Routine übergebenen Informationen einstellt.

Listing 3: Füllen eines der Kombinationsfelder per Callback-Funktion

Function Monate(fld As control, ID As Variant, row As Variant, col As Variant, _
code As Variant) As Variant
Select Case code
Case acLBInitialize Monate = True fld = mMonat & "/" & mJahr
Case acLBOpen Monate = Timer
Case acLBGetRowCount Monate = 1 + mMonateVergangenheit + mMonateZukunft
Case acLBGetColumnCount Monate = 1
Case acLBGetColumnWidth Monate = -1
Case acLBGetValue Monate = format(DateAdd("m", row - mMonateVergangenheit, _
mReferenzdatum), "m\/yyyy")
End Select
End Function

Der acLBGetRowCount-Teil legt die Anzahl der anzuzeigenden Listeneinträge fest, die sich aus der Summe aus dem aktuellen, soeben festgelegten Element, den vorherigen und den nachfolgenden Intervallen rekrutiert.

Fehlt noch acLBGetValue: Dieser Teil liefert die Werte für das Kombinationsfeld, indem er mit dem Parameter row als „Laufvariable“ und der DateAdd-Funktion die benötigten Werte wie 1/2007, 2/2007, 3/2007 … zusammenstellt.

Für die Grundausstattung fehlt nur noch die Routine, die durch die OK-Schaltfläche ausgelöst wird: Diese validiert die in den beiden Textfeldern txtStartdatum und txtEnddatum enthaltenen Informationen und macht – soweit beide Felder gültige Datumswerte enthalten und das Startdatum nicht hinter dem Enddatum liegt – das Formular unsichtbar, sodass die aufrufende Routine die in den Textfeldern enthaltenen Werte auslesen und das Formular endgültig schließen kann.

Zusätzlicher Komfort

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

Schreibe einen Kommentar