Datenbanken

MS Access

Automatische 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





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 01:13:24 von textarchiv.alojado.de