Access per URL starten

Dieser Artikel ist Teil des Magazins 'Access im Unternehmen', Ausgabe 1/2017.

Access per URL starten

Ein interessanter Anwendungsfall ist das Starten einer Access-Anwendung über den Aufruf einer URL etwa im Browser – zum Beispiel von einer Internetanwendung aus, die einen speziell vorbereiteten Link enthält. Die Betätigung dieses Links soll dann Access starten, die gewünschte Datenbank öffnen und gegebenenfalls sogar noch einen oder mehrere Parameter an die Anwendung übergeben. Wie das gelingt, schauen wir uns im vorliegenden Beitrag an.

Im konkreten Fall schickte uns ein Leser die Anforderung, bei der eine Internetanwendung eine Möglichkeit bietet, über eine Schaltfläche beziehungsweise einen Link eine eigene URL anzugeben, die bei Betätigung geöffnet wird.

Lässt sich dies realisieren, und wenn ja, wie? Die Lösung ist nicht besonders nahe liegend, denn wir können die Anwendung ja nicht über einen herkömmlichen Batch-Befehl starten, wie es etwa über eine Dateiverknüpfung erfolgt.

Der Trick ist, dass wir einen eigenen Datei-Handler definieren, wie er normalerweise in die URL-Leiste des Browsers eingegeben wird, also beispielsweise http: oder ftp:. Dem lassen wir dann die Daten folgen, die als Parameter an die aufzurufende Access-Datenbank übergeben werden sollen. Aber wie definieren, dass etwa bei Übergabe des Handlers accessdb: auch wirklichen eine Access-Datenbank geöffnet wird, und welche dies ist? Dies legen wir in der Registry fest, und zwar etwa wie in Bild 1. Wir fügen also dem Zweig HKEY_CLASSES_ROOT ein neues Element namens accessdb hinzu. Dafür legen wir als Standardwert URL:accessdb Protocol fest und ein weiteres Element namens URL Protocol, das aber leer bleibt. Darunter folgen drei weitere verschachtelte Elemente, nämlich shell, open und command. Letzteres erhält die auszuführende Batch-Anweisung, in diesem Fall den Aufruf der Anwendung MSACCESS.EXE und die Angabe der zu öffnenden Datenbankdatei mit Pfad. Danach folgt noch der Ausdruck /cmd %1, den wir später erläutern:

Einstellungen in der Registry

Bild 1: Einstellungen in der Registry

"C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE"
"C:\Users\User\Dropbox\Daten\URLTest.accdb" /cmd %1

Um diese Einträge automatisch per Doppelklick auf eine Datei namens accessdb.reg zur Registry hinzuzufügen, füllen Sie diese Datei mit dem Code aus Listing 1.

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTaccessdb]
@="URL:accessdb Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOTaccessdbshell]
[HKEY_CLASSES_ROOTaccessdbshellopen]
[HKEY_CLASSES_ROOTaccessdbshellopencommand]
@=""C:Program Files (x86)Microsoft OfficerootOffice16MSACCESS.EXE" 
"C:UsersUserDropboxDatenURLTest.accdb" /cmd %1"

Listing 1: Inhalt der Datei accessdb.reg zum Anlegen der benötigten Registrierungswerte

Wenn Sie nun im Browser die Adresse accessdb: gefolgt von einem beliebigen Ausdruck eingeben (oder auch nur accessdb:), wird die Access-Datenbank geöffnet und in Access angezeigt. Beim ersten Aufruf kann es vorkommen, dass die Meldung aus Bild 2 erscheint und Sie diese zunächst noch bestätigen müssen. Wenn Sie hier die Option Auswahl für accessdb-Links speichern aktivieren, erscheint diese Meldung anschließend nicht mehr.

Warnmeldung beim Ausführen von Access via Browser

Bild 2: Warnmeldung beim Ausführen von Access via Browser

Dies funktionert wie beschrieben mit Firefox. Unter Microsoft Edge muss die Meldung jedes Mal erneut bestätigt werden, Chrome will Access gar nicht öffnen. Der Internet Explorer bietet auch die Möglichkeit, die Einstellung zu speichern. Wer die Registry bearbeitet, um vom Browser aus eine Access-Datenbank zu starten, wird sich aber vermutlich auch mit der Auswahl eines der funktionierenden Browser anfreunden können.

Parameter übergeben

Nun kommen wir zum interessanten Teil, denn wir wollen ja nicht nur einfach irgendeine Access-Datenbank öffnen, sondern gegebenenfalls auch noch Parameter übergeben.

Die Vorbereitungen, um diese Parameter zu übergeben, haben wir in der Registry bereits getroffen. Dort haben wir nämlich den Ausdruck /cmd %1 an den Batch-Aufruf angehängt. %1 entspricht dabei der kompletten URL. Wenn Sie die Datenbank also mit dem Link accessdb:test öffnen, wird accessdb:test auch als cmd-Parameter übergeben.

Den cmd-Parameter können Sie in der geöffneten Anwendung dann mit der Funktion Command() auslesen. Wenn Sie die Anwendung also mit dem Link geöffnet haben, wechseln Sie testweise zum Direktbereich des VBA-Editors (Strg + G) und geben dort den folgenden Befehl ein:

Debug.Print Command()
   accessdb:test

Den Parameter wollen Sie natürlich nun noch professioneller auswerten – beispielsweise, wenn der Aufruf die Angabe etwa einer Datensatznummer enthält und die Access-Anwendung den entsprechenden Datensatz beim Öffnen anzeigen soll.

Dazu geben wir hinter dem URL-Handler nun direkt den Parameter mit Name und Wert an – etwa wie folgt, um einen Kunden mit dem Wert 3 für das Feld KundeID zu öffnen:

accessdb:KundeID=3

Damit die Datenbank nun gleich das Formular mit dem entsprechenden Wert anzeigt, benötigen wir drei Dinge:

  • ein AutoExec-Makro, das beim Start der Anwendung geöffnet wird,
  • eine VBA-Funktion, die durch das Makro aufgerufen wird und die URL auswertet sowie
  • ein Formular, das schließlich den gewünschten Kunden anzeigt.

Startmakro

Das Makro namens AutoExec sieht wie in Bild 3 aus und soll nur eine einzige Anweisung enthalten. Diese heißt AusführenCode und erhält als Parameter den Namen der aufzurufenden VBA-Funktion, in diesem Fall ParameterAuswerten().

Makro, das beim Start der Anwendung ausgeführt wird

Bild 3: Makro, das beim Start der Anwendung ausgeführt wird

VBA-Funktion

Die benötigte VBA-Funktion sieht wie in Listing 2 aus. Sie weist zunächst den Inhalt der Funktion Command(), also den mit dem Parameter cmd beim Öffnen übergebenen Wert, der Variablen strCommand zu. Dann prüft sie, ob strCommand überhaupt einen Wert enthält. Falls ja, entfernt sie aus diesem Parameter das führende accessdb: und speichert das Ergebnis in der Variablen strParameter. Dann liest sie den Teil vor dem Gleichheitszeichen mit der Left-Funktion aus und speichert diesen in strParametername. Der Teil hinter dem Gleichheitszeichen landet in der Variablen strParameterwert.

Public Function ParameterAuswerten()
     Dim strCommand As String
     Dim strParameter As String
     Dim strParametername As String
     Dim strParameterwert As String
     strCommand = Command()
     If Len(strCommand) > 0 Then
         strParameter = Replace(strCommand, "accessdb:", "")
         strParametername = Left(strParameter, InStr(1, strParameter, "=") - 1)
         strParameterwert = Mid(strParameter, InStr(1, strParameter, "=") + 1)
         DoCmd.OpenForm "frmKunden", WhereCondition:="KundeID = " _
             & strParameterwert, WindowMode:=acDialog
     End If
End Function

Listing 2: Funktion zum Auswerten der Parameter und Öffnen des Formulars mit dem angegebenen Kunden

Damit ausgestattet, können wir nun ein Formular mit einer WhereCondition öffnen, welche den im Formular angezeigten Datensatz auf den gewünschten Kunden einstellt.

Das Formular

Das Formular der Beispielanwendung sieht im Entwurf wie in Bild 4 aus. Es heißt frmKunden und enthält eine einfache Beispieltabelle namens tblKunden mit den vier Feldern KundeID, Firma, Vorname und Nachname als Parameter. Die Felder haben wir einfach in den Detailbereich des Formularentwurfs gezogen.

Formular der Beispielanwendung im Entwurf

Bild 4: Formular der Beispielanwendung im Entwurf

Das Formular zeigt beim Öffnen den mit dem Parameter KundeID angegebenen Kunden an.

Verschiedene Parameter und Formulare

In Listing 3 haben wir noch eine weitere Version der Funktion ParameterAuswerten vorbereitet.

Public Function ParameterAuswerten()
     Dim strCommand As String
     Dim strAlleParameter As String
     Dim strParameter As String
     Dim strParametername As String
     Dim strParameterwert As String
     Dim i As Integer
     strCommand = Command()
     If Len(strCommand) > 0 Then
         strAlleParameter = Replace(strCommand, "accessdb:", "")
         For i = LBound(Split(strAlleParameter, ";")) To UBound(Split(strAlleParameter, ";"))
             strParameter = Split(strAlleParameter, ";")(i)
             strParametername = Left(strParameter, InStr(1, strParameter, "=") - 1)
             Select Case strParametername
                 Case "KundeID"
                     strParameterwert = Mid(strParameter, InStr(1, strParameter, "=") + 1)
                     DoCmd.OpenForm "frmKunden", WhereCondition:="KundeID = " _
                         & strParameterwert, WindowMode:=acDialog
                 Case "ArtikelID"
                     '...
             End Select
         Next i
     End If
End Function

Listing 3: Funktion, die verschiedene Bedingungen unterstützt

Hier sehen wir den Fall vor, dass nicht nur das Kundenformular mit einem Kunden nach dem angegebenen Wert für das Feld KundeID geöffnet werden soll, sondern auch noch andere Parameter verwendet werden können. In diesem Fall haben wir die If...Then-Bedingung durch eine Select Case-Bedingung ersetzt, welche den Inhalt der Variablen strParametername prüft. Wenn Sie nun beispielsweise keinen Kunden, sondern einen Artikel anzeigen wollten, müssten Sie einen Seitenaufruf wie accessdb:ArtikelID=25 angeben. Dies sollte dann ein weiteres Formular mit dem entsprechenden Datensatz öffnen.

Zusammenfassung und Ausblick

Die Lösung ist sehr praktisch, wenn Sie mit Webanwendungen arbeiten, die eine Möglichkeit zum Angeben von URLs zum Anstoßen weiterer Aktionen anbieten.

Damit lässt sich per Link eine Access-Anwendung öffnen, die gleich die gewünschte Aktion wie etwa die Anzeige eines Datensatzes erledigt.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.

  • extrem interessant, aber leider kein Schreibrecht auf die Registry

    Hallo,
    ich beschäftige mich schon seit Jahren beruflich mit Access Anwendungen.
    Dabei ist der Deeplink in spezielle Datensätze einer Anwendung (z.B. von einer Webseite oder aus einer Email) schon immer ein Problem für mich.
    Die interne Verarbeitung der Command() Parameter ist dabei kein Problem, nur die Übergabe eines Parameters in einem Hyperlink war bisher nicht möglich.
    Der hier aufgezeigte Lösungsweg ist sehr interessant.

    Leider habe ich keinen Schreibzugriff auf HKEY_CLASSES_ROOT der Registry.
    Ist auch eine Umsetzung ohne Registry Änderung oder nur im Bereich HKEY_CURRENT_USER möglich?

    Vielen Dank und Gruß
    Günter