DAO-Objekte und -Auflistungen

Abseits der wohlbekannten Objekte Database, der Recordsets und Fields, sowie TableDefs und QueryDefs, finden Sie noch etliche andere Klassen in der Bibliothek DAO für den Datenzugriff unter VBA, die deutlich seltener zur Anwendung kommen. Im überblick stellen wir hier die wichtigsten Vertreter vor und erläutern die grundlegenden Programmierschritte und Verwendungszwecke.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1510_DAOObjekte.accdb

Auflistungen und Elemente

Unter dem Terminus Auflistung versteht man unter VBA eine Klasse, die selbst nur einen Behälter für einzelne Klassenobjekte, dessen Elemente, bereitstellt. Sie ähnelt insofern einem Array, kommt technisch gesehen aber als VBA-Collection daher. Die wesentlichen Methoden sind damit die Eigenschaft Count, welche die Zahl der Elemente der Collection zurückgibt, die Eigenschaft Item, über die auf ein einzelnes Element zugegriffen werden kann, und die Methoden Add, sowie Remove, mit denen Elemente der Auflistung hinzugefügt oder aus ihr gelöscht werden können. Zudem lassen sich die Elemente der Auflistung grundsätzlich über eine For-Each-Schleife durchlaufen. Die Schleifenvariable gibt dabei jeweils ein Item der Auflistung zurück.

Während die Items einer allgemeinen Collection keinen besonderen Typ aufweisen, sieht das unter den DAO-Auflistungen anders aus. Hier entspricht ein Item immer einer speziellen DAO-Klasse und spiegelt deren Objektinstanz wieder. So sind die Elemente einer Auflistung Fields vom Objekttyp Field, die Recordsets eines Database-Objekts haben den Typ Recordset. TableDefs enthalten TableDef-Objekte, QueryDefs-Auflistungen QueryDef-Objekte, und so fort. Die Auflistungs-Collection ist in der Regel schlicht dadurch gekennzeichnet, dass an den Elementtypnamen ein s angehängt wird: Error und Errors, Parameter und Parameters.

Die DAO-Auflistungen, um die es aber in diesem Beitrag gehen soll, sind diese:

  • Containers
  • Documents
  • Properties

Containers, Container

Sie gelangen an die Containers, indem Sie die gleichnamige Eigenschaft eines Database-Objekts abfragen. Also etwa so:

 CurrentDB.Containers.Count

Das gibt die Zahl der Container aus, die die aktuelle Datenbank enthält. In der Regel sind das neun, wenn die Datenbank keine Besonderheiten, wie etwa Replikation, aufweist. Die einzelnen Container durchlaufen Sie mit einer Routine, wie in Listing 1. Hier wird die Objektvariable dbs auf die aktuelle Datenbank gesetzt, und in der For-Each-Schleife werden die Elemente der Auflistung Containers abgearbeitet. Die Enumerationsvariable ist mit daoCont benannt. Ausgegeben werden die Namen der Container im VBA-Direktfenster. Als Ergebnis erhalten Sie diese Liste:

Sub GetContainers()
     Dim dbs As Database
     Dim daoCont As DAO.Container
     Set dbs = CurrentDb
     For Each daoCont In dbs.Containers
         Debug.Print daoCont.Name
     Next daoCont
End Sub

Listing 1: Prozedur zum Durchlaufen der DAO-Auflistung Containers

DataAccessPages
Databases
Forms
Modules
Relationships
Reports
Scripts
SysRel
Tables

Sie werden daraus ablesen können, dass es sich dabei um alle Objekte handelt, die die Datenbank enthält. Tatsächlich ist die Containers-Auflistung der virtuelle Speicher für alles, was es in der Datenbank gibt. Forms etwa ist die Gesamtheit der Formulare der Datenbank. Reports verweist auf die Berichte. Modules bezieht sich auf alle VBA-Module, Scripts auf die Makros. Bei Relationships handelt es sich um die Beziehungen zwischen den Tabellen, falls solche festgelegt wurden, während SysRel das grafische Layout der Beziehungen, so, wie es im Beziehungsfenster angezeigt wird, wiedergibt. Bei DataAccessPages handelt es sich um eine obsolete Auflistung, die die Datenzugriffsseiten enthält, welche früher (Office 2000) zum Entwickeln von datengebundenen HTML-Seiten verwendet werden konnten, heute aber nicht mehr unterstützt werden. Tables ist der Container für alle Tabellen und Abfragen der Datenbank. Access macht hier keinen Unterschied – beide geben eben eine Datenmenge zurück.

Irritierend schließlich ist der Databases-Container. Kann eine Datenbank nicht nur ein Database-Objekt enthalten Nein, denn in VBA können Sie über die OpenDatabase-Funktion eine weitere Datenbank in der aktuellen Sitzung öffnen, die sowohl auf die gerade geöffnete Datei verweisen kann, wie auch auf eine andere. Zudem listet der Container interessanterweise auch noch die Datenbankeigenschaften (Summary) als eigene Datenbank auf, wie auch die Werteliste, die man in den Datenbankeigenschaften im Backstage selbst anlegen kann (UserDefined).

Documents, Document

Gut zu wissen, dass etwa der Container Forms alle Formulare der Datenbank verzeichnet. Doch wie kommt man nun an die einzelnen Formulare Zunächst verweisen Sie auf den Container über eine Hilfevariable:

Dim dbs As Database 
Dim daoCont As DAO.Container
Set dbs = CurrentDb
Set daoCont = dbs.Containers("Forms")

Sie erhalten also einen bestimmten Container, indem Sie seinen Namen als Index der Collection angeben. Alternativ könnte man auch die Ordinalzahl einsetzen, doch deren Wert kann sich von Datenbank zu Datenbank unterscheiden. Elementar ist nun die Methode Documents eines Containers.

Sie gibt als Auflistungseigenschaft seine einzelnen Dokumente wieder. Der Begriff mag etwas irreführend klingen, denn gewöhnlich spricht man bei Formularen von Datenbankobjekten, nicht von Datenbankdokumenten. Wie auch immer, die Dokumente können Sie auf die gleiche Weise durchlaufen, wie das bei der Containers-Auflistung der Fall war:

Dim daoDoc As DAO.Document
For Each daoDoc in daoCont.Documents
     Debug.Print daoDoc.Name
Next daoDoc

Als Ergebnis dieser Routine bekommen Sie die Namen aller Formulare der Datenbank.

Kombinieren Sie die Enumeration der Containers und der Documents miteinander, so kommen Sie zu einer Prozedur, wie GetDBDocuments in Listing 2. Hier werden alle Objekte der Datenbank ausgegeben, da in der äußeren Schleife alle Container, in der inneren alle Document-Elemente dieser durchlaufen werden.

Sub GetDBDocuments()
     Dim dbs As Database
     Dim daoCont As DAO.Container
     Dim daoDoc As DAO.Document
     
     Set dbs = CurrentDb
     For Each daoCont In dbs.Containers
         Debug.Print daoCont.Name
         If daoCont.Documents.Count = 0 Then
             Debug.Print , "-"
         Else
         For Each daoDoc In daoCont.Documents
             Debug.Print , daoDoc.Name
         Next daoDoc
         End If
     Next daoCont
End Sub

Listing 2: Durchlaufen der Auflistung Documents

über das Objektmodell von Access selbst wäre das nicht möglich. Die Forms-Auflistung von Access bezieht sich etwa nur auf geöffnete, nicht auf alle gespeicherten Formulare. Zwar gibt es auch noch die Auflistung CurrentProject.AllForms, doch die ist eben speziell nur für Formulare gemacht, während die Containers allgemeinerer Natur sind. Mit keiner anderen VBA-Lösung kommen Sie so schnell und kurz an die Datenbankobjekte, wie mit der im Listing.

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:

Schreibe einen Kommentar