Bibliotheken und Verweise untersuchen

Wenn Sie Access-Anwendungen programmieren, nutzen Sie verschiedene Bibliotheken wie etwa die VBA-Bibliothek, die Access-Bibliothek, die DAO-Bibliothek et cetera. In diesem Beitrag schauen wir uns an, wie Sie an wichtige Informationen über diese Bibliotheken gelangen und was dies beispielsweise im Hinblick auf das Ermitteln der neuen Features einer neuen Access-Version bedeutet.

Wo stecken die Bibliotheken

Als Access-Entwickler wissen Sie natürlich, wie Sie den Speicherort der im aktuellen VBA-Projekt eingebundenen Bibliotheken finden – nämlich im Verweise-Dialog, den Sie im VBA-Editor mit dem Menüpunkt Extras|Verweise öffnen.

Allerdings hilft dieser Dialog in vielen Fällen nicht wirklich weiter – er ist schlicht nicht breit genug, um den Pfad des Verweises anzuzeigen (s. Bild 1).

Verweise auf die aktuell eingebundenen Bibliotheken

Bild 1: Verweise auf die aktuell eingebundenen Bibliotheken

Pfade und weitere Informationen einlesen

Wer des VBA einigermaßen mächtig ist, hat wohl schon davon gehört, dass man auch programmatisch auf die Verweise zugreifen kann – und zwar über die References-Auflistung des Application-Objekts. Um dieses zu nutzen, erstellen wir schnell eine Tabelle namens tblBibliotheken, welche die Informationen über die referenzierten Bibliotheken aufnehmen soll. Diese Tabelle sieht im Entwurf wie in Bild 2 aus.

Die Tabelle tblBibliotheken nimmt Informationen zu den Verweisen der aktuellen Datenbank auf.

Bild 2: Die Tabelle tblBibliotheken nimmt Informationen zu den Verweisen der aktuellen Datenbank auf.

Zum Anzeigen der eingelesenen Daten erstellen wir zwei Formulare – ein Hauptformular namens frmBibliotheken und ein Unterformular namens sfmBibliotheken. Beide sollen an die Tabelle tblBibliotheken gebunden sein, wobei das Hauptformular allerdings die Details und das Unterformular die vollständige Liste der Verweise liefern soll.

Deshalb fügen Sie dem Detailbereich des Unterformulars sfmBibliotheken zunächst nur das Feld Bezeichnung der Datenherkunft hinzu. Das Hauptformular nimmt zwei Schaltflächen auf, deren Funktion wir im Anschluss erläutern. Außerdem fügen Sie diesem das Unterformular hinzu und ziehen alle Felder der Datenherkunft mit Ausnahme des Primärschlüsselfeldes BibliothekID in einen eingerahmten Bereich. Das Ergebnis sieht schließlich wie in Bild 3 aus.

Formular und Unterformular zur Anzeige der Bibliotheken in der Entwurfsansicht

Bild 3: Formular und Unterformular zur Anzeige der Bibliotheken in der Entwurfsansicht

Bibliotheken-Tabelle füllen

Bevor das Formular Daten anzeigen kann, müssen Sie die Tabelle tblBibliotheken mit den Informationen über die referenzierten Bibliotheken füllen. Dies erledigt die Prozedur, die durch das Ereignis Beim Klicken der linken Schaltfläche namens cmdEinlesen ausgelöst wird. Diese Prozedur sieht wie in Listing 1 aus.

Private Sub cmdEinlesen_Click()
     Dim db As DAO.Database
     Dim ref As Reference
     Dim strSQL As String
     Set db = CurrentDb
     db.Execute "DELETE FROM tblBibliotheken", dbFailOnError
     For Each ref In Application.References
         With ref
             strSQL = "INSERT INTO tblBibliotheken(Bezeichnung, Eingebaut, Pfad, BibliothekGUID, Art, " _
                 & "Major, Minor) VALUES(''" & .Name & "'', " & CLng(.BuiltIn) & ", ''" & .FullPath _
                 & "'', ''" & .Guid & "'', " & .Kind & ", ''" & .Major & "'', ''" & .Minor & "'')"
             db.Execute strSQL, dbFailOnError
         End With
     Next ref
     Me!sfmBibliotheken.Form.Requery
End Sub

Listing 1: Einlesen der referenzierten Bibliotheken

Die Prozedur deklariert einige Variablen, darunter die Variable ref des Typs Reference. Darüber greifen Sie auf die Verweise zu. Zu Beginn leert die Prozedur die Tabelle tblBibliotheken mit dem Aufruf einer entsprechenden DELETE-Anweisung.

In einer For Each-Schleife über die References-Auflistung des Application-Objekts durchläuft die Prozedur dann alle enthaltenen Elemente. Innerhalb der Schleife setzt die Prozedur in der Variablen strSQL eine SQL-Anweisung zusammen, welche die folgenden Eigenschaften des Reference-Objekts in die Tabelle tblBibliotheken schreibt:

  • Name: Name der Bibliothek
  • BuiltIn: Boolean-Wert, der angibt, ob der Verweis auf die Bibliothek eingebaut ist – und dementsprechend nicht entfernt werden kann
  • FullPath: Pfad zur Bibliotheksdatei
  • Guid: Eindeutiger Kennzeichner der Bibliothek
  • Kind: Art der Bibliothek. Es gibt zwei mögliche Werte: vbext_rk_TypeLib (0) entspricht einer Typbibliothek, vbext_rk_Project (1) einem eingebundenen VBA-Projekt.
  • Major: Hauptversion der Bibliothek
  • Minor: Nebenversion der Bibliothek

Nach dem Durchlaufen aller Verweise aktualisiert die Prozedur noch das Unterformular. Das Ergebnis sieht beispielsweise wie in Bild 4 aus.

Liste der Verweise und Details des aktuell angezeigten Verweises nach dem Einlesen

Bild 4: Liste der Verweise und Details des aktuell angezeigten Verweises nach dem Einlesen

Haupt- und Unterformular synchronisieren

Fehlt noch eine Kleinigkeit: Wenn Sie auf einen der Einträge des Unterformulars klicken, soll das Hauptformular die Details zu diesem Datensatz anzeigen. Dazu fügen Sie zur Prozedur Form_Load, die beim Laden des Formulars ausgelöst wird, die folgende Zeile hinzu:

Private Sub Form_Load()
     Set Me.Recordset = _
         Me!sfmBibliotheken.Form.Recordset
End Sub

Dies synchronisiert den jeweils aktuellen Datensatz in beide Richtungen. Wenn Sie einen Datensatz im Unterformular auswählen, wird dieser im Hauptformular angezeigt und umgekehrt.

Wo ist die korrekte Bezeichnung

Wenn Sie sich den Verweise-Dialog ins Gedächtnis rufen, stellen Sie fest, dass dieser wesentlich aussagekräftigere Bezeichnungen liefert als die Eigenschaft Name – mit VBA und Access lässt sich ja noch etwas anfangen, aber stdole hört sich kryptisch an.

Irgendwo müssen aber doch auch die entsprechenden Bezeichnungen aus dem Verweise-Dialog wie Visual Basic for Applications, Microsoft Access 14.0 Object Library oder OLE Automatisch abrufbar sein

Und das ist auch der Fall: Es gibt nämlich noch eine weitere References-Auflistung mit entsprechenden Reference-Objekten. Diese stellt die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3 bereit, auf die wir nun einen Verweis hinzufügen.

Wir wollen die lange Version der Bezeichnung unter einem neuen Feld namens Beschreibung in der Tabelle tblBibliotheken speichern. Damit das Formular entweder die Beschreibung oder, falls diese nicht verfügbar ist, die Bezeichnung anzeigt, erstellen wir eine neue Abfrage als Datenherkunft. Diese sieht wie in Bild 5 aus und enthält ein Feld mit folgendem Ausdruck:

Abfrage, die nach Bedarf die Bezeichnung oder die Beschreibung liefert

Bild 5: Abfrage, die nach Bedarf die Bezeichnung oder die Beschreibung liefert

Bezeichnung: Nz([Beschreibung];[tblBibliotheken].[Bezeichnung])

Dieses neue Feld Bezeichnung prüft den Inhalt des Feldes Beschreibung. Ist dieses nicht leer, wird der Inhalt dieses Feldes zurückgegeben, sonst der Inhalt des Feldes Bezeichnung. Damit kein Zirkelbezug ausgelöst wird, verweist die Funktion auf [tblBibliotheken].[Bezeichnung] statt nur auf [Bezeichnung].

Ersetzen Sie nun im Haupt- und im Unterformular die Datenherkunft tblBibliotheken durch qryBibliotheken, damit jederzeit die korrekten Daten angezeigt werden.

Lange Bezeichnung einlesen

Nun fehlt allerdings noch eine Prozedur, mit der Sie die lange Bezeichnung der Bibliothek einlesen können. Dazu rollen wir die zuvor erstellte Prozedur neu auf und legen diese für das Ereignis Beim Klicken der zweiten Schaltfläche cmdEinlesenII an (s. Listing 2).

Private Sub cmdEinlesenII_Click()
     Dim db As DAO.Database
     Dim ref As VBIDE.Reference
     Dim strSQL As String
     Dim objProject As VBIDE.VBProject
     Set db = CurrentDb
     db.Execute "DELETE FROM tblBibliotheken", dbFailOnError
     For Each objProject In VBE.VBProjects
         If objProject.FileName = CurrentDb.Name Then
             Exit For
         End If
     Next objProject
     For Each ref In objProject.References
         With ref
             strSQL = "INSERT INTO tblBibliotheken(Bezeichnung, Eingebaut, Pfad, BibliothekGUID, " _
                 & "Art, Major, Minor, Beschreibung) VALUES(''" & .Name & "'', " & CLng(.BuiltIn) _
                 & ", ''" & .FullPath & "'', ''" & .Guid & "'', " & .Type & ", ''" & .Major & "'', ''" _
                 & .Minor & "'', ''" & .Description & "'')"
             db.Execute strSQL, dbFailOnError
         End With
     Next ref
     Me!sfmBibliotheken.Form.Requery
End Sub

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