Tabellen und Beziehungen kopieren

Während Sie eine Datenbank programmieren, fällt unter Umständen eine ganze Menge Datenmüll an – Datensätze, die beim Test eingegeben werden und die Sie nicht mehr benötigen. Dafür wäre ein Satz realistischer Daten nicht schlecht. Dieser Beitrag zeigt, wie Sie das komplette Datenmodell einer Datenbank in einer zweiten Datenbank vorhalten und diese per Mausklick über die Tabellen der aktuell bearbeiteten Datenbank schreiben – und zwar inklusive Beziehungen.

Wenn Sie Anwendungen programmieren und dabei zu Testzwecken immer wieder neue Beispieldaten in die Formulare eingeben oder auch Daten aus anderen Quellen wie XML-Dokumenten, Excel-Tabellen oder auch aus anderen Datenbanken in die Tabellen spülen, möchten Sie sicher gelegentlich den Urzustand wiederherstellen. Kein Problem: Sie müssen den Urzustand nur zum gewünschten Zeitpunkt in eine externe Tabelle schreiben und diesen bei Bedarf wieder herstellen. Natürlich sollten dabei keine zwischenzeitlichen änderungen am Datenmodell übersehen werden.

Dieser Beitrag beschreibt eine Lösung, mit der Sie festgelegte Tabellen einer Datenbank und deren Beziehungen in eine externe Datenbank kopieren und wiederherstellen können. Die Benutzeroberfläche dieser Lösung besteht aus dem Formular frmTabellenImportExport (s. Abb. 1). Dieses Formular zeigt beim Öffnen alle Tabellen der aktuellen Datenbank an. Sie können nun durch Markieren der gewünschten Tabellen festlegen, welche Einträge in der Sicherungsdatenbank landen sollen.

pic001.png

Abb. 1: Das Formular zum Festlegen der zu importierenden oder zu exportierenden Tabellen

Mit einem Klick auf die Schaltfläche Sichern öffnen Sie einen Datei öffnen-Dialog zum Auswählen der Zieldatei. Wenn Sie eine neue Sicherungsdatei erstellen möchten, markieren Sie zuvor die Option Neue Datenbank. In diesem Fall wählen Sie im Datei speichern-Dialog Pfad und Name der zu erstellenden Datenbankdatei aus. Wenn Sie die Daten einmal gesichert haben, können Sie diese über die Schaltfläche Wiederherstellen wieder in die aktuell geöffnete Datenbank importieren.

Beachten Sie bitte, dass beim Exportieren wie auch beim Importieren alle Tabellen der Zieldatenbank und deren Beziehungen gelöscht werden.

Funktion der Lösung

Das Formular frmTabellenImportExport zeigt im Listenfeld lstTabellen alle Tabellen der aktuellen Datenbank an, deren Name nicht mit USys…, MSys… oder ~… beginnt. Diese Tabellennamen werden beim ersten Öffnen des Formulars in der Tabelle tblTabellenExportImport gespeichert, und zwar in der Prozedur, die durch das Ereignis Beim Laden des Formulars ausgelöst wird (s. Listing 1).

Listing 1: Diese Prozedur wird beim Laden des Formulars frmTabellenImportExport ausgelöst.

Private Sub Form_Load()
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim rst As DAO.Recordset
    Set db = CurrentDb
    Set rst = db.OpenRecordset("tblTabellenExportImport", dbOpenDynaset)
    Do While Not rst.EOF
        Set tdf = Nothing
        On Error Resume Next
        Set tdf = db.TableDefs(rst!Tabelle)
        On Error GoTo 0
        If tdf Is Nothing Then
            db.Execute "DELETE FROM tblTabellenExportImport WHERE Tabelle = ''" _
                & rst!Tabelle & "''", dbFailOnError
        End If
        rst.MoveNext
    Loop
    rst.Close
    For Each tdf In db.TableDefs
        Select Case Left(tdf.Name, 4)
        Case "MSys", "USys", "~***"
        Case Else
        On Error Resume Next
        db.Execute "INSERT INTO tblTabellenExportImport(Tabelle) VALUES(''" & tdf.Name & "'')", dbFailOnError
        End Select
    Next tdf
    Me!lstTabellen.Requery
    Set rst = db.OpenRecordset("tblTabellenExportImport", dbOpenDynaset)
    Do While Not rst.EOF
        If rst!Export Then
            Me!lstTabellen.Selected(rst.AbsolutePosition) = True
        End If
        rst.MoveNext
    Loop
    rst.Close
    Set rst = Nothing
    Set db = Nothing
    End Sub

Diese Prozedur prüft bei jedem Aufruf des Formulars, ob die in der Tabelle tblTabellenImportExport gespeicherten Tabellennamen noch mit den tatsächlich in der Tabelle vorhandenen Tabellen übereinstimmen, und gleicht diese gegebenenfalls ab.

Dies geschieht in zwei Stufen: Als erstes durchläuft die Prozedur alle Datensätze der Tabelle tblTabellenExportImport, die wie in Abb. 2 aussieht. Sie prüft für jeden Eintrag, ob es noch ein TableDef-Objekt mit dem entsprechenden Namen gibt. Falls nicht, deutet dies darauf hin, dass die Tabelle gelöscht wurde. In diesem Fall wird auch der entsprechende Eintrag aus der Tabelle tblTabellenExportImport entfernt.

pic002.png

Abb. 2: Diese Tabelle speichert, welche Tabellen importiert und exportiert werden sollen.

Danach folgt der umgekehrte Weg: Die Prozedur durchläuft in einer For Each-Schleife alle TableDef-Objekte der aktuellen Datenbank und versucht, für jede Tabelle einen Eintrag in der Tabelle tblTabellenExportImport anzulegen.

Da die Tabelle einen eindeutigen Index für das Feld Tabelle enthält, schlägt dies bei bereits vorhandenen Tabellennamen fehl. Dies ist jedoch kein Problem, da die Access-eigene Fehlerbehandlung zuvor ausgeschaltet wurde.

Schließlich speichert die Tabelle im Ja/Nein-Feld Export, ob eine Tabelle beim Exportieren oder Importieren berücksichtigt werden soll. Dies soll sich auch im Listenfeld lstTabellen widerspiegeln, das für die Mehrfachauswahl vorbereitet wurde.

Dazu werden erneut alle Datensätze der Tabelle tblTabellenExportImport durchlaufen. Dabei stellt die Routine für alle Datensätze, die im Feld Export den Wert True enthalten, den Wert Selected des jeweiligen Eintrags im Listenfeld auf den Wert True ein.

Zwar erlaubt das Listenfeld keinen direkten Zugriff auf die Einträge über den Primärschlüsselwert, aber das ist nicht schlimm: Da das Listenfeld alle Datensätze der Tabelle tblTabellenExportImport anzeigt, entspricht die absolute Position des Datensatzzeigers dem Index der Einträge im Listenfeld.

Tabellen aus- und abwählen

Wenn der Benutzer auf einen der Einträge des Listenfeldes lstTabellen klickt, soll der neue Zustand direkt in der Tabelle tblTabellenExportImport gespeichert werden. Dies erledigt eine Prozedur, die durch das Ereignis Nach Aktualisierung des Listenfeldes ausgelöst wird. Leider gibt es bei der Mehrfachauswahl im Listenfeld keine Möglichkeit, direkt den zuletzt angeklickten Wert zu ermitteln. Also machen wir aus der Not eine Tugend und schreiben gleich jeweils alle Zustände in die Tabelle tblTabellenExportImport. Dies erledigt die Prozedur aus Listing 2.

Listing 2: Aktualisieren der Tabellenwerte nach dem Auswählen von Listenfeldeinträgen

Private Sub lstTabellen_AfterUpdate()
    Dim db As DAO.Database
    Dim i As Integer
    Dim intSelected As Integer
    Set db = CurrentDb
    For i = 0 To Me!lstTabellen.ListCount - 1
        intSelected = Me!lstTabellen.Selected(i)
        db.Execute "UPDATE tblTabellenExportImport SET Export = " & intSelected _
            & " WHERE TabelleID = " & Me!lstTabellen.ItemData(i)
    Next i
    End Sub

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar