Home > Artikel > Ausgabe 6/2011 > Tabellenverknüpfungen pflegen

Tabellenverknüpfungen pflegen

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).

Wenn Sie eine Datenbank in Frontend und Backend aufgeteilt haben, greift das Frontend über eine Verknüpfung auf die Tabellen im Backend zu. Wo sich das Backend befindet, wird in einer Systemtabelle gespeichert. Diese wird beim Verschieben des Backends jedoch nicht automatisch aktualisiert, was zur Folge hat, dass das Frontend sein Backend und die enthaltenen verknüpften Tabellen nicht mehr findet. Dieser Artikel stellt Strategien vor, um die Verknüpfungen stets aktuell zu halten.

Beispieldatenbank

Die Beispieldatenbanken zu diesem Artikel heißen 1106_Verknuepfungen_FE.mdb und 1106_Verknuepfungen_BE.mdb. Sie finden diese im Download zu diesem Artikel.

Anwendungsfälle

Für das Aufteilen von Datenbanken gibt es verschiedene Anlässe. Die wichtigsten sind die bessere Möglichkeit der Wartung und der Mehrbenutzerzugriff. Eine aufgeteilte Datenbank lässt sich besser warten, weil man die Anwendungslogik, also Abfragen, Formulare, Berichte und VBA/Makros anpassen und anschließend einfach die neue Version des Frontends mit dem Backend verknüpfen kann.

Der Mehrbenutzerzugriff erlaubt es, das mehrere Benutzer mit jeweils einem auf ihrem Arbeitsplatz installiertem Frontend auf die im Backend auf dem Server gespeicherten Daten zugreifen können.

Natürlich lassen sich die verbesserten Wartungsmöglichkeiten auch in Mehrbenutzerumgebungen einsetzen.

Beim einfachen Aufteilen einer Datenbank zur besseren Wartung einer Einzelplatz-Anwendung liegen Frontend und Backend optimalerweise im gleichen Verzeichnis der lokalen Festplatte. Hier kann es vorkommen, dass Frontend- und Backend-Datenbank zusammen in ein anderes Verzeichnis oder sogar auf einen anderen Rechner übertragen werden.

Beim einer Mehrbenutzer-Datenbank liegen die Frontends jeweils auf den Arbeitsplätzen der Mitarbeiter, das Backend befindet sich auf einem Server-Rechner. Das entsprechende Netzwerkverzeichnis ist normalerweise auf dem jeweiligen Arbeitsplatzrechner gemappt. Dies geschieht entweder individuell, das heißt, das jeder Benutzer das Verzeichnis unter einem selbst gewählten Buchstaben mappt, oder jeder Benutzer verwendet standardmäßig den gleichen Pfad für den Zugriff auf den Server.

Verknüpfungen erneuern

Wann immer Sie bei einer Kombination aus Frontend- und Backend-Datenbank die Backend-Datenbank verschieben, müssen Sie die Verknüpfungen anpassen.

Daher ist Variante mit der individuellen Festlegung des Laufwerkbuchstabens die ungünstigste: Sie müssen dann auch für jedes Frontend die Verknüpfungen individuell erneuern.

Wenn alle Benutzer den gleichen Pfad verwenden, beispielsweise e:DatenbankenBackend.mdb, brauchen Sie die Verknüpfungen nur einmal auf Basis dieses Pfades zu erstellen und können die Frontend-Datenbank dann von jedem Arbeitsplatz aus problemlos einsetzen. Selbst bei einem Verschieben des Backends muss nur das Mapping aktualisiert werden.

Das Verschieben von Frontend- und Backend einer Einzelplatzlösung ist ein Zwischending: Auch hier müssen die Verknüpfungen erneuert werden, aber da beide Dateien immer im gleichen Verzeichnis liegen, lässt sich dies einfach realisieren.

Grundlagen der Verknüpfung

Die Daten einer Verknüpfung werden in der Systemtabelle MSysObjects gespeichert. Diese Tabelle ist standardmäßig nicht sichtbar. Um sie sichtbar zu machen, führen Sie in Abhängigkeit von der Access-Version Folgendes durch:

Access 2003 und älter: Klicken Sie auf den Menüeintrag Extras|Optionen. Dort finden Sie im Bereich Ansicht unter Anzeigen den Eintrag Systemobjekte. Aktivieren Sie diese Option und schließen Sie den Dialog wieder.

Access 2007 und jünger: Die richtige Option ist hier ein wenig schwieriger zu finden. Klicken Sie mit der rechten Maustaste auf die Titelleiste des Navigationsbereichs und wählen Sie dort den Eintrag Navigationsoptionen aus (siehe Bild 1). Im nun erscheinenden Dialog Navigationsoptionen finden Sie untern links den Eintrag Systemobjekte anzeigen, den Sie aktivieren (siehe Bild 2). Der Navigationsbereich beziehungsweise das Datenbankfenster zeigt nun einige Einträge in grauer Schrift an, darunter auch MSysObjects.

Aufrufen der Navigationsoptionen unter Access 2007 und jünger

Bild 1: Aufrufen der Navigationsoptionen unter Access 2007 und jünger

Aktivieren der Anzeige der Systemobjekte unter Access 2007 und jünger

Bild 2: Aktivieren der Anzeige der Systemobjekte unter Access 2007 und jünger

Wenn Sie diese Tabelle öffnen und die enthaltenen Spalten ein wenig umstellen, erhalten Sie eine Ansicht wie in Bild 3. Wichtig sind die Spalten Name, Type und Database. Name zeigt den Namen des jeweiligen Objekts an, Type den Typ (6 steht für verknüpfte Tabellen) und Database liefert den Pfad zu der Datenbank, welche die verknüpften Tabellen enthält.

Die Tabelle MSysObjects zeigt den Pfad der verknüpften Tabellen an.

Bild 3: Die Tabelle MSysObjects zeigt den Pfad der verknüpften Tabellen an.

Nun mögen Sie denken, dass Sie beim Verschieben der Backend-Datenbank einfach den Pfad in dieser Tabelle ändern können, damit die Datenbank wieder auf die verknüpften Tabellen zugreifen kann. Aber weit gefehlt: Es handelt sich um eine Systemtabelle, deren Daten nicht geändert werden können. Genau genommen lassen sich noch nicht einmal die Änderungen an der Reihenfolge der Spalten speichern.

Verknüpfung mit Backend im gleichen Verzeichnis

Befindet sich das Backend immer im gleichen Verzeichnis wie das Frontend, weil die Datenbank nur aus Gründen der besseren Wartbarkeit aufgeteilt wurde, können Sie dem Frontend eine kleine Prozedur hinzufügen, die bei jedem Start die Verknüpfung erneuert. Dies beugt dem Umbenennen der übergeordneten Verzeichnisse oder dem Verschieben von Frontend und Backend gemeinsam in ein anderes Verzeichnis vor. Die dazu verwendete Prozedur nutzt einige VBA-Befehle, die wir in Access [basics] noch nicht vorgestellt haben, aber im Rahmen dieser kleinen Lösung greifen wir einfach einmal den folgenden Ausgaben vor. Zum besseren Verständnis haben wir den grundsätzlichen Ablauf in Bild 4 skizziert. Die Prozedur legen Sie in einem Standardmodul an. Sie sieht so aus:

Ablauf beim Wiederverknüpfen von Tabellen eines Backends im gleichen Verzeichnis wie die Frontend-Datenbank

Bild 4: Ablauf beim Wiederverknüpfen von Tabellen eines Backends im gleichen Verzeichnis wie die Frontend-Datenbank

Public Sub VerknuepfungAktualisieren()

     Dim strDB As String

     Dim strPath As String

     Dim strConnect As String

     Dim db As DAO.Database

     Dim tdf As DAO.TableDef

     Set db = CurrentDb

     strPath = CurrentProject.Path

     For Each tdf In db.TableDefs

         strConnect = tdf.Connect

         If Len(strConnect) > 0 Then

             strDB = Mid(strConnect, InStrRev(strConnect, ""))

             tdf.Connect = ";database=" & strPath & strDB

             tdf.RefreshLink

         End If

     Next tdf

End Sub

Die Prozedur deklariert zunächst einige Variablen, deren Bedeutung wir im Folgenden erläutern. Als erstes wird die Objektvariable db über die Funktion CurrentDB mit einem Verweis auf die aktuelle Datenbank gefüllt. Das bezieht sich in diesem Fall auf die Frontend-Datenbank. Als zweites ermittelt die Path-Eigenschaft des CurrentProject-Objekts den Pfad zur aktuellen Datenbank, also das Verzeichnis, in dem sich nicht nur das Frontend, sondern auch das Backend befindet. Liegt die Datenbank in einem Verzeichnis wie c:BeispieleBeispieldatenbank.mdb, liefert diese Funktion c:Beispiele zurück.

Dann beginnt eine For Each-Schleife, die in der folgenden Ausgabe von Access [basics] erläutert wird, mit dem Durchlaufen der Objekte der Auflistung TableDefs des aktuellen Datenbank-Objekts. Die TableDefs-Auflistung enthält wiederum Objekte des Typs TableDef. Ein TableDef-Objekt liefert Informationen über die Definition einer Tabelle, also beispielsweise zu den enthaltenen Feldern und deren Datentypen.

Beim Durchlaufen der Auflistung TableDefs wird nun bei jedem Durchlauf ein einziges TableDef-Objekt mit der Objektvariablen tdf referenziert. Innerhalb der Schleife greift die Prozedur dann darauf zu, um den Wert der Eigenschaft Connect in die String-Variable strConnect zu schreiben. Diese Eigenschaft liefert für eine verknüpfte Access-Datenbank einen Ausdruck, der aus der Zeichenkette ;database= und dem Namen der Backend-Datenbank besteht, also beispielsweise

;database=c:BeispieleBeispieldatenbank.mdb

Danach folgen einige Zeichenketten-Funktionen. Die erste heißt Len und ermittelt die Länge des Inhalts der Variablen strConnect. Ist die Länge größer als 0, enthält die Connect-Eigenschaft einen Wert und es handelt sich beim aktuellen TableDef-Objekt um eine verknüpfte Datenbank. Diese Unterscheidung ist wichtig, weil die Datenbank ja auch lokale Tabellen enthält – zum Beispiel die Systemtabellen oder auch benutzerdefinierte Tabellen.

Nachdem der Status des TableDef-Objekts geklärt ist, kann sich die Prozedur an das Aktualisieren der Verknüpfung heranwagen Die erste der drei Zeilen innerhalb der If...Then-Bedingung ermittelt den reinen Dateinamen des Wertes der Connect-Eigenschaft, bei ;database=c:BeispieleBeispieldatenbank.mdb also beispielsweise Beispieldatenbank.mdb. Dabei ermittelt die Funktion InStrRev zunächst die Position des letzten Backslash-Zeichens der Zeichenkette (). Damit wird dann der zweite Parameter der Mid-Zeichenkette gefüttert, die alle Zeichen der im ersten Parameter angegebenen Zeichenkette ab der im zweiten Parameter angegebenen Position zurückliefert. Dabei wird das Backslash-Zeichen mit eingeschlossen.

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!