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.
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).
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).
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.
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.
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.
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.
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).
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.