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

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