Verborgene Feldeigenschaften entdecken

Autor: Manfred Hoffbauer, Düsseldorf

Wer den Einstieg in die Programmierung mit VBA und das Objektmodell von Access erst mal geschafft hat, profitiert gleich mehrfach davon: Die grundsätzliche Vorgehensweise zur Programmierung von Tabellen, Abfragen, Formularen und Berichten ist fast immer die gleiche. Doch auch hier steckt der Teufel im Detail: Bei den verborgenen Feldeigenschaften gibt es die eine oder andere Ausnahme, die es zu kennen gilt.

Hinweis

Die Beispiele in diesem Beitrag basieren auf der Verwendung der Data Access Objects (DAO). Um die Beispiele auch mit Microsoft Access 2000 nachvollziehen zu können, müssen Sie diesen Verweis aktivieren. öffnen Sie dazu irgendein Modul in der Entwurfsansicht, und wählen Sie den Befehl Extras ( Verweise. Kreuzen Sie dann den Eintrag Microsoft DAO 3.6 Object Library in der Liste an, und klicken Sie auf OK (siehe Bild 1). Wenn Sie die Beispieldatenbank zu diesem Beitrag öffnen, ist der Verweis automatisch markiert.

Eine Tabelle hat bei Microsoft Access zwei Ansichten:

In der Datenansicht können Sie Datensätze hinzufügen, löschen und bearbeiten. In der Entwurfsansicht definieren Sie die Felder, Datentypen und weitere Feldeigenschaften der Tabelle.

Beide Ansichten stehen Ihnen auch in der Programmiersprache von Access zur Verfügung. Mit Recordsets greift ein Programm auf die Daten einer Tabelle zu, während die TableDef-Objekte die Entwurfseigenschaft einer Tabelle zugänglich machen.

Die TableDef-Objekte enthalten sozusagen alle Eigenschaften, die Sie in der Entwurfsansicht einer Tabelle zuweisen können. Um beispielsweise die Eigenschaft Gültigkeitsregel zu verändern, gehen Sie wie folgt vor:

  • öffnen Sie die Tabelle tblAufgaben aus der Beispieldatenbank dieses Beitrags in der Entwurfsansicht.
  • Wählen Sie den Befehl Ansicht ( Eigenschaften, um das Eigenschaftsfenster der Tabelle zu öffnen (siehe Bild 2).
  • Geben Sie für die Eigenschaft Gültigkeitsregel den folgenden Wert ein: [Wiedervorlage]>Datum()
  • Speichern Sie die Tabelle.
  • Access prüft nun beim Speichern eines Datensatzes automatisch, ob das Wiedervorlagedatum größer als das aktuelle Tagesdatum ist. Falls dies einmal nicht zutreffen sollte, kann der Datensatz nicht gespeichert werden.

    Die gleiche Eigenschaft können Sie auch mit VBA abfragen. Durch das Betätigen der Tastenkombination Strg + G öffnen Sie den Direktbereich von Access (siehe Bild 3). Geben Sie nun die folgende Anweisung ein.

     currentdb.TableDefs("tblAufgaben").ValidationRule

    Mit dem Betätigen der Ein-gabetaste führt Access den Befehl aus und zeigt das folgende Ergebnis an:

    [Wiedervorlage]>Date()

    Die eingegebene Zeile besteht aus dem Aufruf des -Befehls und einem Ausdruck. Der -Befehl veranlasst Access, den Wert des darauf folgenden Ausdrucks im Direktbereich (früher: Debug-Fenster) anzuzeigen.

    Der Ausdruck besteht aus der Aneinanderreihung von zwei Objekten und einer Eigenschaft. Das erste Objekt CurrentDB stellt die aktuelle Datenbank dar. Das Objekt TableDefs(“tblAufgaben”) ist quasi die Entwurfsansicht der Tabelle tblAufgaben. Die Eigenschaft ValidationRule enthält die Gültigkeitsregel.

    Mit der gleichen Technik können Sie die Gültigkeitsregel ändern:

    currentdb.TableDefs("tblAufgaben").ValidationRule = "[Wiedervorlage]>=Date()"

    Hinweis

    Beachten Sie bitte, dass die per VBA durchgeführten änderungen am Tabellenentwurf erst nach dem Schließen und erneuten öffnen der Tabelle sichtbar werden. (

    Der größte Teil des Tabellenentwurfs ist für die Definition der Datenfelder und ihrer Eigenschaften bedingt. Hier legen Sie zunächst den Feldnamen, den Datentyp und eine Beschreibung fest. Im unteren Teil des Entwurfsfensters befindet sich außerdem ein Bereich, der die Eigenschaften des jeweils aktuellen Datenfeldes anzeigt. Hierzu zählen die Gültigkeitsregel, die Feldgröße und das Format.

    Um ohne Programmierung die Gültigkeitsregel eines Feldes zu verändern, gehen Sie wie folgt vor:

  • Klicken Sie im Tabellenentwurf auf das Feld Erledigt (siehe Bild 4).
  • Geben Sie den folgenden Ausdruck in die Eigenschaft Gültigkeitsregel ein: >=Datum().
  • Nach dem Speichern der Tabelle akzeptiert Access nur noch solche Werte für das Feld Erledigt, die größer als das Tagesdatum oder gleich dem Tagesdatum sind. Um die gleiche Eigenschaft per VBA abzufragen, geben Sie folgende Anweisung in den Direktbereich ein:

     currentdb.TableDefs("tblAufgaben").fields("Erledigt").ValidationRule

    Mit dem Betätigen der Eingabetaste führt Access die Anweisung aus und zeigt als Ergebnis den Ausdruck >=Date() an.

    Auch diese Anweisung fragt zunächst mit dem CurrentDB-Objekt die aktuelle Datenbank und mit TableDefs(“tblAufgaben”) die Tabelle tblAufgaben ab. Darauf folgt – wiederum durch einen Punkt aneinandergereiht – der Zugriff auf die Fields-Auflistung des TableDef-Objekts. Durch die Angabe des Feldnamens Erledigt wird wiederum ein bestimmtes Objekt der Fields-Auflistung spezifiziert. Mit ValidationRule geben Sie schließlich die abzufragende Eigenschaft an.

    Durch die Angabe eines anderen Tabellen- oder Feldnamens können Sie jederzeit auch die ValidationRule-Eigenschaft anderer Objekte abfragen. Sie müssen allerdings darauf achten, dass Sie nur die Feldnamen verwenden, die in der jeweiligen Tabelle auch vorkommen. Andernfalls meldet Access einen Fehler bei der Ausführung des Befehls.

    Weitere Eigenschaften

    Mit der Eingabe des Punktes in den Direktbereich öffnet Access eine Liste der Eigenschaften und Methoden des jeweiligen Objektes. Wenn Sie also den Punkt hinter TableDefs(“tblAufgaben”) eingegeben haben, öffnet Access automatisch eine Liste der Eigenschaften und Methoden für TableDef-Objekte (siehe Bild 5).

    Bei der Eingabe des Punktes hinter Fields(“Erledigt”) öffnet Access automatisch eine Liste der Eigenschaften und Methoden von Fields-Objekten. Hier finden Sie beispielsweise die Name-, die ValidationRule- und die ValidationText-Eigenschaft.

    Einige Eigenschaften aus dem Tabellenentwurf suchen Sie hier jedoch vergeblich. So fehlen beispielsweise die Feldbeschreibung, das Format und das Eingabeformat. Diese Eigenschaften können Sie nur über die Properties-Auflistung des Fields-Objektes abfragen.

    Einige Feldeigenschaften können Sie über das Fields-Objekt leider nicht direkt abfragen. So führt die Anweisung

     currentdb.TableDefs("tblAufgaben").Fields("Erledigt").Description

    zu einer Fehlermeldung von Access. Die richtige Syntax zur Abfrage der Feldbeschreibung lautet wie folgt:

     CurrentDB.TableDefs("tblAufgaben").Fields("Erledigt").Properties("Description")

    Bild 6: Diesen Fehler meldet Access beim Zugriff auf Properties, die noch nicht angelegt wurden.

    Aber Vorsicht! Auch diese Anweisung kann zu einer Fehlermeldung führen (siehe Bild 6). Die obige Anweisung greift auf das Feld Erledigt der Tabelle tblAufgaben zu. Access kann das Description-Property nur dann finden, wenn Sie im Tabellenentwurf eine Beschreibung für das Feld eingegeben haben.

    Abfrage der ValidationRule alsProperty

    über die Properties-Auflistung können Sie prinzipiell alle Eigenschaften eines Datenfeldes abfragen. Dazu gehören auch die integrierten Eigenschaften wie beispielsweise die ValidationRule. Statt direkt auf die gleichnamige Eigenschaft des Fields-Objektes zuzugreifen, können Sie alternativ auch die Properties-Auflistung verwenden:

     currentdb.TableDefs("tblAufgaben").fields("Erledigt").Properties("ValidationRule")

    Die Properties-Auflistung eines Feldes enthält die fest integrierten und von den Benutzereingaben abhängige Properties. Je nachdem, ob der Anwender eine Beschreibung eingegeben hat oder nicht, ist die Description-Property vorhanden. Die Abfrage aller Properties eines Datenfeldes erfolgt am besten in einer Schleife mit dem Aufbau wie in der Prozedur aus Quellcode 1.

    Public Sub ReadPropertiesFromOneField()
        Dim PropertyCounter As Integer
        Dim tdf As DAO.TableDef
        Dim fld As DAO.Field
        Dim dbs As Database
        '' Verweis auf aktuelle Datenbank
        Set dbs = CurrentDb
        '' tblAufgaben als tableDef-Objekt öffnen
        Set tdf = dbs.TableDefs("tblAufgaben")
        For PropertyCounter = 0 To tdf.Fields("Erledigt").Properties.Count - 1
            Debug.Print PropertyCounter, tdf.Fields("Erledigt")._            Properties(PropertyCounter).Name
        Next PropertyCounter

    Die Schleife durchläuft alle Properties des Feldes Erledigt in der Tabelle tblAufgaben. Mit der Debug.Print-Anweisung werden der aktuelle Zähler und der Name der aktuellen Eigenschaft des Fensters im Direktbereich von Access (früher Debug-Fenster) ausgegeben.

    Property-Werte anzeigen

    Neben den Namen sind die Werte der Property-Eigenschaften besonders interessant. Nach den unter Access üblichen Regeln für die Verwendung von Eigenschaften müssten sich die Feldwerte mit folgender Anweisung ausgeben lassen:

    Debug.Print tdf.Fields("Erledigt").Properties(PropertyCounter).Value

    Wenn Sie den Ausdruck jedoch ohne zusätzliche Maßnahmen in der oben aufgeführten Debug.Print-Anweisung ergänzen, läuft Access bei einigen Eigenschaften auf einen Fehler. Die Ursache besteht darin, dass einige der Eigenschaften Datentypen haben, die Access nicht per Debug.Print anzeigen kann.

    Insbesondere der Wert der ersten Eigenschaft Value kann über das TableDef-Objekt nicht abgefragt werden. Der Wert des Datenfeldes ist in der Entwurfsansicht nicht verfügbar. Aber auch das Property GUID hat einen Datentyp, den Debug.Print nicht anzeigen kann.

    Mit dem Gebrauch der On-Error-Anweisung können Sie die lästigen Fehlermeldungen umgehen. Mit den folgenden Anweisungen können Sie alle Werte anzeigen lassen, die Debug.Print handhaben kann:

        On Error Resume Next
        Debug.Print , df.Fields("Erledigt")        .Properties(PropertyCounter)        .Value
        On Error GoTo 0

    Eine Auflistung der häufig vorkommenden Properties und ihrer Datentypen finden Sie in Tabelle 1.

    Wert

    Bezeichnung

    Datentyp

    0

    Value

    dbText

    1

    Attributes

    dbLong

    2

    CollatingOrder

    dbInteger

    3

    Type

    dbInteger

    4

    Name

    dbMemo

    5

    OrdinalPosition

    dbInteger

    6

    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