|
|
|
|
DatenbankenMS AccessAutomatische Tabellenverknüpfung
|
In einer Mehrbenutzerumgebung ist es oft sinnvoll, Accessdatenbanken in eine Datenbank mit reiner Bedienoberfläche (Front-End) und eine, die nur die Daten enthält (Back-End), aufzuteilen. Diese Vorgehensweise hat unter anderem folgende Vorteile:
| |
- Unterschiedliche Benutzeroberflächen können gleiche Datenbestände verwenden.
- Die Leistung der Datenbank verbessert sich rapide, wenn die Front-End-Datenbank sich auf dem lokalen Computer befindet, da nur Daten über das Netzwerk übertragen werden, nicht jedoch Formulare, Berichte und andere Objekte.
- Die gemeinsame Nutzung der Datenbank im Internet ist möglich.
Den Bezug von der Front-End-Datenbank zur Back-End-Datenbank stellt man durch Tabellenverknüpfung her. Access bietet für diesen Zweck den Datenbankaufteilungs-Assistenten an, der in der Front-End-Datenbank Objekte mit Verweisen auf die Tabellen der Back-End-Datenbank generiert. Indem man auf diese Objekte zugreift, greift man indirekt auf die entsprechende Tabelle in der externen (Back-End) Datenbank zu.
| Vorteile | |
Nun haben Tabellenverknüpfungsobjekte allerdings den Nachteil, dass sie den Pfad zu der externen Datenbank fest gespeichert haben. Wird die externe Datenbank in ein anderes Verzeichnis oder auf einen anderen Server verschoben, scheitert der Zugriff auf die Tabellen. In diesem Fall müssen die Tabellen auf der Front-End-Datenbank mittels des Tabellenverknüpfungs-Assistenten neu verknüpft werden.
Dem reinen Anwender stehen meist die Assistenten nicht zur Verfügung und es obliegt dem Datenbankadministrator die Neuverknüpfung an einer Front-End-Datenbank vorzunehmen und anschließend auf die lokalen Rechner zu verteilen. Dies kann aber zu Problemen führen, wenn die Front-End-Datenbanken interne Tabellen für individuelle Einstellungen enthalten, die dann verloren gingen.
Datenbankentwickler, die Änderungen an Front-End-Datenbanken vornehmen, stehen oft vor dem Problem, dass der Pfad zu seiner Back-End-Datenbank von dem des Auftraggebers unterscheidet. Nach Auslieferung der geänderten Version muss er entweder die Anpassungen vor Ort vornehmen oder dies dem Datenbankadministrator des Auftraggebers überlassen.
Die geschilderten Mängel lassen sich jedoch mit ein paar Zeilen Code aus der Welt schaffen, indem sich die Tabellen beim Öffnen der Front-End-Datenbank auch automatisch verknüpfen. Dazu wird nachfolgend eine Lösung dargestellt.
| Praxisproblem | |
Rufen Sie aus Ihrem AutoExec-Macro oder aus Ihrem Startformular die Funktion CheckLink auf und übergeben Sie als Argument den Namen einer bereits verknüpften Tabelle an. Da meist mehrere verknüpfte Tabellen existieren, wählen Sie eine, die für die Anwendung wesentlich ist; denn manche unwesentlichen Tabellen könnten irgendwann gelöscht sein.
| AutoExec-Makro | |
Angenommen, die wichtigste Tabelle heißt "Kunden", so lautet der Aufruf wahlweise:
CheckLink "Kunden"
oder
Call CheckLink("Kunden")
Der Rückgabewert der Funktion interessiert hier nicht weiter, da bei Fehler die Anwendung ohnehin beendet wird.
Die Prozedur CheckLink versucht die Anzahl der Datensätze in der Tabelle sTable (hier "Kunden") zu bestimmen und testet damit, ob die verknüpften Tabellen vorhanden sind:
Public Function CheckLink(sTable As String)
On Error GoTo ErrH
'Vorhandensein der verknüpften Tabelle testen
DCount "*", sTable 'Bei Fehler erfolgt ein Sprung zu ErrH
CheckLink = True
Exit Function
ErrH:
'Fehlercodes 2471, 3024 oder 3044 vor Access 97
'Fehlercodes 63725, 64231 oder 64513 ab Access 97
If Err = 2471 Or Err = 3024 Or Err = 3044 Or Err = 3043 _
Or Err = 63725 Or Err = 64479 Or Err = 64231 Or Err = 64513 Then
' Verknüpfte Datenbank oder Pfad nicht gefunden
If Relink() = True Then Resume Next
End If
AppQuit:
MsgBox Err.Description & vbCrLf & vbCrLf _
& "Programm wird beendet.", vbCritical
Application.Quit acExit 'Anwendung beenden
End Function
Ist die Verknüpfung fehlerhaft, tritt ein Fehler auf und es erfolgt ein Sprung zur Marke ErrH, wo die Fehlernummer abgeprüft wird. Trifft einer der angegebenen Fehlercodes zu, wird in der Funktion Relink versucht, die Tabellen neu zu verknüpfen. Dazu erfolgt zunächst eine Abfrage bei der ein Anwender den den neuen Pfad auf die Tabellen eingeben kann.
Der Einfachheithalber verwenden wir in dieser Routine eine simple InputBox, wo der Anwender zur Eingabe des Pfades der Back-End-Datenbank aufgefordert wird. Wird die Schaltfläche Abbruch betätigt, liefert InputBox "", und die Anwendung wird beendet.
| Aufruf | |
| Funktion Relink
|
Private Function Relink() As Boolean
Dim sPath As String
Relink = False
Again:
sPath = InputBox("Bitte geben Sie den vollen Pfad zu der verknüpften Datenbank ein.")
If sPath = "" Then GoTo NoPath
If Dir(sPath, vbNormal) = "" Then
Beep
MsgBox "Datei " & sPath & " nicht gefunden.", vbInformation
GoTo Again
End If
|
Erfolgt eine Eingabe, wird die Existenz der Datei geprüft, und im positiven Fall die Funktion RefreshLinks aufgerufen.
If RefreshLinks(sPath) = False Then Exit Function
Relink = True
Exit Function
NoPath:
Beep
MsgBox "Die Angabe des Pfades zur verknüpften Datenbank fehlt." _
& vbCrLf & "Programm kann nicht fortgesetzt werden.", vbCritical
Application.Quit acExit 'Anwendung beenden
End Function
RefreshLinks aktualisiert die Verknüpfungen mit der vorliegenden Datenbank und gibt bei erfolgreichem Abschluss TRUE zurück. Der Parameter sPath übergibt dazu der Funktion den Pfad der Datenbank.
RefreshLinks ermittelt zunächst die aktuelle Datenbank und durchläuft dann alle Tabellen der Datenbank in einer Schleife.
Private Function RefreshLinks(sPath As String) As Boolean
Dim dbs As Database
Dim tdf As TableDef
Set dbs = CurrentDb()
For Each tdf In dbs.TableDefs
Hat die jeweilige Tabelle eine Verknüpfungszeichenfolge, handelt es sich um eine verknüpfte Tabelle.
If Len(tdf.Connect) > 0 Then
If InStr(UCase(tdf.Connect), "ODBC") = 0 Then
'ODBC-Verknüpfung übergehen
tdf.Connect = ";DATABASE=" & sPath
Err = 0
On Error Resume Next
tdf.RefreshLink ' Verknüpft die Tabelle erneut
If Err <> 0 Then
GoTo DoExit
Exit Function
End If
End If
End If
Next
RefreshLinks = True 'Verknüpfung abgeschlossen
DoExit:
dbs.Close
End Function
In der Funktion RefreshLinks wird ein TableDef-Objekt generiert und es werden alle Tabellen durchlaufen. Ist die Connect-Eigenschaft einer Tabelle nicht "", wird diesem der neue Pfad zugewiesen. Der Einfachheithalber gehen wir davon aus, dass die Verknüpfungen sich nicht auf ODBC-Objekte beziehen; denn diese bedürfen einer Sonderbehandlung.
| | |
Statt die Funktion InputBox für die Eingabe des Pfades zu verwenden, könnte das Programm diese Information auch aus einer INI-Datei auslesen. Diese Datei würde erstmalig auf allen lokalen Rechnern abgelegt und bräuchte meist nicht mehr geändert zu werden.
| Tipp
|
|
|