DAO: Tabellen, Felder und Co. bearbeiten

Tabellen, Felder und Beziehungen erstellt man normalerweise mit den Werkzeugen der Benutzeroberfläche von Microsoft Access. Es kann jedoch nie schaden, per VBA-Code sowohl auf die Definition der Elemente des Datenmodells zuzugreifen und diese auch erstellen oder ändern zu können. In diesem Beitrag zeigen wir, wie Sie die datenbezogenen Objekte Ihrer Datenbank mit den Eigenschaften und Methoden der DAO-Bibliothek im Griff behalten.

Für den Zugriff auf die Tabellendefinitionen per DAO brauchen Sie natürlich zunächst einen Verweis auf die entsprechende Objektbibliothek. Dieser ist in den meisten Access-Versionen voreingestellt, zur Sicherheit sollten Sie jedoch den Verweise-Dialog (VBA-Editor, Menüeintrag Extras|Verweise) konsultieren, ob dieser einen Verweis namens Microsoft DAO 3.6 Object Library (Access 2003 und älter) oder Microsoft Office x.0 Access Database Engine Object Library (Access 2007 und jünger) enthält.

Datenbank referenzieren

Die aktuell geöffnete Datenbank referenzieren Sie am besten mit der CurrentDB-Funktion. Diese liefert immer den Blick auf den aktuellen Zustand aller Datenbankobjekte. Den Verweis speichern Sie in jedem Fall in einer Variablen des Typs Database.

Nach Verwendung geben Sie den durch die Objektvariable belegten Platz wieder frei:

Dim db As DAO.database
Set db = CurrentDb
''mit db arbeiten
Set db = Nothing

Um eine andere Datenbank zu referenzieren, verwenden Sie statt CurrentDb Folgendes:

Set db = DBEngine.OpenDatabase("c:\db.mdb")

Anschließend greifen Sie über die Objektvariable db genau so auf die Elemente dieser Datenbank zu, wie Sie es bei Verwendung von CurrentDB erledigen würden.

Datenbank erstellen

Eine Datenbank erstellen Sie mit der CreateDatabase-Methode des DBEngine-Objekts. Im folgenden Beispiel wird eine neue Datenbank erzeugt, ein Verweis darauf in der Database-Variablen db gespeichert, der Name der frisch erzeugten Datenbank im Direktfenster ausgegeben und die Datenbank wieder gelöscht:

Dim db As DAO.database
Dim strDatabase As String
strDatabase = CurrentProject.Path & "\Temp.mdb"
Set db = DBEngine.CreateDatabase(strDatabase, dbLangGeneral)
Debug.Print db.Name
Set db = Nothing
Kill strDatabase

In den folgenden Beispielen lassen wir Deklaration, Zuweisung und Leerung der Objektvariablen db aus Platzgründen weg.

Tabelle erstellen

Tabellen werden unter DAO durch das TableDef-Objekt repräsentiert. Für das Erstellen einer Tabelle verwenden Sie die CreateTableDef-Methode des Database-Objekts. Dies reicht aber nicht aus: Das Objekt hängt im leeren Raum und muss noch an die TableDefs-Auflistung der Datenbank angehängt werden. Und selbst dies führt noch zu einem Fehler, weil die Tabelle noch keine Felder enthält. Ein leeres Tabellengerüst lässt sich also weder in der Benutzeroberfläche noch per DAO erzeugen: Es muss immer mindestens ein Feld enthalten. Die folgenden Zeilen erzeugen eine neue Tabelle, fügen ein einfaches Textfeld hinzu und hängen die Tabelle dann an die TableDefs-Auflistung an. Schließlich wird noch das Datenbankfenster aktualisiert, damit dieses die neue Tabelle gleich anzeigt:

Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Set tdf = db.CreateTableDef("tblNeu")
Set fld = tdf.CreateField("ID", dbLong)
tdf.Fields.Append fld
db.TableDefs.Append tdf
Application.RefreshDatabaseWindow

Versteckte Tabellen und Systemtabellen

Wenn Sie die richtigen Optionen einstellen, zeigt Access auch Systemtabellen und versteckte Tabellen im Datenbankfenster beziehungsweise im Navigationsbereich an. Eine Systemtabelle zeichnet sich durch eine spezielle Eigenschaft aus, genau wie eine versteckte Tabelle. Der Unterschied ist: Eine versteckte Tabelle können Sie über die Benutzeroberfläche als solche kennzeichnen (rechte Maustaste auf den Tabellennamen, Eintrag Tabelleneigenschaften, Eigenschaft Ausblenden), eine Systemtabelle nur per VBA. Die üblichen Deklarationen vorausgesetzt, können Sie mit diesen Anweisungen eine Tabelle ausblenden:

Set db = CurrentDb
Set tdf = db.TableDefs("tblKunden")
tdf.Attributes = 1 ''dbHiddenObject

Wenn Sie eine Tabelle in eine Systemtabelle umwandeln möchten, stellen Sie die Attributes-Eigenschaft auf den Wert dbSystemObject (-2147483646) ein. Wollen Sie der Eigenschaft Attributes mehrere Attribute zuweisen, verknüpfen Sie die Zahlenwerte oder die Konstanten einfach mit dem Or-Schlüsselwort. Folgendes würde eine versteckte Systemtabelle liefern (nicht, dass dies sinnvoll wäre …):

tdf.Attributes = dbHiddenObject Or dbSystemObject

Access zeigt versteckte Tabellen und Systemtabellen nur an, wenn die Optionen Ausgeblendete Objekte anzeigen und Systemobjekte anzeigen aktiviert sind.

Tabellenfeld anlegen

Das erste Tabellenfeld haben Sie bereits angelegt, nun folgen die Erläuterungen hierzu. Genau wie beim Anlegen einer Tabelle brauchen Sie zunächst eine Objektvariable, in der Sie den Verweis auf das neue Feld speichern können:

Dim fld As DAO.Field

Dann erstellt die CreateField-Methode des TableDef-Objekts der Tabelle, der das Feld hinzugefügt werden soll, das eigentliche Feld:

Set fld = tdf.CreateField("ID", dbLong)

Als Parameter dienen der Feldname sowie eine Konstante für den Datentyp. Als Datentypen für die Verwendung von DAO 3.6 kommen die folgenden Werte infrage (jüngere DAO-Versionen erlauben noch weitere Datentypen, auf die wir an dieser Stelle aber nicht eingehen):

  • dbBoolean(1): Ja/Nein-Feld
  • dbByte (2): Zahl, Feldgröße Byte
  • dbInteger (3): Zahl, Feldgröße Integer
  • dbLong (4): Zahl, Feldgröße Long
  • dbCurrency (5): Währung
  • dbSingle (6): Zahl, Feldgröße Single
  • dbDouble (7): Zahl, Feldgröße Double
  • dbDate (8): Datum
  • dbBinary (9): Binär (wird in der Liste der Datentypen nicht angezeigt, kann aber dennoch erstellt werden)
  • dbText (10): Text
  • dbLongBinary (11): OLE-Objekt
  • dbMemo (12): Memo
  • dbGUID (15): Zahl, Feldgröße Replikations-ID

Die Prozedur aus Listing 1 erstellt eine Tabelle, die im Entwurf wie in Bild 1 aussieht.

Listing 1: Anlegen einer Tabelle mit allen unter DAO 3.6 möglichen Felddatentypen

Public Sub AlleDAO36Feldtypen()
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    Set db = CurrentDb
    On Error Resume Next
    db.TableDefs.Delete "tblDatentypen"
    On Error GoTo 0
    Set tdf = db.CreateTableDef("tblDatentypen")
    Set fld = tdf.CreateField("dbBoolean", dbBoolean)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbByte", dbByte)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbInteger", dbInteger)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbLong", dbLong)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbCurrency", dbCurrency)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbSingle", dbSingle)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbDouble", dbDouble)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbDate", dbDate)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbBinary", dbBinary)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbText", dbText)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbLongBinary", dbLongBinary)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbMemo", dbMemo)
    tdf.Fields.Append fld
    Set fld = tdf.CreateField("dbGUID", dbGUID)
    tdf.Fields.Append fld
    db.TableDefs.Append tdf
End Sub

pic001.png

Bild 1: Eine per DAO erstellte Tabelle in der Entwurfsansicht

Autowert anlegen

Wenn Sie ein Autowert-Feld definieren möchten, stellen Sie die Eigenschaft Attributes des entsprechenden Felds auf den Wert dbAutoIncrField ein:

Set fld = tdf.CreateField("ID", dbLong)
fld.Attributes = dbAutoIncrField
tdf.Fields.Append fld

Weitere Eigenschaften einstellen

Wenn Sie einen Blick auf die Eigenschaften von Feldern verschiedener Felddatentypen im Tabellenentwurf werfen, finden Sie noch einige weitere Eigenschaften, die Sie möglicherweise per DAO einstellen möchten. Dazu brauchen Sie prinzipiell nur eine Anweisung pro Eigenschaft – vorausgesetzt, Sie haben bereits einen Verweis auf die aktuelle Datenbank (db) und auf das Feld, das Sie anpassen möchten (fld). Außerdem müssen Sie natürlich den englischen Namen der Eigenschaft kennen. Insgesamt sieht beispielsweise das Einstellen der Eigenschaft Standardwert (DefaultValue) so aus:

Public Sub StandardwertEinstellen(strTabelle As String, strFeld As String, varStandardwert As Variant)
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    Dim prp As DAO.Property
    Set db = CurrentDb
    Set tdf = db.TableDefs(strTabelle)
    Set fld = tdf.Fields(strFeld)
    fld.Properties("DefaultValue") = varStandardwert
End Sub

Genau so können Sie auch für die übrigen Eigenschaften vorgehen. Wenn Sie herausfinden wollen, wie diese Eigenschaften heißen, lassen Sie sich einfach alle Eigenschaften eines Feldes im Direktfenster ausgeben. Anhand des englischen Namens oder des Wertes sollte sich dies leicht bewerkstelligen lassen. Die folgenden Zeilen liefern alle Properties eines Feldes:

Set tdf = db.TableDefs("tblProjekte")
Set fld = tdf.Fields("KundeID")
For Each prp In fld.Properties
    Debug.Print prp.Name
Next prp

Einfachen Index festlegen

Als Nächstes legen wir verschiedene Index-Typen an. Den Start macht ein einfacher Index. Um einen solchen anzulegen, deklarieren Sie zusätzlich zu den bisher vorhandenen Variablen db, tdf und fld noch ein Objekt namens idx mit dem Datentyp DAO.Index:

Dim idx As DAO.Index

Wir verweisen wieder auf das TableDef-Objekt für die Tabelle, die das Feld mit dem zu erstellenden Index enthält:

Set tdf = db.TableDefs("tblMitEinfachemIndex")

Dann erstellen wir mit der Methode CreateIndex des TableDef-Objekts ein neues Index-Objekt:

Set idx = tdf.CreateIndex("idxEinfach")

Und nun kommt ein unerwarteter Schritt: Die Fields-Auflistung des Index-Objekts liefert nicht etwa eine Append-Methode, um eines der vorhandenen Felder der Tabelle anzuhängen, sondern Sie erstellen die Felder, für die der Index erstellt werden soll, erneut mit der CreateField-Methode. Dabei geben Sie den Namen eines bereits vorhandenen Feldes an:

Set fld = idx.CreateField("ID")

Danach hängen Sie dieses Feld an die Fields-Auflistung des Index-Objekts an:

idx.Fields.Append fld

Schließlich wird auch noch das Index-Objekt an die Indexes-Auflistung des TableDef-Objekts angehängt:

tdf.Indexes.Append idx

Bild 2 zeigt den neuen Index an.

pic002.png

Bild 2: Ein per Code hinzugefügter einfacher Index ohne Primärschlüsseleigenschaft

Eindeutigen Index festlegen

Wenn Sie den Index als eindeutigen Index erstellen möchten, brauchen Sie lediglich zusätzlich die Eigenschaft Unique auf den Wert True einzustellen (siehe Bild 3):

pic004.png

Bild 3: Eindeutiger Index im Indizes-Dialog des Tabellenentwurfs

idx.Unique = True

Primärschlüssel-Index erstellen

Gleiches gilt für einen Index mit Primärschlüsselattribut (siehe Bild 4). Hier kommt die Eigenschaft Primary zum Einsatz:

pic005.png

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