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

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar