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.

[

strObject liefert uns den Namen des Objekts, von dem aus der Benutzer den Assistenten aufgerufen hat. Damit wollen wir den Typ des Objekts ermitteln. Davon ausgehend, dass jeder Objektname nur einmal pro Datenbank angelegt werden kann, können wir damit die Tabelle MSysObjects durchsuchen und aus dieser den Typ ermitteln. Das erledigt die Hilfsfunktion GetObjectType für uns, die wir weiter unten beschreiben.

Diese wandelt außerdem die kryptischen Zahlenwerte wie zum Beispiel -32.768 für Formulare in handliche Konstanten wie acForm um und wir speichern den ermittelten Wert in der Variablen intObjectType.

Den Objekttyp benötigen wir unter anderem für die nachfolgende Ermittlung des Felddatentyps des mit der Format-Eigenschaft auszustattenden Feldes. Diese erfolgt mit der Funktion GetDataType. Dieser übergeben wir den Namen des Objekts und des Felds beziehungsweise Steuerelements und schreiben das Ergebnis in Form eines der entsprechenden Konstanten wie beispielsweise acText für ein Textfeld mit dem Datentyp Kurzer Text in die Variable intDataType. Diese hat wiederum den Datentyp DataTypeEnum.

Den Datentyp nutzen wir nun in der Funktion UebersetzeNachEnglisch, der wir den zu übersetzenden Ausdruck übergeben sowie den Datentyp. Das Ergebnis dieses Aufrufs landet schließlich im Textfeld txtFormat. Wie und warum wir das Format übersetzen, erläutern wir weiter unten.

Den Inhalt der Variablen intDataType untersuchen wir dann in einer Select Case-Anweisung daraufhin, um welchen Datentyp es sich handelt. Abhängig davon nehmen wir nun Einstellungen im Unterformular des Assistenten vor. Dieses zeigt ja bereits die Tabelle der Tabelle tblWerteFormatierteWerte an.

Je nachdem, welchen Datentyp das Feld hat, für das der Benutzer den Format-Assistenten aufgerufen hat, stellen wir die Eigenschaft Steuerelementinhalt auf eines der Felder WertText, WertWaehrung, WertBoolean, WertDatum, WertZahl oder WertZahlMitKomma ein.

Hat der Benutzer einen anderen Datentyp gewählt, erscheint eine entsprechende Meldung – an dieser Stelle könnte man die Prozedur noch für diesen zusätzlichen Datentyp erweitern. Schließlich stellen wir die Eigenschaft Format des Feldes txtFormatierterWert auf die im Textfeld txtFormat gespeicherte Formatierung ein.

Ändern des Formats

Wenn der Benutzer die Formatierung im Textfeld txtFormat ändert, soll sich dies jeweils direkt auf die zu formatierenden Beispieltextfelder auswirken. Dazu hinterlegen wir für das Ereignis Bei Änderung das Format für die Eigenschaft Format des Textfeldes txtFormatierterWert. Hier lesen wir allerdings nicht den aktuellen Wert aus, also Value, sondern den aktuell angezeigten Inhalt aus der Eigenschaft Text (der aktuelle Inhalt wird erst nach dem Speichern des Inhalts zum Value):

Private Sub txtFormat_Change()
     Me!sfmFormatassistent.Form!txtFormatierterWert.Format _
         = Me!txtFormat.Text
End Sub

Modul mdlTools

Die Hilfsfunktion GetObjectType erwartet den Namen des zu untersuchenden Objekts als Parameter und soll den Typ in Form einer Konstanten der Auflistung acObjectType zurückliefern. Dazu öffnen wir die Systemtabelle MSysObjects der Datenbank, von der aus der Assistent geöffnet wurde, als Recordset. Als Kriterium der zu verwendenden Abfrage verwenden wir das Feld Name, dessen Wert mit dem per Parameter überlieferten Objektnamen übereinstimmen soll.

Es kommen nur die vier Elementtypen Tabelle, Abfrage, Formular oder Berichte als Elementtypen in Frage. Daher prüfen wir für den Wert Type des gefundenen Datensatzes der Tabelle MSysObjects, ob dieser einen der folgenden Werte enthält:

  • 1: Das Objekt ist eine Tabelle.
  • 5: Das Objekt ist eine Abfrage.
  • -32.768: Das Objekt ist ein Formular.
  • -32.764: Das Objekt ist ein Bericht.

Abhängig davon, welchen Objekttyp das Element hat, geben wir einen der Werte acTable, acQuery, acForm oder acReport zurück. Den kompletten Code dieser Funktion zeigt Listing 3.

Public Function GetObjectType(strObject As String) As AcObjectType
     Dim dbc As DAO.Database
     Dim rst As DAO.Recordset
     Set db = CodeDb
     Set rst = db.OpenRecordset("SELECT * FROM MSysObjects WHERE Name = ''" & strObject & "''", dbOpenDynaset)
     If Not rst.EOF Then
         Select Case rst!Type
             Case 1 ''Tabelle
                 GetObjectType = acTable
             Case 5 ''Abrfrage
                 GetObjectType = acQuery
             Case -32768 ''Formulare
                 GetObjectType = acForm
             Case -32764 ''Bericht
                 GetObjectType = acReport
         End Select
     End If
End Function

Listing 3: Die Hilfsfunktion GetObjectType

Die Hilfsfunktion GetDataType

Die zweite Hilfsfunktion finden wir ebenfalls im Modul mdlTools (siehe Listing 4). Die Funktion GetDataType hat die Aufgabe, zu dem mit strControl gelieferten Element des mit strObject gelieferten Objekts mit dem Typ aus intObjectType den Datentyp zu liefern.

Public Function GetDataType(strObject As String, strControl As String, intObjectType As acObjectType) As DataTypeEnum
     Dim db As DAO.Database
     Dim tdf As DAO.TableDef
     Dim qdf As DAO.QueryDef
     Dim frm As Form
     Dim rpt As Report
     Dim fld As DAO.Field
     Dim strRecordsource As String
     Dim rst As DAO.Recordset
     Set db = CurrentDb
     Select Case intObjectType
         Case acTable
             Set tdf = db.TableDefs(strObject)
             Set fld = tdf.Fields(strControl)
             GetDataType = fld.Type
         Case acQuery
             Set qdf = db.QueryDefs(strObject)
             Set fld = qdf.Fields(strControl)
             GetDataType = fld.Type
         Case acForm, acReport
             Select Case intObjectType
                 Case acForm
                     Set frm = Forms(strObject)
                     strRecordsource = frm.RecordSource
                 Case acReport
                     Set rpt = Reports(strObject)
                     strRecordsource = rpt.RecordSource
             End Select
             Select Case Left(strRecordsource, 7)
                 Case "SELECT"
                     Set qdf = db.OpenRecordset(strRecordsource)
                     Set fld = qdf.Fields(strControl)
                 Case Else
                     Set tdf = db.TableDefs(strRecordsource)
                     Set fld = tdf.Fields(strControl)
             End Select
             GetDataType = fld.Type
     End Select
End Function

Listing 4: Die Hilfsfunktion GetFieldType

Das bedeutet, dass sie genauso den Datentyp eines Feldes einer Tabelle wie eines Steuerelements in einem Formular oder Bericht liefern können soll.

Zu diesem Zweck nimmt die Prozedur die drei genannten Parameter entgegen und liefert einen Wert der Auflistung DataTypeEnum zurück. Wir deklarieren hier gleich eine ganze Reihe von Objektvariablen für die unterschiedlichen Fälle, also zum Beispiel ein TableDef-, ein QueryDef-, ein Form– oder ein Report-Objekt.

Gleich zu Beginn unterscheiden wir in einer Select Case-Bedingung zwischen den verschiedenen Werten des Parameters intObjectType und somit den unterschiedlichen Objekttypen Tabelle, Abfrage, Formular und Bericht.

Im Fall einer Tabelle ermitteln wir das TableDef-Objekt und das Field-Element für das mit strControl angegebene Feld. Den Typ des Feldes ermitteln wir mit der Type-Eigenschaft und tragen diese als Rückgabewert der Funktion GetDataType ein.

Die Vorgehensweise für eine Abfrage sieht identisch aus, nur dass wir hier ein QueryDef-Objekt referenzieren und kein TableDef-Objekt. Schließlich folgen noch die Formulare und Berichte. Diese verarbeiten wir in einem Case-Zweig, der noch eine verschachtelte Select Case-Bedingung enthält. In dieser unterscheiden wir zunächst nach acForm und acReport.

Für ein Formular lesen wir einen Verweis auf das entsprechende Formular über die Forms-Auflistung ein und schreiben dann den Wert der Eigenschaft RecordSource, also der Datensatzquelle, in die Variable strRecordsource ein.

Das Gleiche erledigen wir auch im Fall eines Berichts, nur dass wir hier auf die Reports-Auflistung zugreifen und den Verweis in die Report-Variable rpt schreiben.

Danach prüfen wir, ob das Formular oder der Bericht eine SELECT-Abfrage oder die reine Angabe des Namens einer Tabelle oder Abfrage als Datensatzquelle verwenden. Im Falle einer SELECT-Anweisung erstellen wir ein Recordset auf Basis dieser Datensatzquelle und referenzieren diese mit der Variablen qdf.

Aus dieser ermitteln wir dann über den Namen des Elements aus der Fields-Auflistung einen Verweis auf das zu formatierende Feld. Dessen Type-Eigenschaft liefert dann wiederum den Felddatentyp, den wir als Ergebnis der Funktion GetDataType zurückgeben.

Probleme mit Deutsch/Englisch in Formatausdrücken

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

Schreibe einen Kommentar