Funktionen aus anderen Datenbanken

Manche Funktionen benötigen Sie nicht nur in einer, sondern in mehreren Datenbanken. Sie können die Funktion dann in die jeweiligen Datenbanken kopieren und dort nutzen. Dies bringt allerdings einigen Mehraufwand bei der Pflege der Funktion mit sich: Wenn Sie etwa einen Fehler beheben, müssen Sie dies gleich für mehrere Datenbanken erledigen. Beim zentralen Speichern der Funktion in einer einzigen Datenbankdatei brauchen Sie änderungen nur an einer einzigen Stelle durchzuführen. Und es gibt noch weitere Vorteile und Anwendungszwecke – mehr dazu im vorliegenden Beitrag.

Der Grund dafür, die in diesem Beitrag vorgestellten Techniken zu verwenden, ist die Lösung aus einem anderen Beitrag namens Alle Datenbanken einlesen und anzeigen (www.access-im-unternehmen.de/888). Dort stellen wir ein Add-In vor, mit dem Sie den Pfad zu einer bestimmten Access-Datenbank ermitteln können. Dabei liefert das Add-In nur die Verzeichnisse, in denen sich auch tatsächlich Access-Datenbankdateien befinden.

Das Problem dieses Add-Ins und von Add-Ins im Allgemeinen ist: Es gibt keinen einfachen Weg, die enthaltenen Funktionen aufzurufen und die Ergebnisse direkt etwa per VBA in ein Textfeld zu schreiben. Gerade beim Ermitteln von Verzeichnissen und Datenbankdateien wäre dies aber sinnvoll – anderenfalls müsste man immer den Pfad aus dem Add-In-Formular kopieren und an der gewünschten Stelle eintragen. Außerdem lassen sich Add-Ins und ihre Funktionen nur über genau definierte Schnittstellen aufrufen – beispielsweise über das Add-Ins-Menü oder als Objekt- oder Steuerelement-Assistent. Wenn Sie die Funktion aber etwa über die neben einem Textfeld platzierte Schaltfläche aufrufen und das Ergebnis in das Textfeld eintragen möchten, müssen Sie selbst eine Lösung per VBA erstellen.

Dies ist, um beim Beispiel der Datenbankauswahl zu bleiben, auch kein Problem – Sie brauchen einfach nur alle Objekte der Add-In-Datenbank in die Zieldatenbank zu kopieren und die dort enthaltene Funktion zum Starten des Add-Ins aufzurufen. Praktischer wäre es dennoch, wenn Sie eine solche Funktion an zentraler Stelle vorhalten und aufrufen könnten, statt diese in mehrere Datenbanken zu integrieren und dort auch separat pflegen zu müssen.

Der Ansatz

Der nachfolgend vorgestellte Ansatz basiert grundsätzlich darauf, eine Bibliotheksdatenbank mit allgemeinen Funktionen in die Zieldatenbank einzubinden und die Funktionen der Bibliotheksdatenbank in der Zieldatenbank verfügbar zu machen. Allerdings ist für diese Vorgehensweise ein fester Verweis auf die Bibliotheksdatenbank nötig. Verschieben Sie die Funktionsbibliothek, liefert die Zieldatenbank beim Aufruf einer der Funktionen einen Fehler.

Bei der in diesem Beitrag verwendeten Technik wird die Bibliotheksdatenbank quasi per Late Binding referenziert, also erst kurz vor dem Zugriff auf die enthaltenen Funktionen. Das bedeutet, dass wir vor dem Binden noch prüfen können, ob die Funktionsbibliothek an Ort und Stelle ist.

Falls nicht, liefern Sie dem Benutzer eine aussagekräftige Meldung und bitten ihn, die Bibliotheksdatenbank an die gewünschte Stelle zu kopieren.

Entwickler oder Benutzer

Grundsätzlich sollten Sie jedoch überlegen, ob Sie die vorgestellten Techniken nur für den Zeitraum der Entwicklung nutzen oder ob auch der Benutzer die Bibliotheken erhalten soll. Sie als Entwickler haben (hoffentlich) einen genauen Überblick darüber, wo eine Datenbankanwendung auf Bibliotheken zugreift, und können gegebenenfalls schnell mal einen Pfad anpassen.

Wenn Sie in den Anwendungen, die Sie an Benutzer weitergeben, ebenfalls mit Funktionsbibliotheken arbeiten möchten, könnte der Betrieb natürlich durch fehlende Bibliotheksdateien gestört werden.

Wenn zur Weitergabe vorgesehene Datenbankdateien hingegen alle notwendigen Funktionen im eigenen VBA-Projekt enthalten, entfällt diese Gefahr. Dafür ist bei Aktualisierungen in den Bibliotheksfunktionen gleich das ganze Frontend auszutauschen.

In diesem Beitrag erläutern wir, wie Sie das Einbinden externer Funktionen per Late Binding als Entwickler nutzen können.

Funktionsbibliothek erstellen

Die Funktionsbibliothek muss eine wichtige Voraussetzung erfüllen: Sie muss als Add-In gekennzeichnet werden.

Das ist allerdings im Handumdrehen erledigt – Sie passen dazu lediglich die Dateiendung an:

  • aus .mdb wird .mda und
  • aus .accdb wird .accda.

Sprich: Sie ersetzen einfach nur das b durch das a.

Und, was noch besser ist – im Hinblick auf die eventuelle Weitergabe einer solchen Code-Bibliothek: Sie können auch eine als .mde oder .accde erstellte Datenbankdatei in eine .mda oder .accda-Bibliothek umwandeln.

Begriffsklärung

Im Folgenden sollen die aufrufende Anwendung Host-Anwendung und die Anwendung mit den aufgerufenen Funktionen Add-In-Anwendung heißen.

Einfache Funktion aufrufen

Beginnen wir mit dem ersten Beispiel. Dabei soll die Host-Anwendung eine einfache Funktion in der Add-In-Anwendung aufrufen.

Erstellen Sie also eine Add-In-Anwendung, die sich lediglich durch den Buchstaben a in der Dateiendung als solche zu erkennen gibt. Die sonst bei Add-Ins üblichen Maßnahmen brauchen Sie nicht zu treffen.

Legen Sie dann ein Standardmodul beliebigen Namens in der Add-In-Datenbank an und fügen Sie dort die folgende Funktion hinzu:

Public Function Meldungsfenster()
    MsgBox "Einfaches Meldungsfenster", vbOKOnly, "Add-In"
End Function

Der Test der Funktion zeigt das Meldungsfenster an. Nun schließen Sie die Add-In-Anwendung und erstellen beziehungsweise öffnen die Host-Anwendung.

Damit wir direkt von der Benutzeroberfläche aus arbeiten, legen Sie ein neues Formular in der Host-Anwendung an und fügen diesem eine Schaltfläche namens cmdMeldungsfenster hinzu.

Legen Sie für diese Schaltfläche die folgende Ereignisprozedur an, die durch das Beim Klicken-Ereignis ausgelöst wird:

Private Sub cmdMeldungsfenster_Click()
    Application.Run CurrentProject.Path & "\Ziel.Meldungsfenster"
End Sub

Lassen Sie uns die einzige Anweisung dieser Prozedur auseinandernehmen: Der Aufruf der Funktion in der Add-In-Datenbank wird also durch die Run-Funktion des Application-Objekts erreicht. Diese erwartet als Parameter das Verzeichnis und den Namen der Add-In-Anwendung sowie den Namen der auszuführenden Funktion.

CurrentProject.Path ermittelt in diesem Beispiel den Pfad der aktuellen Datenbank. Damit das Beispiel funktioniert, muss sich die Add-In-Datenbank also im gleichen Verzeichnis wie die Host-Datenbank befinden.

Öffnen Sie das Formular nun in der Formularansicht und klicken Sie auf die Schaltfläche. Dies sollte das Meldungsfenster aus Bild 1 hervorrufen.

pic001.png

Bild 1: Aufruf eines Meldungsfensters aus einer anderen Datenbank

Speicherort der Add-In-Datenbank

Sie können die Add-In-Datenbank natürlich auch an jedem anderen Ort speichern – Sie müssen lediglich sicherstellen, dass diese an dem in der Run-Funktion angegebenen Ort liegt. Auch Folgendes wäre machbar, wenn sich die Add-In-Anwendung direkt im Verzeichnis c:\ befindet:

Application.Run "c:\Ziel.Meldungsfenster"

Hier ist deutlicher zu erkennen, dass Sie nur den Namen der Add-In-Anwendung angeben müssen und nicht die Dateiendung. Stattdessen tragen Sie hinter dem Punkt den Namen der aufzurufenden Funktion ein, hier Meldungsfenster. Damit geht einher, dass Sie nicht gleichzeitig etwa eine Add-In-Anwendung namens Ziel.mda und Ziel.accda einsetzen sollten. Das Dateisystem kann beide Dateien zwar unterscheiden, aber nicht die Run-Funkion.

Wenn Sie die Beispieldatenbanken ausprobieren möchten, speichern Sie Start.mdb und Ziel.mda im gleichen Verzeichnis, da hier die CurrentProject.Path-Methode zum Ermitteln des Dateipfades der Add-In-Anwendung verwendet wird.

Was geschieht

Bevor wir mit weiteren Beispielen fortfahren, schauen wir uns an, was sich mittlerweile im VBA-Editor getan hat. Diesen aktivieren Sie am schnellsten mit einer der Tastenkombinationen Strg + G oder Alt + F11.

Der VBA-Editor zeigt im Objekt-Explorer nunmehr nicht nur das VBA-Projekt der aktuell geöffneten Host-Anwendung an, sondern zusätzlich das der Add-In-Anwendung (s. Bild 2). Daran ist zu erkennen, dass Access das VBA-Projekt der verwendeten Add-In-Anwendung quasi eingebunden hat – auch wenn der Verweise-Dialog keinen Verweis auf die Add-In-Anwendung aufweist.

pic002.png

Bild 2: Anzeige der VBA-Projekte der Host- und der Add-In-Anwendung

Hier sind nun folgende Dinge zu beachten:

  • Sie können zwar den Code im VBA-Projekt der Add-In-Anwendung ändern und diesen auch ausprobieren. Allerdings werden Sie beim Schließen der Host-Anwendung und beim anschließenden separaten Öffnen des VBA-Projekts der Add-In-Anwendung feststellen, dass sämtliche änderungen verlorengegangen sind. Also: Sie können natürlich schnell mal eine änderung vornehmen, um diese auszuprobieren – aber schließen Sie die Host-Anwendung dann niemals, ohne den geänderten Code zu kopieren und anschließend direkt in die Add-In-Anwendung einzupflegen!
  • Das VBA-Projekt der Add-In-Anwendung bleibt bis zum Schließen der Host-Anwendung im Projekt-Explorer erhalten. Sie können also nicht etwa im VBA-Code einen Verweis auf das Projekt setzen und die Instanz durch Leeren des Verweises im Nirwana verschwinden lassen.

Sub oder Funktion

Während Sie beim Aufruf eines Access-Add-Ins über die Benutzeroberfläche, also etwa über das Add-Ins-Menü, nur VBA-Functions verwenden können, erlaubt die Run-Funktion auch den Einsatz von Sub-Prozeduren. Die folgende Prozedur in der Add-In-Datenbank würde also den gleichen Effekt bewirken:

Public Sub Meldungsfenster_Sub()
    MsgBox "Einfaches Meldungsfenster aus einer Sub", vbOKOnly, "Add-In"
End Sub

Der folgende Aufruf startet diese Prozedur (siehe Schaltfläche cmdMeldungsfensterSub im Beispielformular):

    Application.Run CurrentProject.Path & "\Ziel.Meldungsfenster_Sub"

Dies zeigt ebenfalls das erwartete Meldungsfenster an.

Funktion mit Rückgabewert

Im nächsten Beispiel erfahren Sie, wie Sie von der Funktion in der Add-In-Datenbank einen Funktionswert zurückgeben lassen. Legen Sie dazu im Standardmodul der Add-In-Datenbank die folgende Funktion an:

Public Function Rueckgabewert() As String
    Rueckgabewert = "Wert von Add-In"
End Function

Diese Funktion liefert auf herkömmliche Weise eine Zeichenkette als Funktionswert an die aufrufende Anweisung.

Im Beispielformular finden Sie den Aufruf dieser Funktion in der Prozedur cmdRueckgabewert_Click. Der Unterschied zum vorherigen Beispiel ist, dass wir das Ergebnis der Run-Funktion in der Variablen strTest speichern und anschließend in einem Meldungsfenster ausgeben.

Wichtig ist dabei, dass Sie den Parameter der Run-Funktion in Klammern einfassen:

Private Sub cmdRueckgabewert_Click()
    Dim strTest As String
    strTest = Application.Run(CurrentProject.Path & "\Ziel.Rueckgabewert")
    MsgBox "Funktionswert von Add-In: ''" & strTest & "''", vbOKOnly, "Host"
End Sub

Auch dies gelingt ohne Probleme, wie Bild 3 zeigt.

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

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar