Wenn Sie über VBA auf die Objekte Ihrer Datenbank zugreifen, dann hat sicher der Datenzugriff über das Recordset-Objekt die größte Bedeutung. Seltener werden Sie die Definitionen der Tabellen auslesen, bearbeiten oder gar anlegen müssen. Wenn doch, so ist das TableDef-Objekt von DAO die zentrale Anlaufstelle. Sehen Sie selbst, wie der Umgang damit aussieht und was möglich ist.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1409_Tabledefs.mdb.
Die richtige Bibliothek
Die VBA-Zugriffsmethoden für die Datenbank sind nicht Teil von Access selbst, sondern in eine zusätzliche Daten-Engine ausgelagert. Das führt dazu, dass Sie in Ihrem VBA-Projekt einen zusätzlichen Verweis auf diese Engine benötigen. Wenn Sie eine neue Datenbank anlegen, so setzt Access diesen Verweis automatisch, doch leider war man sich bei Microsoft nicht einig, welche Bibliothek hierfür die geeignete ist.
So war man einige Zeit der Meinung, dass ADODB die bessere Zugriffsbibliothek darstellt, und folglich wurde beim Anlegen einer Datenbank darauf ein Verweis gesetzt. Erst ab Access 2007 schwenkte man wieder um und manifestierte DAO als Standard.
Sie können daher nicht sicher sein, dass in Ihrer oder einer fremden Datenbank bereits ein Verweis auf die Bibliothek DAO gesetzt ist, welche die Klasse TableDef enthält, von der hier die Rede sein soll.
Im Zweifel schauen Sie im VBA-Objektkatalog nach, ob dort der Eintrag DAO vorhanden ist, oder rufen alternativ den Verweise-Dialog über das Menü Extras|Verweise… auf. DAO hieß zwar früher schon DAO, der Beschreibungstext des Verweises änderte sich allerdings. So ist bis Access 2003 ein Verweis auf die Microsoft DAO 3.6 Objekt Library zu setzen und für die Folgeversionen einer auf die Microsoft Office 12.0 Access database engine Object Library.
Machen Sie für Access 2010 aus der 12 eine 14 und für Access 2013 eine 15. In allen Fällen aber finden Sie anschließend im Objektkatalog den Eintrag DAO in der linken oberen Combobox. Wird er ausgewählt, so erscheinen die Datenzugriffsklassen der Bibliothek auf der linken Seite, wie in Bild 1, wo auch schon die TableDef-Klasse markiert wurde und rechts ihre Methoden wiedergibt.
Bild 1: Die Klasse DAO.TableDef im VBA-Objektkatalog
TableDefs-Auflistung
Alle Tabellen Ihrer Datenbank sind in einer Art Katalog über die TableDefs-Klasse zu erhalten. Wie in allen Auflistungsklassen können deren TableDef-Elemente in einer For..Each-Schleife durchlaufen werden, die Zahl der Elemente über die Eigenschaft Count ermittelt oder Elemente gezielt mit der (versteckten) Item-Eigenschaft abgefragt werden. Woher jedoch weiß DAO, wenn es gar nicht Teil des Access-Objektmodells ist, welche Tabellen ihn der Access-Datenbank stecken Dazu muss über ein Database-Objekt, welches selbst die TableDefs-Methode ausweist, eine Verbindung zu ihr geschaffen werden.
Dieses Bindeglied gibt es in Access entweder über die Eigenschaft Application.CurrentDb oder über die Eigenschaft Application.DBEngine. Sobald eine Datenbank in Access geöffnet wird, tritt die Datenbank-Engine in Aktion und lädt in ihr Workspace ein neues Database-Objekt. Eine Kopie davon lässt sich dann über CurrentDb erhalten. Im Prinzip sollte man über beide Ansätze zum gleichen Ergebnis kommen:
1. Dim dbs As DAO.Database Set dbs = Application.CurrentDb 2. Dim dbs As DAO.Database Dim wrk As DAO.Workspace Set wrk = Application. _ DBEngine.Workspaces(0) Set dbs = wrk.Databases(0) Abgekürzt: Set dbs = DBEngine(0)(0)
Dass es leider nicht egal ist, für welche der beiden Methoden man sich entscheidet, werden wir noch sehen.
Versuchen wir zunächst alle Tabellen der aktuellen Datenbank namentlich im VBA-Direktfenster auszugeben. Rufen Sie dazu die erste der drei Routinen in Listing 1 auf. ListTableDefs definiert erst eine TableDef-Variable tdf und füllt diese in der folgenden For..Each-Schleife jeweils mit dem nächsten Element der TableDefs-Auflistung von CurrentDb. Die Eigenschaft Name des TableDef-Objekt wird ins Direktfenster geschrieben.
Auf diese Weise entsteht eine Liste wirklich aller Tabellen der Datenbank, zu der auch die Systemtabellen gehören, welche allesamt das Präfix MSys tragen. Wollten Sie sie ausfiltern, so könnten Sie dies über eine Textfunktion tun, die die ersten vier Zeichen des Namen auswertet.
Da ein TableDef-Objekt aber eine Methode besitzt, welche die Systemeigenschaft direkt anzeigen kann, ist der Gebrauch von Attributes verlässlicher. Attributes ist ein Long-Wert, der verschiedene Eigenschaften der Tabelle wiedergibt und als Zahlen binär addiert. Sie finden diese in den Enumerationskonstanten der Klasse TableDefAttributeEnum von DAO im Objektkatalog. Dort gibt es etwa für Systemtabellen die Konstante dbSystemObject oder für verknüpfte Tabellen das Attribut dbAttachedTable.
Um zu ermitteln, ob dbSystemObjekt im Attributes-Wert der Tabelle steckt, muss diese Eigenschaftszahl per booleschem AND verglichen werden. Genau das geschieht auch in den beiden weiteren Routinen aus Listing 1. ListSysTableDefs gibt alle Systemtabellen aus und ListNonSysTableDefs die von Ihnen angelegten. Wobei hier zu erwähnen wäre, dass über die Attributes-Eigenschaft eine jede Tabelle auch auf den Status Systemobjekt eingestellt werden kann! Wollten Sie etwa der Tabelle tblStammdaten der Beispieldatenbank den Systemstatus verleihen, so genügt dafür eine Zeile:
Sub ListTableDefs() Dim tdf As TableDef For Each tdf In CurrentDb.TableDefs Debug.Print tdf.Name Next tdf End Sub Sub ListSysTableDefs() Dim tdf As TableDef For Each tdf In CurrentDb.TableDefs If (tdf.Attributes And dbSystemObject) <> 0 Then Debug.Print tdf.Name Next tdf End Sub Sub ListNonSysTableDefs() Dim tdf As TableDef For Each tdf In CurrentDb.TableDefs If (tdf.Attributes And dbSystemObject) = 0 Then Debug.Print tdf.Name Next tdf End Sub
Listing 1: Ausgeben aller Tabellen der Datenbank über die TableDefs-Auflistung
CurrentDB.TableDefs("tblStammdaten").Attributes = dbSystemObject
Ebenso könnten Sie die Tabelle verstecken, indem sie dbHiddenObject zuwiesen. In beiden Fällen würde die Tabelle im Datenbankfenster oder Navigationsbereich nicht mehr auftauchen, so Sie nicht in deren Optionen eingestellt hatten, dass auch versteckte und System-Objekte angezeigt werden sollen.
Tabelleneigenschaften auslesen
Attributes als Eigenschaftswert einer Tabelle wurde eben schon angeführt. Die weiteren Standardeigenschaften einer Tabelle entsprechend jenen, die rechts in Bild 1 zu sehen sind. Listing 2 zeigt beispielhaft, wie das geht.
Sub ReadTabledef(Optional sTable As String = "tblStammdaten") Dim dbs As DAO.Database Dim tdf As DAO.TableDef ' Set tdf = CurrentDb.TableDefs(sTable) ' Set dbs = CurrentDb ' Set tdf = dbs.TableDefs(sTable) With DBEngine(0)(0) .TableDefs.Refresh Set tdf = .TableDefs(sTable) End With With tdf Debug.Print "Name", tdf.Name Debug.Print "Connect", .Connect Debug.Print "DateCreated", .DateCreated Debug.Print "LastUpdated", .LastUpdated Debug.Print "SourceTableName", .SourceTableName Debug.Print "Updatable", .Updatable Debug.Print "ValidationRule", .ValidationRule Debug.Print "ValidationText", .ValidationText Debug.Print "Attribute Text:", StrTableAttrib(.Attributes) Debug.Print "ReplicaFilter", .ReplicaFilter Debug.Print "ConflictTable", .ConflictTable Debug.Print "RecordCount", .RecordCount Debug.Print "Fields.Count", .Fields.Count Debug.Print "Indexes.Count", .Indexes.Count Debug.Print "Properties.Count", .Properties.Count End With End Sub
Listing 2: Eigenschaften eines TableDef-Objekts ausgeben
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: