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