Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2012.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Lernen Sie eine Klasse kennen, mit der Sie Datumsfelder um interessante Funktionen erweitern.

Techniken

Klassen, VBA

Voraussetzungen

Access 2000 und höher

Beispieldateien

DatumsfeldMitKlasse.mdb

Shortlink

www.access-im-unternehmen.de/831

Datumsfelder mit Klasse

André Minhorst, Duisburg

Datumsangaben können Sie von Hand eingeben, mit einem Steuerelement zur Auswahl des gewünschten Datums - oder Sie statten das Textfeld mit dem Datum mit unserer Klasse clsDatebox aus und stellen das Datum ganz einfach mit den Cursor-Tasten ein. Dazu benötigen Sie nicht mehr als zwei Zeilen Code pro Textfeld, dass Sie mit dieser Funktion ausstatten wollen - und die hier vorgestellte Klasse.

Schnelle Datumseingabe

Die Datumseingabe lässt sich prima vereinfachen, wenn Sie dazu nur die Cursor-Tasten verwenden. Die hier vorgestellte Lösung macht die möglich: Sie markiert beim Fokuserhalt eines entsprechend präparierten Datumfeldes einen der Datumsbestandteile wie den Tag, den Monat oder das Jahr. Mit den beiden Tasten Nach links und Nach rechts springen Sie zum vorherigen beziehungsweise folgenden Datumsbestandteil, mit den Tasten Nach oben und Nach unten ändern Sie den Wert jeweils um eins nach oben oder untern.

Wer es besonders eilig hat, hält dabei noch die Strg-Taste gedrückt und ändert den aktuellen Wert gleich um zehn nach oben oder unten. Zu beachten ist, dass etwa beim Ändern des Tages von 31 auf 01 auch der Monat geändert wird, also etwa von 01 auf 02. Gleiches gilt, wenn Sie den Monat von 12 auf 01 oder von 01 auf 12 ändern - in diesem Fall wird das Jahr um eins erhöhat oder vermindert. Wie dies in einem Formular aussieht, sehen Sie in Abb. 1.

pic001.png

Abb. 1: Schnelles Ändern des Datums per Cursor-Taste

Das Textfeld markiert immer den kompletten Datumsteil, also entweder den Tag, den Monat oder das Jahr. Die manuelle Eingabe des Datums ist nicht möglich, Sie können dies nur mit den Cursortasten erledigen. Dies beugt Fehleingaben vor.

Wenn das Textfeld über die Tabulator- oder die Eingabetaste angesteuert wird, markiert es direkt den kompletten Tag. Wenn der Benutzer mit der Maus hineinklickt, wird der angeklickte Datumsteil markiert.

Technik einsetzen

Das Beste an der nachfolgend vorgestellten Technik ist: Sie statten ein Textfeld blitzschnell mit der dafür nötigen Klasse und ein oder zwei Konfigurationseinstellungen aus. Dazu gehen Sie wie folgt vor:

  • Legen Sie das gebundene oder ungebundene Feld zur Datumseingabe an, zum Beispiel txtDatum.
  • Stellen Sie die Eigenschaft Beim Laden des Formulars mit dem Textfeld auf [Ereignisprozedur] ein und klicken Sie auf die Schaltlfäche mit den drei Punkten, um eine entsprechende Ereignisprozedur zu erstellen.
  • Ergänzen Sie den Code wie folgt. Fertig!

Dim WithEvents objDatebox As clsDatebox

Private Sub Form_Load()

    Set objDatebox = New clsDatebox

    Set objDatebox.Datebox = Me!txtDatum

End Sub

Damit erstellen Sie ein neues Objekt auf Basis der Klasse clsDatebox und stellen seine Eigenschaft Datebox auf das betroffene Textfeld ein. Nach dem Öffnen des Formulars steht die Funktion bereits zur Verfügung!

Das ist allerdings noch nicht alles, was Sie zur Inbetriebnahme wissen müssen. Eine Information betrifft den Standardwert für das Datumsfeld.

Wenn Sie selbst keinen Standardwert vergeben, wird das Feld beim Anzeigen mit dem aktuellen Datum vorbelegt.

Sollten Sie einen Standardwert in der Tabellendefinition hinterlegt haben oder die Eigenschaft Standardwert des Textfelds im Formular eingestellt haben, wird dieser verwendet. Sie können allerdings eine zweite Eigenschaft der Klasse verwenden, um den Standardwert per Code vorzugeben:

Private Sub Form_Load()

    Set objDatebox = New clsDatebox

    objDatebox.DefaultDate = "23.1.1971"

    Set objDatebox.Datebox = Me!txtDatum

End Sub

Die Zeile mit der Zuweisung des Datums an die Eigenschaft DefaultDate muss jedoch vor der Zuweisung des zu verwendenden Steuerelements erfolgen.

Mehrere Datumsfelder

Wenn Sie mehrere Datumsfelder in einem Formular mit der Datebox ausstatten möchten (s. Abb. 2), deklarieren Sie zunächst entsprechende Objektvariablen für die Objekte:

pic002.png

Abb. 2: Entwurf eines Formulars mit Von-Bis-Textfeldern

Dim WithEvents objDateboxVon As clsDatebox

Dim WithEvents objDateboxBis As clsDatebox

Dann füllen Sie diese Objektvariablen mit neuen Instanzen der Klasse und weisen die Standardwerte und die Textfelder zu:

Private Sub Form_Load()

    Set objDateboxVon = New clsDatebox

    objDateboxVon.DefaultDate = Date

    Set objDateboxVon.Datebox = Me!txtVon

    Set objDateboxBis = New clsDatebox

    objDateboxBis.DefaultDate = Date

    Set objDateboxBis.Datebox = Me!txtBis

End Sub

Fertig! Und nun kommen wir zu einem weiteren interessanten Feature: Das Ändern des Datums löst nämlich ein Ereignis aus - deshalb werden die Objektvariablen auch mit dem Schlüsselwort WithEvents deklariert.

Dadurch können Sie die soeben deklarierten Objekte objDateboxVon und objDateboxBis im linken Kombinationsfeld des VBA-Fensters des Formularmoduls auswählen, was automatisch die einzige Ereignisprozedur dieser beiden Objekte anlegt (s. Abb. 3).

pic003.png

Abb. 3: Anlegen der Ereignisprozedur für das clsDatebox-Objekt

Wozu benötigen Sie diese Prozedur? Nun, zum Beispiel können Sie so direkt beim Einstellen des Datums prüfen, ob das Startdatum größer als das Enddatum ist, was in den meisten Fällen unerwünscht ist.

Dann füllen Sie die Ereignisprozedur DateChange der beiden Objekte objDateboxVon und objDateboxBis wie folgt:

Private Sub objDateboxVon_DateChange()

    If Me!txtVon.Value > Me!txtBis.Value Then

        Me!txtBis.Value = Me!txtVon.Value

    End If

End Sub

Private Sub objDateboxBis_DateChange()

    If Me!txtBis.Value < Me!txtVon.Value Then

        Me!txtVon.Value = Me!txtBis.Value

    End If

End Sub

Wenn der Benutzer nun für das Textfeld txtDatumVon einen Datumswert einstellt, der größer ist als der im Textfeld txtDatumBis, wird txtDatumBis automatisch auf den Wert von txtDatumVon einstellt und umgekehrt.

Dies birgt einen kleinen Haken: Wenn das jeweils andere Textfeld nur den Standardwert anzeigt und noch kein Wert festgelegt wurde, liefert der Vergleich Me!txtVon > Me!txtBis einen falschen Wert.

Warum das? Weil die Eigenschaft Standardwert immer eine Zeichenkette liefert. Das mit der Datebox eingestellte Datum hat jedoch den Datentyp Datum, was intern als Zahl gespeichert wird.

Um ein korrektes Ergebnis zu erhalten, wird der Wert des Vergleichsfeldes noch in ein Datum konvertiert:

If Me!txtVon > Cdate(Me!txtBis) Then

Danach können Sie ausschließen, das der Benutzer für das Start- und das Enddatum nicht miteinander vereinbare Werte eingibt.

Programmierung des Klassenmoduls clsDatebox

Wenn die Ausstattung eines oder mehrerer Textfelder so einfach von statten geht, sollte die verwendete Klasse doch recht komplex sein. In der Tat hält sich die Komplexität jedoch im Rahmen, wie die folgenden Abschnitte zeigen werden.

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.