Home > Artikel > Ausgabe 10/2015 > DAO-Objekte und -Auflistungen

DAO-Objekte und -Auflistungen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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.

Allerdings kann man damit auch nicht viel mehr ermitteln, als die Namen der Objekte. Denn ein Document-Objekt gibt leider nicht viel her. Neben der Eigenschaft Name verzeichnet es noch die Datumseigenschaften DateCreated und LastUpdated, die sich auf Erstelldatum und das letztes Änderungsdatum eines Objekts beziehen.

Das war's auch schon! Doch immerhin finden Sie noch die Methode Properties in der Objektklasse, die die Eigenschaften eines Dokuments widerspiegelt. Vielleicht erfahren wir über diese mehr über die einzelnen Objekte?

Properties, Property

Properties sind Auflistungseigenschaften, die unter DAO nicht nur einem Document innewohnen, sondern grundsätzlich allen Objektklassen. Ein Container hat die Properties-Methode, ein Recordset-, ein TableDef-, ein Field-, oder ein DbEngine-Objekt ebenso. Sie sind also die zentrale Informationsquelle für die Objekte.

Durchlaufen wir einmal die Eigenschaften eines Formularobjekts über dessen Document-Element, wie das in Listing 3 für das Formular frmIntro der Beispieldatenbank geschieht. Auch hier kommt es zu einer Enumeration über eine For-Each-Schleife. Die verwendete Auflistungseigenschaft sind die Properties des zuvor festgelegten Documents daoDoc.

Sub DAOFormProperties()

     Dim dbs As Database

     Dim daoCont As DAO.Container

     Dim daoDoc As DAO.Document

     Dim daoPrp As DAO.Property

     

     Set dbs = CurrentDb

     Set daoCont = dbs.Containers("Forms")

     Set daoDoc = daoCont.Documents("frmIntro")

     For Each daoPrp In daoDoc.Properties

         Debug.Print daoPrp.Name, daoPrp.Value

     Next daoPrp

End Sub

Listing 3: DAO-Properties eines Formulars ermitteln

Was uns hier natürlich interessiert, sind nicht nur die Namen der Eigenschaften, sondern auch deren Werte. Neben Name wird deshalb auch noch die Eigenschaft Value der Properties ausgegeben.

Am Dim-Block im Kopf der Prozedur können Sie gut nachvollziehen, wie die Objekte von Database bis Property hierarchisch voneinander anhängen. Um das nochmals besser zu verdeutlichen, finden Sie in Bild 1 auf der nächsten Seite das prinzipielle Objektmodell dieses Systems.

Darstellung einiger DAO-Auflistungs- und -Objektklassen im hierarchischen Objektmodell

Bild 1: Darstellung einiger DAO-Auflistungs- und -Objektklassen im hierarchischen Objektmodell

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!