Code-Bibliotheken

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wer bereits eine Reihe von Projekten durchgeführt hat, verfügt in der Regel über einen Fundus immer wiederkehrender Elemente wie Prozeduren, Module oder Klassen. Diese kopiert man dann von bestehenden in neue Datenbanken und kann so getestete, funktionierende Elemente weiternutzen. Aber was ist, wenn man in einer Datenbank Fehler an einem solchen Element findet und behebt oder das Element gar weiterentwickelt Wie gewährleistet man, dass die übrigen Anwendungen, die dieses Element verwenden, auch davon profitieren Dies gelingt zum Beispiel durch den Einsatz von Code-Bibliotheken. Wie dieser in der Praxis aussieht, erfahren Sie in diesem Beitrag.

Auch wer nur ganz wenige Zeilen seines Codes in anderen Anwendungen weiterverwendet: Standardfunktionen wie etwa zum Ermitteln eines SQL-formatierten Datums (#2010/10/01#) oder FLookup und Co. (schnellere Varianten der eingebauten Domänenfunktionen) oder ähnliche wird wohl jeder Entwickler bereits einmal aus einer Anwendung kopiert und in eine weitere Anwendung eingefügt haben.

Hin und wieder zeigt sich jedoch, dass das eine oder andere Element nicht wie gewünscht funktioniert oder gar Fehler verursacht. Nach der änderung der verantwortlichen Codezeilen tritt der Fehler nicht mehr auf – aber nur in der Anwendung, in der Sie ihn behoben haben.

Also ermitteln Sie alle Anwendungen, in denen die entsprechende Funktion noch vorkommt, was je nach Verbreitung gar nicht so einfach ist, und beheben den Fehler an allen betroffenen Stellen.

Noch interessanter wird es, wenn Sie komplette Sätze, bestehend aus Elementen wie Tabellen, Abfragen, Formularen, Standard- und Klassenmodulen, immer wieder verwenden und diese wiederum auf gemeinsame Elemente zugreifen.

Ein Beispiel ist ein Modul mit einer einfachen Funktion zur Fehlerbehandlung. Wenn alle Elemente in der gleichen Datenbankdatei stecken, können auch alle auf die gleiche Fehlerbehandlung zugreifen.

Wenn Sie nun einen Satz von Elementen (eine Komponente), der auch die Fehlerbehandlung verwendet, von Anwendung A nach Anwendung B kopieren, läuft alles rund.

Wenn Sie jetzt einen anderen Satz von Elementen von Anwendung C nach Anwendung B importieren, der die gleiche Fehlerbehandlung verwendet, ist diese doppelt vorhanden, was einen Kompilierfehler auslöst.

Dies ist kein Problem, wenn Sie die Komponenten komplett in eigene Datenbankdateien auslagern und diese von den eigentlichen Datenbank-Anwendungen aus referenzieren: Jede Komponente kann dann ihre eigene Fehlerbehandlung verwenden.

Oder, um das Spiel noch ein wenig weiterzutreiben: Die Fehlerbehandlung wird ihrerseits in eine weitere Datenbankdatei ausgelagert und von allen anderen Komponenten und auch von der Hauptanwendung referenziert.

Und damit kommen wir zum Thema Codebibliotheken: Darunter versteht man im Allgemeinen herkömmliche Datenbankdateien, die über den Verweise-Dialog in die Hauptanwendung eingebunden werden.

Bibliothek erstellen

Als Bibliothek verwenden Sie eine herkömmliche Access-Datenbank (in den Beispieldateien heißt diese DBMitBibliothek.mdb).

Legen Sie fest, welche Access-Versionen auf diese Bibliothek zugreifen sollen und verwenden Sie die kleinste Version als Datenbankformat (viele verwenden noch Access 2000, weshalb dies größtmögliche Kompatibilität bietet – aber beachten Sie, dass beispielsweise nicht alle VBA-Befehle hiermit funktionieren).

Elemente, die Sie in anderen Datenbanken verwenden möchten, müssen als Public deklariert werden. Beginnen wir mit einer kleinen Beispielfunktion namens BibMsgBox, die wie folgt aussieht und in einem Standardmodul namens mdlBibliothek landet:

Public Sub BibMsgBox()
    MsgBox "Meldung aus der Bibliothek"
End Sub

Die Prozedur zeigt ein einfaches Meldungsfenster an. Damit die Bibliothek beim Einbinden in andere Datenbanken keinen Konflikt auslöst, vergeben Sie einen eindeutigen Namen für das VBA-Projekt. Dies erledigen Sie in den Projekteigenschaften (Extras|Projekteigenschaften, s. Bild 1).

pic001.png

Bild 1: Einstellen des Namens eines VBA-Projekts

Bibliothek referenzieren

Nun öffnen oder erstellen Sie die Datenbank, welche die in der Bibliothek befindliche Routine aufrufen soll. Dort müssen Sie die Bibliothek zunächst referenzieren, was Sie über den Verweise-Dialog erledigen.

Aktivieren Sie mit Alt + F11 den VBA-Editor und wählen Sie den Menüeintrag Extras|Verweise aus. Klicken Sie auf Durchsuchen und wählen Sie die soeben erstellte Bibliotheksdatenbank aus. Diese erscheint anschließend in der Liste der Verweise (s. Bild 2).

pic002.png

Bild 2: Ein Verweis auf eine Bibliotheksdatenbank

Sollte dies nicht der Fall sein, ist möglicherweise im Projekt-Explorer des VBA-Editors das falsche Projekt aktiviert. Der Projekt-Explorer zeigt nämlich nach dem Einbinden der Bibliothek nicht mehr nur das zur aktuellen Datenbankdatei gehörende VBA-Projekt in der Übersicht an, sondern auch das per Verweis eingebundene (s. Bild 3). Ist dieses aktiviert, zeigt der Verweise-Dialog die für dieses VBA-Projekt festgelegten Verweise an.

pic003.png

Bild 3: Auch in Bibliotheksdatenbanken enthaltene Projekte werden im Projekt-Explorer angezeigt.

ändern von Bibliotheken

Wenn Sie Bibliotheken verwenden, stellen sich oft erst im Einsatz in der Zielanwendung Programmierfehler heraus. Sie werden dann normalerweies schnell in den VBA-Editor wechseln, um das Problem zu beheben.

Auch wenn dies im ersten Moment gelingt: änderungen an Bibliotheken von anderen Anwendungen aus sind, genau wie bei Access-Add-Ins auch, nur temporär und halten genau solange, bis Sie die Anwendung schließen.

Das reicht zum Testen, ob ein Bugfix funktioniert, zum Durchführen der eigentlichen änderung müssen Sie die Bibliotheksdatenbank jedoch allein öffnen. Ein kleiner Praxistipp: Nehmen Sie kleinere änderungen direkt von der Host-Anwendung aus vor und testen Sie diese.

Dann kopieren Sie das komplette Modul, schließen die Hauptanwendung, öffnen die Bibliotheksdatenbank und fügen den geänderten Code in das entsprechende Modul ein. Größere änderungen sollten Sie jedoch direkt in der Bibliotheksanwendung durchführen, da änderungen sonst schnell versehentlich verloren gehen.

Komplette Klassen aus Bibliotheken verwenden

Der Anlass für diesen Beitrag ist eigentlich der Einsatz verschiedener Klassenmodule beziehungsweise kompletter Sammlungen von Modulen und anderen Elementen in unterschiedlichen Anwendungen (ein Beispiel folgt in der kommenden Ausgabe von Access im Unternehmen).

Damit jede Anwendung gleich von eventuellen änderungen profitiert, sollen alle die gleiche Bibliothek anzapfen und den dort enthaltenen Code verwenden.

In vielen Fällen reicht es aus, lediglich auf die öffentlich deklarierten Funktionen und Prozeduren der Bibliothek zuzugreifen. Der TreeViewHandler beispielsweise wird jedoch enger mit der Host-Anwendung verzahnt.

Diese soll beispielsweise auf Ereignisse reagieren, die durch den Zugriff auf die Elemente des mit dem TreeViewHandler gesteuerten TreeViews ausgelöst werden – ein Klick auf ein Element, das Anzeigen des Kontextmenüs und so weiter. Damit dies funktioniert, müssen Sie in der Host-Anwendung gleich eine komplette Klasse instanzieren.

Wir zeigen an einem kleinen Beispiel, wie das funktioniert. Die Beispieldatenbank Bibliothek.mdb enthält eine Klasse namens clsEreignisklasse mit folgendem Inhalt:

Public Event EreignisWurdeAusgeloest()
Public Sub Ereignisausloesen()
    RaiseEvent EreignisWurdeAusgeloest
End Sub
Public Sub Methode()
    MsgBox "Methode funktioniert"
End Sub

Wenn Sie diese Datenbank nun schließen und die oben bereits verwendete Host-Datenbank DBMitBibliothek öffnen, sollten Sie die Klasse eigentlich referenzieren können – beispielsweise wie bei der Deklaration in Bild 4.

pic005.png

Bild 4: Die Klasse ist trotz Verweis nicht sichtbar.

Allerdings bietet nicht nur IntelliSense keine solche Klasse zur Auswahl an, die Deklaration wie in folgender Zeile führt sogar zu einem Kompilierfehler (Benutzerdefinierter Typ nicht deklariert):

Public objEreignisklasse As clsEreignisklasse

Das Problem ist die für diesen Zweck falsche Deklaration des Klassenmoduls in der Bibliotheksdatenbank. Für diese müssen Sie die Eigenschaft Instancing auf PublicNonCreatable einstellen (s. Bild 5).

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar