André Minhorst, Duisburg
Microsoft bietet ein eigenes Kalendersteuerelement an, das in beliebige Formulare eingebaut werden kann. Das ist an sich sehr praktisch und auch zügig erledigt, kann aber schnell zum Selbsttor werden: Wenn Sie eine Anwendung mit integriertem Kalendersteuerelement weitergeben, kann es schnell passieren, dass die Anwendung unbedienbar wird, weil das entsprechende OCX-Steuerelement fehlt. Das Steuerelement wird nämlich keinesfalls einfügt, sondern nur verknüpft. Es muss auf jedem Rechner vorhanden sein, auf dem die Anwendung laufen soll. Damit Sie keine Probleme damit haben, programmieren Sie einfach ein eigenes Kalendersteuerelement, das außerdem noch zusätzliche Funktionen aufweist.
Das Kalendersteuerelement dient der Anzeige und Auswählen von Datumsangaben. Das Hauptaugenmerk liegt dabei auf der vereinfachten Eingabe.
Wenn Sie dem Benutzer eine Eingabemaske zur Auswahl des gewünschten Datums zur Verfügung stellen, haben Sie die volle Kontrolle darüber, dass dieses auch im richtigen Format eingegeben wird.
Bild 1: Das Kalendersteuerelement von Microsoft
Microsoft stellt ein Kalendersteuerelement zur Verfügung, das zur Eingabe des Datums zwei Kombinationsfelder zur Auswahl von Monat und Jahr sowie den ausgewählten Daten angepasstes Kalenderblatt zur Auswahl des Tages bereitstellt (siehe Bild 1).
Leider ergeben sich immer wieder Schwierigkeiten beim Einsatz dieses Steuerelements. Die meisten davon treten auf, wenn eine Datenbankanwendung, die auf dieses Steuerelement zugreift, auf andere Rechner übertragen werden soll. Es kann dann vorkommen, dass das Kalendersteuerelement nicht in der richtigen Version oder gar nicht vorhanden ist.
Wer Datenbanken für andere entwickelt, kennt die daraus resultierenden Probleme. Diese können natürlich auch mit dem Kalendersteuerelement von Microsoft gelöst werden, aber auf Nummer Sicher gehen Sie mit einer Lösung, die komplett auf externe Komponenten verzichtet. Daher lernen Sie im vorliegenden Beitrag, wie Sie ein Kalenderformular zur Auswahl und Anzeige von Datumsangaben erstellen und dieses in Ihre eigenen Anwendungen integrieren können.
Das Kalenderformular soll wie in Bild 2 aufgebaut sein. Der Aufbau behebt einige ergonomische Schwächen des Kalendersteuerelements. So können die Monate und Jahre über ein Listenfeld ausgewählt werden, was bei den Monaten immer und bei den Jahren in den meisten Fällen zumindest den Klick zum öffnen des Kombinationsfeldes spart.
Außerdem ist die Anordnung der Steuerelemente so gestaltet, dass Tag, Monat und Jahr in der in Deutschland üblichen Reihenfolge ausgewählt werden können.
Daneben wird bei dem OCX nach der Auswahl eines anderen Monats oder Jahres der ausgewählte Tag wieder aufgehoben, was sehr nervend sein kann, wenn man nicht weiß, dass zuerst Monat und Jahr und dann erst der Tag ausgewählt werden soll. Die selbst gebaute Lösung soll auch dieses Manko beheben.
Bild 2: Das selbst gebaute Kalendersteuerelement
Das Formular besteht aus den beiden Listenfeldern für die Auswahl von Monat und Jahr, einer Schaltfläche zum Bestätigen der Auswahl sowie aus 42 Bezeichnungsfeldern für die Auswahl des Tages.
Warum nun 42 Bezeichnungsfelder für nur maximal 31 Tage Eine Woche wird in einer Zeile angezeigt und eventuell passt gerade ein Tag in die erste Zeile. Wenn nicht gerade Februar ist, werden in dem Fall vier volle und zwei angefangene Zeilen benötigt – und sechs Zeilen mit je sieben Feldern ergeben 42 Felder.
Auswahl der Monate
Das Listenfeld namens lstMonate zur Auswahl der Monate ist nicht gebunden und hat eine Wertliste als Datenherkunft. Die Wertliste hat folgenden Inhalt:
1;"Januar";2;"Februar";3;"März";4;"April";5;"Mai";6;"Juni";7;"Juli";8;"August";9;"September";10;"Oktober";11;"November";12;"Dezember"
Damit nicht die Monatszahlen, sondern nur Monatsnamen im Listenfeld angezeigt werden, stellen Sie die Eigenschaften Spaltenanzahl und Spaltenbreiten auf die Werte 2 und 0 ein.
Richten Sie die Höhe des Listenfeldes so ein, dass alle zwölf Monate gleichzeitig zu sehen sind.
Auswahl der Jahre
Das Listenfeld zur Auswahl der Jahre heißt lstJahre und hat ebenfalls eine Wertliste als Datensatzherkunft.
Den Inhalt der Wertliste können Sie in Abhängigkeit von der Verwendung beliebig festlegen. Die Wertliste der Beispieldatenbank enthält beispielsweise alle Jahre von 1900 bis 2050. Das sollte für die Lebensdauer dieses Formulars und alle Anwendungen ausreichend sein.
Falls Sie keine Lust haben, eine solch umfangreiche Wertliste manuell zu erstellen, legen Sie sich einfach eine kleine Funktion in einem Modul Ihrer Wahl an und lassen Sie das Ergebnis im Testfenster ausgeben:
Public Function Jahre() Dim str As String For i = 1900 To 2050 str = str & i & ";" Next i Jahre = str End Function
Anschließend kopieren Sie die Zeichenfolge in die entsprechende Eigenschaft.
Auswahl der Tage
Die Auswahl der Tage könnte zwar auch mit einem Listen- oder Kombinationsfeld erledigt werden, aber auf Grund der vielen Informationen, die dort schwer unterzubringen sind, ist die hier gewählte Variante wesentlich ergonomischer und übersichtlicher.
Legen Sie zunächst sieben Bezeichnungsfelder für die Bezeichnungen der einzelnen Wochentage an. Diese können Sie dann sechs Mal in die jeweils darunter liegende Zeile kopieren.
Vergeben Sie entsprechend der Zeile und der Spalte die Namen für die Bezeichnungsfelder in der Form date<Zeile><Spalte>. Das linke obere Bezeichnungsfeld heißt also beispielsweise date11, das rechte obere date16 und so weiter.
Stellen Sie den Wert der Eigenschaft Hintergrund auf Normal ein, damit später änderungen der Hintergrundfarbe auch sichtbar werden – bei Verwendung eines transparenten Hintergrunds können Sie die Farbe nämlich ändern, ohne dass sich etwas tut.
Um die Beschriftung müssen Sie sich noch keine Gedanken machen, da diese ohnehin von der Kombination aus Monat und Jahr abhängt.
Speichern des ausgewähltenDatums
Das ausgewählte Datum wird zu jedem Zeitpunkt in einem Textfeld namens txtDatum gespeichert. Dieses Textfeld soll unsichtbar sein; stellen Sie daher den Wert der Eigenschaft Sichtbar auf Nein ein.
Damit das Kalenderformular auch Feiertage anzeigen kann, müssen die entsprechenden Daten zur Verfügung stehen. Im Beitrag Feiertage berechnen mit Access in Ausgabe 6/2001 von Access im Unternehmen erfahren Sie, wie Sie eine Tabelle namens Feiertage erstellen und bundeslandabhängig mit Feiertagsbezeichnungen und deren Daten füllen (siehe Bild 3).
Bild 3: Die Tabelle Feiertage
Dabei können Sie auch angeben, für welchen Zeitraum die Anwendung die Feiertagsdaten in die Tabelle schreiben soll. Passen Sie diesen Zeitraum den in der Wertliste des Listenfeldes lstJahre enthaltenen Jahren an.
Der letzte Schritt bei der Erstellung des Kalenderformulars besteht im Hinzufügen der Ereignisprozeduren, um die einzelnen Steuerelemente zum Leben zu erwecken.
Die Prozeduren werden nachfolgend in der Reihenfolge beschrieben, in der sie beim öffnen und Anwenden des Formulars verwendet werden.
Anzeigen des Formulars
Stellen Sie sich das Formular zunächst als eine Blackbox vor, die unter Angabe eines initialen Datums aufgerufen wird und nach der Auswahl das gewünschte Datum in einem Textfeld bereithält. Die folgende Funktion überprüft zunächst, ob das Kalenderformular bereits geöffnet ist, und schließt es gegebenenfalls kurz. Dazu verwendet es die Funktion IstFormularGeoeffnet (siehe Beitrag überprüfen, ob Formular geöffnet ist im Bereich Formulare unter www.access-im-unternehmen.de).
Anschließend wird das Formular mit dem gewünschten Datum als öffnungsargument als Dialog aufgerufen. Das bedeutet, dass die aufrufende Funktion angehalten wird, bis das Formular geschlossen oder ausgeblendet wird.
Public Function DatumErmitteln(Datum As Date) As Date If istformulargeoeffnet("frmKalender") Then DoCmd.Close acForm, "frmKalender" End If DoCmd.OpenForm "frmKalender", Windowmode:=acDialog, OpenArgs:=Datum If istformulargeoeffnet("frmKalender") Then DatumErmitteln = Forms!frmKalender!txtDatum Else DatumErmitteln = Datum End If DoCmd.Close acForm, "frmKalender" End Function
Quellcode 1
Nach dem Ausblenden des Formulars wird erneut überprüft, ob das Formular noch geöffnet ist und gegebenenfalls das neue Datum ausgelesen. Ist das Formular nicht mehr geöffnet, wird das Eingangsdatum als Ergebnis zurückgegeben (s. Quellcode 1).
Private Sub Form_Current() Dim Datum As Date If IsNull(Me.OpenArgs) Then AktuellesDatum = Date Else AktuellesDatum = Me.OpenArgs End If Me.txtDatum = AktuellesDatum Me.lstJahr = Year(AktuellesDatum) Me.lstMonat = Month(AktuellesDatum) KalenderAufbauen End Sub
Quellcode 2
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