André Minhorst, Duisburg
Neue Versionen von Datenbankanwendungen müssen eine Möglichkeit bieten, die Daten der Vorgängerversion zu importieren. Optimalerweise erfolgt dieser Import weitgehend automatisch, was aber einiges an Vorarbeit bei der Entwicklung der neuen Version erfordert. Damit Sie den Benutzern Ihrer Datenbank größtmöglichen Komfort beim Versionswechsel ermöglichen können, lernen Sie im vorliegenden Beitrag einige Varianten für den Import bestehender Daten in eine neue Datenbank kennen.
Es gibt prinzipiell zwei Arten von änderungen an Datenbankanwendungen: Die erste betrifft die Benutzeroberfläche, worunter unter Access Abfragen, Formulare und Berichte sowie die in den Klassen- und Standardmodulen versteckte Programmlogik fallen. Die zweite Art von änderungen zielt auf das Datenmodell und damit auf die in einer Datenbank enthaltenen Tabellen.
Der wichtigste Unterschied der beiden Arten ist, dass die erste durch den Austausch der Benutzeroberfläche, die theoretisch in einem Datenbankfrontend gekapselt sein könnte, erledigt werden kann. Und selbst, wenn die Benutzeroberfläche und die Daten in derselben Datenbank untergebracht sind, können Sie immer noch eine neue Datenbank mit angepasster Benutzeroberfläche, aber ohne Tabellen als neues Datenbankfrontend verwenden. In dem Fall würden Sie die bestehende Datenbank, die ja gleichzeitig Frontend und Backend ist, in ein Backend umfunktionieren, auf das die neue Frontenddatenbank zugreift.
Wenn Sie aber das Datenmodell ändern, reicht es nicht aus, einfach das neue Datenbankbackend als Backend zu verwenden und die vormals komplette Datenbankanwendung in eine Frontenddatenbank umzufunktionieren, indem Sie die Datenbank einfach mit den Tabellen der neuen Backendtabelle verknüpfen. Sie müssen ja immer noch die Daten aus der alten Datenbank in das neue Datenmodell übertragen.
Und wenn Sie das ohnehin erledigen müssen, können Sie auch direkt eine komplett neue Datenbank liefern, die vielleicht auch noch überarbeitungen an der Benutzeroberfläche beinhaltet, und die bestehenden Daten in die neue Datenbank übernehmen.
Und hier sitzt der Hase im Pfeffer: Der für die Datenübernahme erforderliche Algorithmus ist nämlich erstens keineswegs trivial und zweitens sicher von Datenbank zu Datenbank unterschiedlich.
Eine der wichtigsten Aufgaben vor der Entwicklung einer Routine für den Import bestehender Daten in eine neue Datenbank ist die Analyse der Datenmodelle der alten und der neuen Datenbank. Einige grobe Hindernisse bei der einfachen übernahme der Daten sind folgende:
Bild 1: Import der Tabellenstruktur der Nordwinddatenbank
Abhängig von diesen und weiteren Faktoren gibt es unterschiedliche Möglichkeiten, Daten aus fremden Datenbanken zu importieren. Dabei fällt zumindest der Import mit dem entsprechenden Assistenten weg, da der Vorgang optimalerweise komplett automatisiert wird.
Je unterschiedlicher die Strukturen der Quell- und der Zieldatenbank sind, desto aufwändiger wird der Import der Daten; in den meisten Fällen sollte die Verknüpfung der Quelltabellen mit der Zieldatenbank und die Verwendung einiger Aktionsabfragen aber ausreichend sein. In manchen Fällen kann aber auch die Verwendung von DAO beziehungsweise ADO erforderlich sein, um die alten Daten in das neue Format zu pressen.
Für beide Vorgehensweisen kann das Verknüpfen der Zieldatenbank mit den Tabellen der Quelldatenbank hilfreich sein – das ist sogar Voraussetzung, wenn die Daten per Aktionsabfragen von einer zur anderen Datenbank geschaufelt werden sollen (s. Kapitel 4).
Wenn die Quelldatenbank relational verknüpfte Tabellen enthält, deren Primärschlüsselwerte über Autowertfelder erzeugt werden, ist auch noch eine Anpassung der Zieltabellen erforderlich – mehr dazu in Kapitel 5.
Sind die Zieltabellen auf den Import von verknüpften Tabellen mit oder ohne Autowertfelder vorbereitet, steht dem Import per Aktionsabfragen nichts mehr im Wege (s. Kapitel 7).
Für die nachfolgenden Beispiele benötigen Sie zwei Beispieldatenbanken: eine mit den Originaldaten und eine mit der überarbeiteten Tabellenstruktur, die die Originaldaten aufnehmen soll.
Als Originaltabelle dient die Nordwind-Datenbank und die zu füllende Datenbank können Sie mit Hilfe der folgenden Anleitung selbst erstellen:
Public Sub DatenLoeschen() Dim db As DAO.Database Set db = CurrentDb On Error GoTo DatenLoeschen_Err db.Execute "DELETE FROM Bestelldetails", dbFailOnError db.Execute "DELETE FROM Artikel", dbFailOnError db.Execute "DELETE FROM Lieferanten", dbFailOnError db.Execute "DELETE FROM Kategorien", dbFailOnError db.Execute "DELETE FROM Bestellungen", dbFailOnError db.Execute "DELETE FROM Personal", dbFailOnError db.Execute "DELETE FROM Versandfirmen", dbFailOnError db.Execute "DELETE FROM Kunden", dbFailOnError Exit Sub DatenLoeschen_Err: MsgBox "Fehlernummer: " & Err.Number & vbCrLf & "Fehlerbeschreibung: " _ & Err.Description End Sub
Quellcode 1
Wenn Sie die Tabellen auf die genannte Weise importiert haben, müssen Sie nicht zuerst die Daten aus jeder einzelnen Tabelle löschen.
Wenn Sie später den Urzustand der Tabellen reproduzieren, also die Daten löschen und die Autowertzähler wiederherstellen möchten, können Sie das auf zwei Arten durchführen:
Der einfachste Fall für den Import bestehender Daten ergibt sich, wenn die zu importierenden Daten aus Tabellen stammen, die nicht mit anderen Tabellen verknüpft sind. In dem Fall können die Daten einfach von der einen Tabelle in die andere importiert werden – gegebenenfalls sogar mit dem Import-Assistenten von Access. Da Sie hier allerdings automatisierte Möglichkeiten zum Import von Daten kennen lernen sollen, fällt diese Möglichkeit im Rahmen des vorliegenden Beitrags weg.
Tabelle verknüpfen
Die Funktion LinkTable dient der Erstellung einer Verknüpfung der aktuellen Datenbank mit einer Tabelle einer fremden Datenbank. Die Anwendung dieser Funktion sieht beispielsweise folgendermaßen aus:
Call LinkTable("<Pfad>\Nordwind.mdb", _ "Artikel", "ArtikelTemp")
Mit diesem Aufruf erstellen Sie eine Verknüpfung zu der Tabelle Artikel der Nordwind-Datenbank unter dem Namen ArtikelTemp (siehe Bild 2). Die Fehlerbehandlung der Funktion fängt einen Fehler gezielt ab. Dieser tritt auf, wenn bereits eine Tabelle mit dem Namen der zu erstellenden Verknüpfung vorhanden ist. In dem Fall wird die vorhandene Verknüpfung mit der weiter unten beschriebenen Funktion Unlink zunächst entfernt.
Public Function LinkTable(strDatabaseSource As String, strTableSource As String, _ strTableDestination As String) Dim dbSource As DAO.Database Dim dbTarget As DAO.Database Dim tdf As DAO.TableDef On Error GoTo LinkTable_Err Set dbSource = DBEngine.Workspaces(0).OpenDatabase(strDatabaseSource) Set dbDestination = CurrentDb Set tdf = dbDestination.CreateTableDef(strTableDestination) tdf.Connect = ";DATABASE=" & strDatabaseSource tdf.SourceTableName = strTableSource dbDestination.TableDefs.Append tdf LinkTable = True LinkTable_Exit: dbSource.Close Set dbSource = Nothing Set dbDestination = Nothing Set tdf = Nothing Exit Function LinkTable_Err: If Err.Number = 3012 Then If UnlinkTable(strTableDestination) = True Then Resume Else LinkTable = False End If Else LinkTable = False End If Resume LinkTable_Exit End Function
Quellcode 2
Public Function UnlinkTable(strTable As String) Dim db As Database Set db = CurrentDb On Error GoTo UnlinkTable_Err db.TableDefs.Delete (strTable) UnlinkTable = True UnlinkTable_Exit: Set db = Nothing Exit Function UnlinkTable_Err: UnlinkTable = False GoTo UnlinkTable_Exit End Function
Quellcode 3
Bild 2: Eine frisch verknüpfte Tabelle im Datenbankfenster
Verknüpfung löschen
Public Function ImportTable(strDatabaseSource As String, strTableSource As String, _ strTableDestination As String, strTableSourceTemp As String, _ strInsertSQL As String) Dim db As Database Set db = CurrentDb On Error GoTo ImportTable_Err If LinkTable(strDatabaseSource, strTableSource, strTableSourceTemp) = True Then db.Execute (strInsertSQL), dbFailOnError UnlinkTable (strTableSource) ImportTable = True Else ImportTable = False End If ImportTable_Exit: Set db = Nothing Exit Function ImportTable_Err: ImportTable = False GoTo ImportTable_Exit End Function
Quellcode 3
Das Löschen der Verknüpfung per VBA erledigt die Funktion UnlinkTable (s. Quellcode 2). Sie verwendet die Delete-Methode der TableDefs-Auflistung des Database-Objekts mit dem Tabellennamen als einzigem Argument.
Wenn Sie sich vorstellen, dass die Tabelle Personal der Nordwind-Datenbank nicht mit anderen Tabellen verknüpft ist, kann sie gut als Beispiel für den Import einer allein stehenden Tabelle dienen.
Voraussetzung für die nachfolgend vorgestellte Vorgehensweise ist das Vorhandensein einer gefüllten Personaltabelle in der Nordwind-Datenbank und einer leeren Personaltabelle in der Beispieldatenbank.
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