Formatassistent für Textfelder

Access liefert standardmäßig bereits einige Assistenten mit. Für die Format-Eigenschaft jedoch liefert es nur ein Auswahlfeld mit einigen voreingestellten Optionen wie verschiedneen Zeit-, Zahlen und Boolean-Formaten. Diese dienen durchaus als gute Beispiele, wie man selbst Formatierungen vornehmen kann, aber wenn man sich dann an diese Aufgabe begibt, wird schnell ein ziemliches Experimentieren daraus. Um diesen Teil zu vereinfachen, wollen wir Sie mit einem Assistenten unterstützen. Dieser soll direkt über das Eingabefenster für die Format-Eigenschaft geöffnet werden und die Möglichkeit bieten, verschiedene Werte einzugeben und diese mit dem geünwschten Formatierungsausdruck zu testen. Und natürlich finden Sie in diesem Beitrag die Anleitung, wie Sie den Assistenten selbst erstellen können!

Die Format-Eigenschaft

Die Eigenschaft Format kennen Sie von verschiedenen Situationen. Das erste Mal begegnet sie einem beim Erstellen einer neuen Datenbankanwendung bereits im Tabellenentwurf für neue Felder beispielsweise des Datentyps Kurzer Text (siehe Bild 1). An dieser Stelle finden wir noch nicht einmal eine Auswahlliste mit verschiedenen Optionen vor, sodass wir zu eigenen Versuchen mit den verschiedenen Platzhaltern und Möglichkeiten der Format-Eigenschaft angehalten sind.

Format-Eigenschaft im Tabellenentwurf

Bild 1: Format-Eigenschaft im Tabellenentwurf

Erstellen wir Abfragen auf Basis einer solchen Tabelle, finden wir hier ebenfalls die Möglichkeit, die Format-Eigenschaft zu setzen. Damit würden wir eventuelle Einstellungen aus der zugrunde liegenden Tabelle überschreiben. Auch hier finden wir keine Unterstützung zum Zusammenstellen der Ausdrücke für die Format-Eigenschaft.

Damit landen wir bei den Formularen, wo wir Steuerelemente auf Basis der Felder der als Datensatzquelle verwendeten Tabelle oder Abfrage hinzufügen. Auch hier finden wir die Eigenschaft Format vor. Allerdings sehen wir an dieser Stelle bereits ein reichlich gefülltes Auswahlfeld für verschiedene Formatierungen (siehe Bild 2).

Auswahl verschiedener Formate

Bild 2: Auswahl verschiedener Formate

Wenn wir nun an der einen oder anderen Stelle einen Format-Ausdruck festlegen wollen, der die im Feld gespeicherten Daten in der gewünschten Art formatiert, müssen wir in die Entwurfsansicht wechseln, den Format-Ausdruck definieren, zurück zur Datenblattansicht wechseln, prüfen, ob der Format-Ausdruck die gewünschte Ansicht liefert und falls nicht, wieder zurück zur Entwurfsansicht wechseln, um den Wert der Format-Eigenschaft weiter zu optimieren.

Es gibt in Formularen eine Möglichkeit, den Formatausdruck für ein Feld ohne ständiges Wechseln zwischen Formular- und Entwurfsansicht zu testen. Dabei handelt es sich um die Layout-Ansicht. Hier können wir das betroffene Feld markieren und die Eigenschaft Format anpassen, während die Formatierung direkt auf die aktuell angezeigten Daten angewendet wird (siehe Bild 3).

Anpassen von Formaten in der Layoutansicht von Formularen

Bild 3: Anpassen von Formaten in der Layoutansicht von Formularen

In Tabellen und Abfragen steht diese Möglichkeit allerdings nicht zur Verfügung, sodass wir mit dem hier vorgestellten Assistenten eine alternative Lösung anbieten wollen. Der Assistent soll außerdem noch einen weiteren Mehrwert bieten: Er soll mehrere Werte gleichzeitig inklusive der formatierten Version anzeigen können.

Grundgerüst des Assistenten

Die grundlegende Vorgehensweise beim Erstellen eines Eigenschafts-Assistenten, wie wir ihn hier beschreiben, finden Sie im Beitrag Eigenschaftsassistenten oder Property Wizards (www.access-im-unternehmen.de/****). Im vorliegenden Beitrag beschreiben wir nur kurz die Anwendung der dort vorgestellten Techniken anhand unserer konkreten Umsetzung.

Als Erstes benötigen wir eine Tabelle namens USysRegInfo, welche die Daten für die Registrierung des Assistenten in der Windows-Registry enthält. Diese werden beim Installieren mit dem Add-In-Manager in die Registry eingetragen, damit Access den Assistenten an der gewünschten Stelle anbieten kann.

Die Tabelle enthält die Daten aus Bild 4. Wichtig ist, dass der Name der .accda-Datei genau in der Zeile mit dem Wert Library angegeben wird und das der Name der aufzurufenden Funktion des Assistenten in der Zeile mit dem Wert Function erscheint.

Die Tabelle USysRegInfo mit den Daten für die Registrierung des Assistenten

Bild 4: Die Tabelle USysRegInfo mit den Daten für die Registrierung des Assistenten

Formulare für den Assistenten vorbereiten

Der Assistent soll seine Daten in Haupt- und Unterformular anzeigen. Das Hauptformular soll das Textfeld zur Eingabe des zu testenden Format-Ausdrucks bereitstellen sowie die beiden Schaltflächen zum Übernehmen der Eingabe oder zum Abbrechen. Außerdem soll es das Unterformular anzeigen, das in der Datenblattansicht zwei Spalten anzeigt.

Die erste enthält die Daten, die formatiert werden sollen, in der gespeicherten Version. Die zweite soll die Daten mit dem Formatausdruck formatieren, den der Benutzer im Hauptformular angibt. Die Datensätze des Unterformulars in der Datenblattansicht sollen die Daten aus der eigentlichen Datenquelle anzeigen. Wenn wir also die Eigenschaft Format für das Feld PLZ einer Tabelle anpassen wollen, dann soll das Unterformular die Werte des Feldes PLZ für alle Datensätze der zugrunde liegenden Tabelle anzeigen.

Unterformular anlegen

Daher erstellen wir nun zwei Formulare. Wir beginnen mit dem Unterformular, das wir unter dem Namen sfmFormatassistent speichern. Es sieht in der Entwurfsansicht wie in Bild 5 aus. Wir fügen diesem zwei Textfelder samt Bezeichnungsfeldern hinzu. Die Bezeichnungsfelder erhalten die Beschriftungen Wert und Formatierter Wert. Die Textfelder versehen wir mit den Namen txtWert und txtFormatierterWert. Damit die Daten des Unterformulars in der Datenblattansicht angezeigt werden, stellen wir die Eigenschaft Standardansicht auf den Wert Datenblatt ein. Danach speichern und schließen wir das Unterformular.

Unterformular des Formulars des Assistenten

Bild 5: Unterformular des Formulars des Assistenten

Hauptformular anlegen

Das Hauptformular legen wir unter dem Namen frmFormatassistent an. Solange wir mit dem Formular des Assistenten keine Daten bearbeiten wollen, benötigen wir einige Elemente nicht. Diese blenden wir aus, indem wir die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten auf Nein einstellen. Außerdem soll das Formular immer zentriert im Access-Fenster angezeigt werden, sodass wir die Eigenschaft Automatisch zentrieren auf den Wert Ja einstellen.

Außerdem stellen wir den Wert der Eigenschaft Beschriftung auf einen passenden Titel ein, in diesem Fall amvFormatassistent.

Dann folgen die eigentlichen Steuerelement. Ganz oben platzieren wir ein Textfeld mit dem Namen txtFormat. Daneben legen wir ein weiteres Textfeld an, dieses heißt txtFormatDeutsch. Der Grund ist, dass die deutschen Formatierungen teilweise anders lauten als die englischen, die wir hier nutzen müssen.

Darunter fügen wir das Unterformular ein, indem wir es aus dem Navigationsbereich in den Formularentwurf ziehen. Unter diesem platzieren wir die beiden Schaltflächen cmdOK und cmdAbbrechen, sodass das Formular wie in Bild 6 aussieht. Außerdem bringen wir noch eine weitere Schaltfläche namens cmdBeispielwerteEinlesen hinzu.

Hauptformular des Assistenten mit Unterformular

Bild 6: Hauptformular des Assistenten mit Unterformular

Für die Schaltflächen hinterlegen wir die folgenden Ereignisprozeduren:

Private Sub cmdAbbrechen_Click()
     DoCmd.Close acForm, Me.Name
End Sub
Private Sub cmdOK_Click()
     Me.Visible = False
End Sub

Bevor wir mit der Programmierung der Funktion des Formulars fortschreiten, kümmern wir uns als Erstes noch um Beispieldaten für den Assistenten und dann um seinen Aufruf und die Auswertung des Ergebnisses.

Vorbereitung von Beispieldaten für das Unterformular

Der Benutzer soll direkt mit dem Format experimentieren können und deshalb stellen wir ihm im Unterformular zehn Datensätze zur Verfügung. Diese stammen aus der Tabelle tblWerteFormatierteWerte, die in der Entwurfsansicht wie in Bild 7 aussieht. Wir haben Felder für die verschiedenen Datentypen festgelegt. Damit diese nicht alle angezeigt werden müssen, der Benutzer aber dennoch mit realistischen Beispielwerten arbeiten kann, weisen wir der Eigenschaft Steuerelementinhalt beziehungsweise unter VBA ControlSource des Feldes txtWert das jeweilige Feld zu.

Entwurf der Tabelle für die Beispieldaten

Bild 7: Entwurf der Tabelle für die Beispieldaten

Wechseln wir in die Datenblattansicht, sehen wir, dass wir bereits einige Beispieldatensätze eingegeben haben – zugegebenermaßen etwas improvisiert, aber der Benutzer kann diese nach seinen eigenen Wünschen anpassen (siehe Bild 8).

Beispielwerte für die verschiedenen Felddatentypen

Bild 8: Beispielwerte für die verschiedenen Felddatentypen

Startfunktion für den Assistenten

Um das Formular beim Aufrufen des Assistenten anzuzeigen, müssen wir die Funktion, die wir in der Tabelle USysRegInfo hinterlegt haben, zunächst mit den entsprechenden Anweisungen füllen. Diese Funktion soll nicht nur das Formular öffnen, sondern auch noch die benötigten Informationen übergeben. Diese erhalten wir in dieser Funktion über die standardmäßig zu definierenden Parameter:

  • strObject liefert den Namen des Objekts, also Tabelle, Abfrage, Formular oder Bericht, von dem aus der Assistent aufgerufen wurde.
  • strControl liefert den Namen des Tabellen- oder Abfragefeldes beziehungsweise des Formular- oder Berichtssteuerelements, für welches der Assistent gestartet wurde.
  • strCurVal liefert, sofern vorhanden, den aktuellen Wert der Format-Eigenschaft für das auslösende Element.

Die Funktion aus Listing 1 stellt zunächst den Namen des zu öffnenden Formulars, hier frmFormatassistent, in der Variablen strFormular ein. Dann fügt es die Werte der drei Parameter in einer einzigen Zeichenkette zusammen – getrennt durch das Pipe-Zeichen. Das sieht beispielsweise wie folgt aus:

Public Function amvFormatAssistent(strObject As String, strControl As String, strCurVal As String) As String
     Dim strOpenArgs As String
     Dim strFormular As String
     strFormular = "frmFormatassistent"
     strOpenArgs = strObject & "|" & strControl & "|" & strCurVal
     DoCmd.OpenForm strFormular, WindowMode:=acDialog, OpenArgs:=strOpenArgs
     If IstFormularGeoeffnet(strFormular) Then
         amvFormatAssistent = Nz(Forms(strFormular)!txtFormatDeutsch, "")
         DoCmd.Close acForm, strFormular
     End If
End Function

Listing 1: Startfunktion des Assistenten

tblKunden|PLZ|"D-"@@@@@

Danach ruft die Funktion das Formular mit der DoCmd.Open-Methode auf und übergibt den Inhalt von strOpenArgs mit dem Parameter OpenArgs. Durch den Parameter WindowMode:=acDialog wird das Formular außerdem als modaler Dialog geöffnet. Dies sorgt dafür, dass der Code an dieser Stelle angehalten wird.

Hier folgt nun die eigentliche Bearbeitung. Diese schließt der Benutzer entweder mit der OK– oder der Abbrechen-Schaltfläche ab. Dadurch wird das Formular entweder ausblendet oder geschlossen, was beides dazu führt, dass der aufrufende Code fortgesetzt wird.

Hier kommt die Funktion IstFormularGeoeffnet zum Einsatz und überprüft, ob das Formular noch geöffnet ist. Ist das nicht der Fall, hat der Benutzer die Abbrechen-Schaltfläche betätigt und es ist nichts weiter zu tun. Ist das Formular jedoch noch geöffnet, muss der Benutzer es durch einen Klick auf die Schaltfläche cmdOK unsichtbar gemacht haben und die Anweisungen innerhalb der If…Then-Bedingung werden ausgeführt.

Hier liest die Funktion den Wert des Textfeldes txtFormatDeutsch aus dem noch geöffneten Formular als Rückgabewert der Funktion amvFormatAssistent ein und schließt das Formular dann. Hier ist zu berücksichtigen, dass das Textfeld txtFormat auch leer sein kann, also den Wert Null enthält. In diesem Fall ist der Wert Null durch eine leere Zeichenkette zu ersetzen, was wir mit der Nz-Funktion erledigen.

Beim Öffnen des Formulars

Beim Öffnen des Formulars wird die Prozedur aus Listing 2 aufgerufen. Diese deklariert einige Variablen und liest als erstes den Inhalt der Eigenschaft OpenArgs in die Variable strOpenArgs ein. Dabei wandelt den eventuell vorhandenen Wert Null in eine leere Zeichenkette um, da die Zuweisung des Wertes Null zu einer String-Variablen einen Fehler auslösen würde.

Private Sub Form_Open(Cancel As Integer)
     Dim strOpenArgs As String
     Dim strCurVal As String
     Dim intDataType As DataTypeEnum
     Dim strSQL As String
     strOpenArgs = Nz(Me.OpenArgs, "")
     If Len(strOpenArgs) = 0 Then
         MsgBox "Der Assistent kann nicht ohne Angabe der Parameter aufgerufen werden."
         Cancel = True
         Exit Sub
     End If
     If Not Len(strOpenArgs) = 0 Then
         strObject = Split(strOpenArgs, "|")(0)
         strControl = Split(strOpenArgs, "|")(1)
         strCurVal = Split(strOpenArgs, "|")(2)
     Else
         MsgBox "Der Assistent kann nicht ohne Angabe der Parameter aufgerufen werden."
         Cancel = True
         Exit Sub
     End If
     Me!txtFormatDeutsch = strCurVal
     intObjectType = GetObjectType(strObject)
     intDataType = GetDataType(strObject, strControl, intObjectType)
     strCurVal = UebersetzeNachEnglisch(strCurVal, intDataType)
     Me!txtFormat = strCurVal
     Select Case intDataType
         Case dbText
             Me!sfmFormatassistent.Form!txtWert.ControlSource = "WertText"
             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = "WertText"
         Case dbCurrency
             Me!sfmFormatassistent.Form!txtWert.ControlSource = "WertWaehrung"
             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = "WertWaehrung"
         Case dbBoolean
             Me!sfmFormatassistent.Form!txtWert.ControlSource = "WertBoolean"
             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = "WertBoolean"
         Case dbDate
             Me!sfmFormatassistent.Form!txtWert.ControlSource = "WertDatum"
             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = "WertDatum"
         Case dbInteger, dbLong
             Me!sfmFormatassistent.Form!txtWert.ControlSource = "WertZahl"
             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = "WertZahl"
         Case dbSingle, dbDouble
             Me!sfmFormatassistent.Form!txtWert.ControlSource = "WertZahl"
             Me!sfmFormatassistent.Form!txtFormatierterWert.ControlSource = "WertZahlMitKomma"
         Case Else
             MsgBox "Nicht definierter Felddatentyp: " & intDataType
     End Select
     Me!sfmFormatassistent.Form!txtFormatierterWert.Format = Me!txtFormat
End Sub

Listing 2: Beim Aufrufen des Formulars des Assistenten

Dann prüft die Prozedur, ob strOpenArgs überhaupt eine Zeichenkette mit einer Länge größer 0 enthält. Falls ja, untersucht sie die Zeichenkette genauer. In diesem Fall zerlegen wir diese mit der Split-Funktion in die durch das Pipe-Zeichen getrennten Einzelteile. Über den nachgeschalteten Index greifen wir auf das erste, zweite und dritte Element einer Zeichenkette wie beispielsweise der folgenden zu:

tblKunden|PLZ|"D-"@@@@@

Das erste Element landet in der Variablen strObject, das zweite in strControl und das dritte in strCurVal. Ist strOpenArgs hingegen leer, erscheint eine entsprechende Meldung und das Formular die Prozedur wird mit Exit Sub verlassen. Außerdem stellen wir noch den Parameter Cancel auf den Wert True ein, damit auch das Öffnen des Formulars abgebrochen wird.

Sind alle Werte in die Variablen eingelesen, weisen wir den Wert aus strCurVal dem Textfeld txtFormatDeutsch zu. Dies ist also die Formatierung, die der Benutzer gegebenenfalls bereits in der entsprechenden Eigenschaft des Feldes oder Steuerelements festgelegt hat. Die englische Version wollen wir im Textfeld txtFormat anzeigen. Dazu müssen wir das Format jedoch erst noch übersetzen und dazu benötigen wir noch weitere Informationen.

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