Tabellen verknüpfen per Assistent

Der in Access eingebaute Importassistent ist hilfreich, wenn man nur hin und wieder eine Tabelle verknüpfen oder importieren möchte. Wenn Sie diesen jedoch regelmäßig nutzen, werden Sie sich früher oder später ärgern, dass Sie jedes Mal erneut den Pfad der Quelldatenbank auswählen müssen. Dummerweise merkt sich Access noch nicht einmal den zuletzt verwendeten Pfad. Zeit, einen Ersatz für diesen Assistenten zu stricken – und zwar in Form eines kleinen Access-Add-Ins. Gleichzeitig erhalten Sie direkt noch einiges Know-how rund um das Verknüpfen und Importieren von Tabellen per VBA.

Funktionen des Add-Ins

Am Ende des Beitrag soll ein direkt einsetzbares Add-In herauskommen. Dieses sieht wie in Bild 1 aus und bietet eine Reihe interessanter Funktionen, die ein schnellstmögliches Verknüpfen mit den Tabellen anderer Datenbanken erlauben.

pic005.png

Bild 1: Das fertige Add-In zum schnellen Verknüpfen von Tabellen aus anderen Datenbanken

Wie schon in der Einführung erwähnt, ist vor allem das ständige Auswählen des Verzeichnisses der Quelldatenbank eine nervige Angelegenheit. Hier sollte auf jeden Fall der Hebel angesetzt werden. Deshalb soll das Formular gleich nach dem Öffnen die zuletzt zum Verknüpfen oder Importieren verwendeten Datenbankdateien anzeigen. Diese Liste könnte mit der Zeit etwas lang werden, deshalb haben wir neben der Schaltfläche zum Auswählen und Hinzufügen einer neuen Datenbank auch noch eine zum Löschen vorhandener Einträge eingebaut. Außerdem finden Sie ganz oben ein Textfeld, mit dem Sie die Datenbank- beziehungsweise Pfadnamen nach gewünschten Begriffen durchsuchen können. Nach Eingabe eines jeden Buchstabens wird der Inhalt des Listenfeldes mit den zuletzt verwendeten Datenbanken aktualisiert.

Fehlt noch eine Option im oberen Bereich des Formulars: Mit Nicht gefundene ausblenden stellen Sie ein, ob das obere Listenfeld solche Datenbankdateien, die aktuell nicht vorliegen, ausblenden soll.

Eigentlich könnte man diese auch gleich entfernen, aber es kann ja auch vorkommen, dass Datenbanken auf einem Netzlaufwerk liegen, das aktuell nicht verfügbar ist.

Ein Doppelklick auf einen der Listeneinträge des oberen Listenfeldes liest alle Tabellen der betroffenen Datenbank ein und zeigt diese in dem darunter befindlichen Listenfeld an.

Mit einem Klick auf das Kontrollkästchen Systemtabellen können Sie festlegen, ob die Liste nur benutzerdefinierte Tabellen anzeigen soll oder auch Systemtabellen. Rechts davon legen Sie fest, ob Tabellen importiert oder verknüpft werden sollen (eigentlich sollte das Add-In nur das Verknüpfen erlauben, aber das Importieren unterscheidet sich in einem einzigen Parameter – daher haben wir es auch noch hinzugefügt).

Im unteren Listenfeld markieren Sie schließlich die zu verknüpfenden oder zu importierenden Tabellen und führen die Verknüpfung oder den Import mit einem Klick auf die entsprechende Schaltfläche durch.

Tabellen der Lösung

Das Add-In verwendet zwei Tabellen, um die bereits verwendeten Datenbanken und die Tabellen der aktuellen Quelldatenbank zu speichern.

Die erste Tabelle heißt tblDatenbanken und sieht im Entwurf wie in Bild 2 aus. Das Feld Datenbank speichert den Datenbanknamen inklusive Pfad, das Feld Vorhanden wird erst beim Öffnen des Formulars gefüllt. Dabei erhält es den Wert True, wenn eine Datenbank der Tabelle nicht am entsprechenden Ort gefunden werden konnte. Das Feld Datenbank ist mit einem eindeutigen Index versehen, damit jede Datenbank nur einfach aufgenommen werden kann.

pic008.png

Bild 2: Tabelle zum Speichern der bereits verwendeten Datenbanken

Die Tabelle tblTabellen speichert nach der Auswahl der Datenbank, deren Tabellen verknüpft oder importiert werden sollen, die darin enthaltenen Tabellen.

Sie sieht im Entwurf wie in Bild 3 aus und enthält neben dem Feld Tabelle zum Speichern des Tabellennamens noch das Feld Flags, um den Wert des gleichnamigen Feldes der Tabelle MSysObjects aufzunehmen.

pic009.png

Bild 3: Tabellen zum Speichern der Tabellen der aktuell als Quelle für die Verknüpfung oder den Import dienenden Datenbank

Hauptformular erstellen

Das Hauptformular der Anwendung heißt frmLinkAndImportAdmin und sieht im Entwurf wie in Bild 5 aus und speichert aktuell drei Optionen:

pic006.png

Bild 4: Hauptformular des Add-Ins in der Entwurfsansicht

pic007.png

Bild 5: Tabellen zum Speichern der Add-In-Optionen

  • Systemtabellen: Gibt an, ob Systemtabellen angezeigt werden sollen oder nicht. Wird mit dem Kontrollkästchen chkSystemtabellen eingestellt, das auch an dieses Feld der Tabelle tblOptionen gebunden ist.
  • NichtGefundeneAusblenden: Legt fest, ob aktuell nicht auffindbare Datenbanken ausgeblendet werden sollen. Wird mit dem Kontrollkästchen chkNichtGefundeneAusblenden eingestellt.
  • VerknuepfenOderImportieren: Speichert die letzte Einstellung der Optionsgruppe ogrVerknuepfenOderImportieren.

Durch die Verwendung dieser Tabelle und der an die enthaltenen Felder gebundenen Steuerelemente werden die zuletzt verwendeten Einstellungen beim nächsten Start des Add-Ins wiederhergestellt.

Öffnen des Formulars

Das Öffnen des Formulars löst das Ereignis Beim Laden aus, was wiederum die Ereignisprozedur Form_Load aus Listing 1 auf den Plan ruft. Diese Prozedur ruft zunächst eine weitere Prozedur namens DatenbankenPruefen auf. Diese prüft, ob alle bisher verwendeten Datenbanken noch an Ort und Stelle sind. Ist dies nicht der Fall und ist die Option NichtGefundeneAusblenden aktiv, werden die entsprechenden Einträge des Listenfeldes lstDatenbanken ausgeblendet.

Listing 1: Laden des Formulars

Private Sub Form_Load()
    Dim db As DAO.Database
    Set db = CodeDb
    DatenbankenPruefen
    db.Execute "DELETE FROM tblTabellen", dbFailOnError
    Me!lstTabellen.Requery
    Me!lstDatenbanken.ColumnWidths = "0;" & Me!lstDatenbanken.Width & ";0"
    DatenbankenAktualisieren
    Set db = Nothing
End Sub

Schauen wir uns zunächst dieses Listenfeld an: Es verwendet die Abfrage qryDatenbanken als Datenherkunft. Diese sieht wie in Bild 7 aus – bei zu langen Dateinamen werden Teile durch Platzhalter ersetzt ().

pic010.png

Bild 6: Diese Abfrage fügt die gekürzte Fassung des Datenbanknamens zum Ergebnis hinzu.

pic011.png

Bild 7: Datenherkunft für das obere Listenfeld zur Anzeige der Datenbanken

Prüfen, ob alle Datenbanken an Ort und Stelle sind

Die Prozedur DatenbankenPruefen durchläuft alle Datensätze der Tabelle tblDatenbanken. Dabei versetzt sie den jeweils aktuellen Datensatz in den Bearbeitungsmodus und prüft dann mit der Dir-Funktion, ob die im Feld Datenbank angegebene Datei vorhanden ist.

Dies ist der Fall, wenn die Dir-Funktion eine Zeichenkette liefert, deren Länge größer als 0 ist. In diesem Fall stellt die Prozedur den Wert des Feldes Vorhanden auf den Wert True ein, sonst auf False. Schließlich speichert die Prozedur die änderung mit der Update-Methode und prüft dann den nächsten Datensatz:

Private Sub DatenbankenPruefen()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Set db = CodeDb
    Set rst = db.OpenRecordset("SELECT * FROM tblDatenbanken", dbOpenDynaset)
    Do While Not rst.EOF
        rst.Edit
        If Len(Dir(rst!Datenbank)) > 0 Then
            rst!Vorhanden = True
        Else
            rst!Vorhanden = False
        End If
        rst.Update
        rst.MoveNext
    Loop
    Set db = Nothing
End Sub

Der Rest der Prozedur Form_Load ist schnell erklärt: Diese leert die Tabelle tblTabellen, da beim Öffnen des Formulars keiner der Listeneinträge markiert ist und somit auch keine Tabellen angezeigt werden sollen.

Das Listenfeld lstTabellen wird aktualisiert, danach stellt die Prozedur die Breite der angezeigten Spalte des Listenfeldes lstDatenbanken auf die Breite des gesamten Listenfeldes ein. Schließlich ruft die Prozedur eine weitere Routine namens DatenbankenAktualisieren auf (siehe Listing 2).

Listing 2: Aktualisieren der Datenbanken

Private Sub DatenbankenAktualisieren()
    If Me!chkNichtGefundeneAusblenden Then
        Me!lstDatenbanken.RowSource = "SELECT * FROM qryDatenbanken WHERE Vorhanden = True"
    Else
        Me!lstDatenbanken.RowSource = "SELECT * FROM qryDatenbanken"
    End If
End Sub

Diese stellt einfach nur sicher, dass das Listenfeld lstDatenbanken nur diejenigen Datenbanken anzeigt, die der Benutzer sehen will. Dies hängt wieder von der Einstellung der Option NichtGefundeneAusblenden ab. Hat diese den Wert True, erhält das Listenfeld lstDatenbanken eine Abfrage basierend auf der Abfrage qryDatenbanken als Datensatzherkunft, die lediglich die vorhandenen Datenbanken anzeigt. Anderenfalls zeigt das Listenfeld alle Einträge an.

Die gleiche Routine wird noch zu einer anderen Gelegenheit aufgerufen – nämlich dann, wenn der Benutzer den Wert des Kontrollkästchens chkNichtGefundeneAusblenden ändert:

Private Sub chkNichtGefundeneAusblenden_AfterUpdate()
    DatenbankenAktualisieren
    End Sub

Dies aktualisiert schlicht die aktuell im Listenfeld lstDatenbanken angezeigten Einträge.

Datenbank hinzufügen

Schauen wir uns nun an, was bei einem Mausklick auf die Schaltfläche Datenbank hinzufügen geschieht. Dies löst die Prozedur aus Listing 3 aus.

Listing 3: Hinzufügen einer neuen Datenbank

Private Sub cmdDatenbankHinzufuegen_Click()
    Dim db As DAO.Database
    Dim strPfad As String
    Dim strDatenbank As String
    Dim lngNeueDatenbankID As Long
    Set db = CodeDb
    If Not Nz(Me!lstDatenbanken, 0) = 0 Then
        strPfad = db.OpenRecordset("SELECT Datenbank FROM tblDatenbanken WHERE DatenbankID = " _
            & Me!lstDatenbanken, dbOpenSnapshot).Fields(0)
        strPfad = Mid(strPfad, 1, InStrRev(strPfad, "\"))
    Else
        strPfad = CurrentProject.Path
    End If
    strDatenbank = OpenFileName(strPfad, "Datenbank auswählen", _
        "Access-Dateien (*.mdb,*.accdb)|Alle Dateien (*.*)")
    If Len(strDatenbank) > 0 Then
        On Error Resume Next
        db.Execute "INSERT INTO tblDatenbanken(Datenbank, Vorhanden) VALUES(''" & strDatenbank _
            & "'', -1)", dbFailOnError
        If Err.Number = 3022 Then
            db.Execute "UPDATE tblDatenbanken SET Vorhanden = -1", dbFailOnError
            lngNeueDatenbankID = db.OpenRecordset("SELECT DatenbankID FROM tblDatenbanken " _
                & "WHERE Datenbank = ''" & strDatenbank & "''", dbOpenSnapshot).Fields(0)
        Else
            lngNeueDatenbankID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
        End If
        Me!lstDatenbanken.Requery
        Me!lstDatenbanken = lngNeueDatenbankID
        TabellenEinlesen
        TabellenAktualisieren
    End If
    Set db = Nothing
End Sub

Diese besitzt eine kleine Funktion, die dafür sorgt, dass im nun erscheinenden Datei öffnen-Dialog gleich das Verzeichnis der aktuell im Listenfeld lstDatenbanken markierten Datenbank erscheint. Dazu prüft die Prozedur zunächst, ob überhaupt ein Eintrag des Listenfeldes lstDatenbanken markiert ist. Falls nicht, verwendet sie einfach den Pfad der aktuellen Datenbank als Startverzeichnis. Anderenfalls liest sie den Pfad für den aktuellen Datensatz im Listenfeld aus der Tabelle tblDatenbanken ein und schneidet den Teil hinter dem letzten Backslash-Zeichen ab.

Damit ausgestattet, ruft die Prozedur die Funktion OpenFileName auf. Diese befindet sich im Modul mdlTools der Datenbank und zeigt, basierend auf der Wizhook-Klasse, den Datei öffnen-Dialog an. Das Ergebnis dieser Funktion landet in der Variablen strDatenbank.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar