Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 2/2013.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Lernen Sie ein Add-In kennen, mit dem Sie die Verknüpfungen zu Tabellen aus anderen Datenbanken ganz einfach aktualisieren können.

Techniken

Verknüpfungen, Listenfelder, VBA

Voraussetzungen

Access 2000 und höher

Beispieldateien

BackendAdmin.mda

Shortlink

www.access-im-unternehmen.de/880

Verschiedene Backends pflegen

André Minhorst, Duisburg

Es gibt ja die ausgefallensten Konstellationen von Access-Anwendungen. Manche Benutzer verwenden beispielsweise ein Access-Frontend, um die Daten aus verschiedenen Backend-Datenbanken zusammenzuführen und Auswertungen über die enthaltenen Daten durchzuführen. Interessant wird dies, wenn diese Backends sich an häufig wechselnden Orten befinden. Nehmen wir an, drei Tabellen kommen aus Datenbank X, fünf aus Datenbank Y und sieben aus Datenbank Z und so weiter - und manche Datenbanken befinden sich im gleichen Verzeichnis. Da gerät die Aktualisierung der Verknüpfungen schnell zum Tagesprojekt. Damit dies schneller geht, bauen wir uns ein kleines Formular zum schnellen Umschalten der Datenbanken.

Wenn Sie in einer Datenbankanwendung Verknüpfungen zu den Tabellen anderer Datenbanken verwenden, können Sie diese mit dem Tabellenverknüpfungsmanager aktualisieren. Dieser ist jedoch nicht besonders komfortabel: Erstens können Sie das Fenster nicht vergrößern, um beispielsweise die kompletten Pfade der verknüpften Tabellen anzuzeigen (s. Abb. 1).

pic002.png

Abb. 1: Der Tabellenverknüpfungs-Manager von Access

Sollten Sie eine Access-Datenbank zum Zusammenführen von Tabellenverknüpfungen aus mehreren anderen Datenbanken einsetzen, können Sie auch nicht auf die Schnelle alle Tabellen einer bestimmten Tabelle markieren, um diese en bloc zu aktualisieren. Sie müssen die Tabellen einer Datenbank mühsam zusammensuchen.

Noch interessanter wird es, wenn sich eine Anzahl von Datenbanken mit verknüpften Tabellen auf einem Netzlaufwerk befindet und sich etwa durch die Änderung des Laufwerksbuchstabens die Pfade für alle verknüpften Tabellen ändern. In diesem Fall müssen Sie die Änderungen für alle Tabellen manuell über den Tabellenverknüpfungs-Manager durchführen.

Glücklicherweise ist das Verknüpfen einer Tabelle kein Hexenwerk, und auch das Aktualisieren einer solchen gelingt per VBA recht einfach. Grund genug, die Funktionalität des Tabellenverknüpfungs-Managers nachzubilden und zu erweitern.

Was ist zu tun?

Schauen wir uns an, welche Situationen auftreten können:

  • Ein Benutzer verwendet eine einzige Frontend-Datenbank, die ihre Daten aus einer oder mehreren Backend-Datenbanken bezieht.
  • Aus jeder Backend-Datenbank können eine oder mehrere Tabellen eingebunden sein.
  • Eine oder mehrere Backend-Datenbanken können das Verzeichnis wechseln. Gegebenenfalls ändern sich dabei Teile des Verzeichnisses für alle betroffenen Datenbanken.

Was benötigen wir, um diese Änderungen möglichst komfortabel abbilden zu können? Das Formular aus Abb. 2 und den darin enthaltenen VBA-Code. Das Add-In ist als Menü-Add-In konzipiert und kann somit von jeder Datenbank aus etwa über den Ribbon-Eintrag Datenbanktools|Add-Ins|Add-Ins|BackendAdmin gestartet werden. Es liest beim Öffnen alle Tabellen ein, die aus anderen Access-Datenbanken stammen und zeigt diese in einem Listenfeld an. Was können Sie nun mit diesem Add-In erledigen?

pic001.png

Abb. 2: Access-Add-In zum Aktualisieren der Verknüpfungen von Tabellen aus externen Datenbanken

Datenbanken nach dem Namen filtern

Ganz oben finden Sie ein Kombinationsfeld, in das Sie Text zum Filtern der Einträge des Listenfeldes mit den verknüpften Tabellen eingeben können. Nach der Eingabe eines jeden Buchstabens filtert das Listenfeld seinen Inhalt und markiert gleichzeitig alle aktuell sichtbaren Einträge.

Dies hat den Vorteil, dass Sie damit gleich die darunter befindlichen Schaltflächen nutzen können:

  • Markierte auswählen: Fügt alle aktuell markierten Elemente zu der Auswahl hinzu, die beim Klick auf Verknüpfungen aktualisieren aktualisiert wird. Nicht markierte Einträge werden aus der Auswahl entfernt.
  • Markierte hinzufügen: Fügt alle aktuell markierten Elemente zur Auswahl hinzu. Unterschied zur vorherigen Variante: Die bereits ausgewählten Einträge bleiben ausgewählt.
  • Markierte entfernen: Entfernt alle markierten Einträge aus der Auswahl der Tabellen für die Aktualisierung der Verknüpfung.

Zum Verständnis: Markierung und Auswahl

Damit Sie die Arbeitsweise des Add-Ins verstehen können, müssen wir kurz ein paar Begriffe klären.

Mit Markiert meint das Add-In solche Einträge der Tabellenliste, die aktuell mit schwarzem Hintergrund markiert sind.

Mit Ausgewählt sind solche Einträge gemeint, die in der ersten Spalte des Listenfeldes ein x aufweisen und die beim Klick auf Verknüpfungen aktualisieren berücksichtigt werden (s. Abb. 3). Mit einer Ausnahme, die später erläutert wird.

pic003.png

Abb. 3: Verschiedene Markierungen beim BackendAdmin

Es gibt noch zwei Stellen, an denen Einträge mit dem Buchstaben x markiert werden können: Wenn eine Tabelle nicht in der angegebenen Datenbank gefunden werden konnte, stellt das Listenfeld dem jeweiligen Tabellennamen ein x voran. Und wenn die komplette Datenbank nicht unter dem angegebenen Dateinamen zu finden ist, wird diese mit einem x markiert.

Verknüpfungen aktualisieren

Davon ausgehend, dass Sie eine oder mehrere verknüpfte Tabellen zum Aktualisieren ausgewählt haben, müssen Sie noch angeben, welche Teile des Dateinamens angepasst werden sollen. Wenn beispielsweise der Laufwerksbuchstabe von e:\ auf x:\ geändert werden soll, tragen Sie im Kombinationsfeld Zu ersetzen: den Ausdruck e:\ und im Kombinationsfeld Ersetzen mit: den Ausdruck x:\ ein.

Sie werden feststellen, dass bei der Eingabe der Zeichenfolge im Kombinationsfeld Zu ersetzen: wiederum Einträge im Listenfeld markiert werden. In Abb. 4 sehen Sie beispielsweise drei markierte Einträge, die eigentlich aktualisiert werden sollen. Davon enthalten aber nur zwei Einträge den im Kombinationsfeld Zu ersetzen: enthaltenen Ausdruck und dementsprechend werden auch nur diese aktualisiert.

pic004.png

Abb. 4: Es werden nur die Einträge aktualisiert, die dem Ausdruck im Feld Zu ersetzen: entsprechen.

Ein Klick auf die Schaltfläche Verknüpfungen aktualisieren erledigt nun den Rest und stellt eine neue Verknüpfung zu der angegebenen Tabelle in der Datenbank mit den neu ermittelten Dateinamen her.

Dabei können zwei Probleme auftauchen:

  • Die per Suchen/Ersetzen ermittelte Datenbank kann im Dateisystem nicht gefunden werden. In diesem Fall erscheint eine Meldung wie die aus Abb. 5.
  • Oder die Datenbank wird gefunden, die zu verknüpfende Tabelle ist jedoch nicht in dieser Datenbank enthalten. Dies zieht die Meldung aus Abb. 6 mit der Angabe aller betroffenen Tabellen nach sich.
pic005.png

Abb. 5: Die neue Quelldatenbank kann nicht gefunden werden ...

pic006.png

Abb. 6: ... oder die zu verknüpfende Tabelle ist nicht in der angegebenen Datenbank enthalten.

Auch wenn mit dem Suchen/Ersetzen-Ausdruck nicht alle zum Neuverknüpfen ausgewählten Datenbanken erfasst werden können, erscheint ein entsprechender Hinweis. Für alle Tabellen, deren neue Quelldatenbank gefunden werden konnte und die dann auch noch eine Tabelle mit dem gesuchten Namen enthalten, aktualisiert das Add-In die Verknüpfung.

Programmierung der Anwendung

Das Formular frmBackendAdmin ist die Schaltzentrale der Anwendung und enthält auch jegliche Funktionalität. Gleich beim Laden wird das Ereignis Beim Laden ausgelöst, was die Ausführung der folgenden Ereignisprozedur nach sich zieht:

Private Sub Form_Load()

    VerknuepfungenEinlesen

End Sub

Die Prozedur VerknuepfungenEinlesen (s. Listing 1) verwendet zwei Variablen des Typs Database - eine für die Datenbank, von der aus das Add-In gestartet wird (mit CurrentDb referenziert) und eine für das Add-In selbst (CodeDb). Die Prozedur führt gleich zu Beginn zwei SQL-Aktionsabfragen aus. Die erste löscht alle in der Tabelle tblTabellenUndDatenbanken enthaltenen Datensätze, die zweite fügt für jede in der Zieldatenbank enthaltene Verknüpfung einen Datensatz zu dieser Tabelle hinzu. Dabei verwendet sie die Tabelle MSysObjects als Datenherkunft und bezieht sich dabei auf alle Einträge, deren Feld Type den Wert 6 enthält - dies steht für per ODBC verknüpfte Tabellen. Es landen übrigens die Werte der Felder Name, Database und ForeignName in den Zielfeldern Tabelle, DatenbankAlt und TabelleOriginal. Tabelle entspricht dem Namen der Verknüpfung, so wie er im Datenbankfenster beziehungsweise Navigationsbereich der Datenbank angezeigt wird, TabelleOriginal ist der Name der Tabelle in der Quelldatenbank.

Listing 1: Einlesen der aktuellen Verknüpfungen der Datenbank

Private Sub VerknuepfungenEinlesen()

    Dim dbAddIn As DAO.Database

    Dim dbHost As DAO.Database

    Dim rst As DAO.Recordset

    Dim rstTest As DAO.Recordset

    Set dbAddIn = CodeDb

    Set dbHost = CurrentDb

    dbAddIn.Execute "DELETE FROM tblTabellenUndDatenbanken", dbFailOnError

    dbAddIn.Execute "INSERT INTO tblTabellenUndDatenbanken(Tabelle, DatenbankAlt, " _

        & "TabelleOriginal) SELECT Name, Database, ForeignName From MSysObjects IN '" _

        & CurrentDb.Name & "' WHERE Type=6", dbFailOnError

    Set rst = dbAddIn.OpenRecordset("SELECT * FROM tblTabellenUndDatenbanken " _

        & "ORDER BY DatenbankAlt, Tabelle", dbOpenDynaset)

    Do While Not rst.EOF

        rst.Edit

        If Len(Dir(rst!DatenbankAlt)) = 0 Then

            rst!DatenbankNichtVorhanden = True

        Else

            Set rstTest = dbAddIn.OpenRecordset("SELECT Name FROM MSysObjects IN '" _

                & rst!DatenbankAlt & "' WHERE Name = '" & rst!TabelleOriginal & "'")

            If rstTest.EOF Then

                rst!TabelleNichtVorhanden = True

            End If

        End If

        rst.Update

        rst.MoveNext

    Loop

    Me!lstVerknuepfteTabellen.Requery

End Sub

Die Tabelle tblTabellenUndDatenbanken sieht im Entwurf übrigens wie in Abb. 7 aus. Die Felder Tabelle und TabelleOriginal speichern den Namen der Verknüpfung sowie den der Originaltabelle, DatenbankAlt und DatenbankNeu den bisherigen und den zukünftigen Dateipfad der Quelldatei. DatenbankNichtVorhanden und TabelleNichtVorhanden nehmen die Werte für die x-Markierungen in den Spalten für die Tabelle und die Datenbank im Listenfeld auf und Markiert verweist mit dem Wert True auf Tabellen mit zu ändernden Verknüpfungen.

pic007.png

Abb. 7: Tabelle zum Speichern der verknüpften Dateien und ihrer Informationen

Danach durchläuft die Prozedur alle Datensätze der Tabelle tblTabellenUndDatenbanken in einer Do While-Schleife.

Dabei versetzt die Prozedur den aktuellen Datensatz zunächst mit der Edit-Methode in den Bearbeitungsmodus. In einer ersten Prüfung ermittelt sie, ob die angegebene Quelldatenbank dieser Verknüpfung im Dateisystem zu finden ist. Dazu verwendet sie die Dir-Funktion mit dem Dateipfad als Parameter.

Liefert diese eine Zeichenkette mit einer Länge größer als 0 zurück, ist die Datenbank vorhanden. Anderenfalls stellt die Prozedur den Wert des Feldes DatenbankNichtVorhanden auf True ein. Ist die Datenbank vorhanden, testet die Prozedur noch, ob diese die angegebene Tabelle enthält.

Dazu erstellt sie ein Recordset auf der Tabelle MSysObjects aus der Datenbank, welche die Verknüpfung enthält - dies wird mit dem IN-Schlüsselwort und dem nachfolgend angegebenen Namen der Quelldatenbank erreicht. Wenn dieses Recordset auf Basis der Tabelle MSysObjects einen Datensatz enthält, dessen Name mit dem Namen aus rst!TabelleOriginal übereinstimmt, ist auch die Tabelle vorhanden.

Anderenfalls stellt die Prozedur den Wert des Feldes TabelleNichtVorhanden der Tabelle tblTabellenUndDatenbanken auf den Wert True ein. Schließlich speichert die Prozedur die Änderungen mit der Update-Methode und springt mit MoveNext zum nächsten Datensatz des Recordsets. Anschließend aktualisiert die Prozedur noch den Inhalt des Listenfeldes lstVerknuepfteTabellen mit der Requery-Methode.

Listenfeld füllen

Damit kommen wir zum Inhalt des Listenfeldes lstVerknuepfteTabellen. Dieses verwendet die Abfrage qryTabellenListe als Datensatzherkunft (s. Abb. 8). Die Abfrage enthält einige berechnete Felder, deren Formeln aus Platzgründen nicht im Screenshot abgebildet werden konnten.

pic008.png

Abb. 8: Diese Abfrage dient als Datenherkunft des Listenfeldes lstVerknuepfteTabellen.

Das Feld MarkiertesFeld verwendet die folgende Formel, die den Wert x ausgibt, wenn das Feld Markiert den Wert Wahr enthält:

MarkiertesFeld: Wenn([Markiert]=Wahr;"x";"")

Das Feld Tabellenname soll nicht nur den Tabellennamen ausgeben, sondern auch noch ein x voranstellen, wenn das Feld TabelleNichtVorhanden den Wert True enthält. Außerdem soll neben dem Namen der Verknüpfung in der aktuellen Tabelle auch der Name der Originaltabelle ausgegeben werden:

Tabellenname: Wenn([TabelleNichtVorhanden];

"x ";"") & [Tabelle] & "/" & [TabelleOriginal]

Gleiches gilt für das Feld Datenbank. Dieses prüft jedoch den Inhalt des Feldes DatenbankNichtVorhanden und fügt den Wert x voran, wenn dieses den Wert True aufweist:

Datenbank: Wenn([DatenbankNichtVorhanden];

"x ";"") & [DatenbankAlt]

Damit das Listenfeld die Daten wie gewünscht anzeigt, stellen Sie die Eigenschaft Spaltenanzahl auf 4 und die Eigenschaft Spaltenbreiten auf 0cm;0,501cm;6cm ein (s. Abb. 9). Auf diese Weise wird die erste Zeile mit dem Primärschlüsselwert als gebundene Spalte ausgeblendet beziehungsweise mit der Breite 0cm angezeigt. Die zweite Zeile zeigt mit einer Breite von 0,5cm das x an, das einen Eintrag als für eine Verknüpfungsänderung ausgewählt kennzeichnet.

pic009.png

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.