Home > Artikel > Ausgabe 6/2016 > Daten sichern über XML

Daten sichern über XML

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Für die Aufgabe, dass mehrere Tabellen einer Datenbank in eine andere verfrachtet werden sollen, weil Sie dort exakt dieselben Daten benötigen, gibt es unterschiedliche Lösungen. Je nach Situation kommt es auf die Inhalte an, auf die Beziehungen zwischen den Tabellen, oder auf die Eigenschaften und Attribute der Felder. Mit Access 2010 ist eine neue Möglichkeit hinzugekommen, die wir uns genauer anschauen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1606_TabExport.accdb.

Exportfunktionen

Bei Neuanlage einer Datenbank möchten Sie das Entwickeln des Datenmodells schnell erledigt haben. Sie greifen daher häufig auf existierende Datenbanken zu, die bereits die gewünschten oder ähnliche Tabellen enthalten, importieren diese entweder in die neue Datenbank, oder exportieren sie aus der bestehenden.

In der Regel werden Sie sich dabei der für diesen Zweck vorgesehenen Funktionen der Oberfläche bedienen. Das Menüband spendiert uns dafür sogar einen eigenen Reiter Externe Daten mit seinen Gruppen Exportieren, sowie Importieren und Verknüpfen.

Auch über VBA können Sie den Import und Export auf unterschiedliche Weise anstoßen.

In aller Kürze hier einige Möglichkeiten, auf die an anderer Stelle bereits eingegangen wurde:

RunCommand acCmdExportAccess

Ruft lediglich den Dialog zum Exportieren einer Tabelle in eine externe Datenbank auf

RunCommand acCmdImportAttachAccess

Ruft nur den Dialog zum Importieren von Elementen aus einer externen Datenbank auf. Bei diesen beiden Anweisungen sind also zusätzlich manuelle Angaben erforderlich.

DoCmd.RunSavedImportExport ""

In diesem Fall läuft der Import oder Export automatisch ab, jedoch unter einer Bedingung: Sie haben den Vorgang bereits über die Oberflächendialoge einmal durchgeführt und ihn namentlich abgespeichert.

DoCmd.TransferDatabase ...

Das ist die Hauptfunktion zum Exportieren von Tabellen. Die Funktion erwartet eine Vielzahl von Parametern, die sie steuern. Nachteil: Nur eine einzelne Tabelle kann über sie exportiert werden.

Application.SaveAsText acTable, _

"", ""

Diese versteckte Funktion speichert die Tabelle komplett mit all ihren Eigenschaften in eine Datei. Das Pendant zum Wiederherstellen der Tabelle:

Application.LoadFromText

acTable,"", ""

Sollen mehrere Tabellen ohne jede manuelle Interaktion exportiert werden, wie etwa jene des Datenmodells aus Bild 1 der Beispieldatenbank, so kommt man folglich um eine ausprogrammierte Routine nicht herum. Doch seit Access 2010 gibt es hierfür eine neue Anweisung, die die Sache deutlich einfacher macht.

Datenmodell der Beispieldatenbank

Bild 1: Datenmodell der Beispieldatenbank

Die Funktion ExportXML

erwartet, ähnlich, wie TransferDatabase, die Übergabe einer Menge von Parametern. Der erste gibt den Objekttyp des Elements an, das exportiert werden soll. IntelliSense erleichtert Ihnen dabei die Auswahl der Parameterkonstanten. Darunter finden Sie mit acExportForm oder acExportReport auch die Objekttypen Formular und Bericht. Wer nun denkt, dass sich darüber der komplette Aufbau von Formularen und Berichten transferieren ließe, der irrt! Tatsächlich bezieht Access hier nur die Daten dieser Objekte in den Export ein, also im Prinzip deren Datenherkünfte. Das braucht man wohl höchst selten!

Die einzige für unseren Zweck sinnvolle Konstante ist deshalb acExportTable. Listing 1 zeigt, wie die Tabelle tblKunden über ExportXML in eine XML-Datei überführt wird. Zunächst wird der Ausgabepfad in der Variablen sPath zwischengespeichert. Im Beispiel ist das das Verzeichnis der aktuellen Datenbank. ExportXML wird als zweiten Parameter der Name der Tabelle (tblKunden) übergeben und als dritter der Dateiname, welcher sich aus Pfad plus kunden.xml bildet.

Sub ExportTable()

     Dim sPath As String

     

     sPath = CurrentProject.Path & "\"

     ExportXML acExportTable, "tblKunden", sPath & "kunden.xml", _

         , , , , _

         acEmbedSchema Or acExportAllTableAndFieldProperties

End Sub

Listing 1: Die einfachste Prozedur zum Datenexport per Funktion ExportXML

Darauf folgen mehrere Kommas, die bedeuten, dass hier vier optionale Parameter nicht angegeben werden. Man braucht sie in der Regel nicht, denn sie beziehen sich alle auf optionale Zusätze der XML-Datei, wie das Schema oder die Präsentation. Wichtig hingegen ist der nächste Parameter, der die Art des Exports über wählbare Flags festlegt. acEmbedSchema sagt Access, dass das XML-Schema in der XML-Datei selbst abzulegen ist, statt separat. acExportAllTableAndFieldProperties gibt an, dass nicht nur Daten und Struktur ausgegeben werden sollen, sondern auch die Eigenschaften und Attribute sowohl der Tabelle, wie aller Felder. Das wären dann Beschriftungen, Gültigkeitsformeln, Standardwerte, also alles, was nicht in die SQL-DDL-Repräsentation passt, aber auch Spaltenbreiten und weitere Layoutangaben, wie Schriftart oder Farben. Derlei erlaubt TransferDatabase nicht! Die Anweisung wurde wahrscheinlich für die Automation der ab Access 2007 neu eingeführten Vorlagen und Anwendungs-Parts eingeführt, denn die Gestalt der XML-Datei entspricht diesen Template-Dateien genau.

Nun kann man über die Funktion aber nicht nur eine, sondern beliebig viele Tabellen exportieren. Listing 2 zeigt, wie's geht. Alles, was man dafür braucht, ist eine Objektvariable des Typs AdditionalData, die man an die Funktion ExportXML als letzten Parameter anhängt. Im Listing nennt sie sich AData und wird zunächst über die Funktion CreateAdditionalData angelegt. Nun können an das Objekt Tabellen über die Methode Add angefügt werden – hier die Tabellen tblAnreden, tblOrte und tblLaender. Auch für diese Tabellen werden all ihre Eigenschaften in der XML-Datei verewigt. Dies lässt sich auf keine andere Weise so einfach und komfortabel erledigen. Wenn Sie die Tabellen nicht hartkodiert in die Routine schreiben möchten, so verwenden Sie eine allgemeinere Prozedur, wie in Listing 3. Sie durchläuft im ersten Schritt anhand der TableDefs-Auflistung der Datenbank (CurrentDb) alle Tabellen, schließt dabei aber alle aus, deren Name mit MSys beginnt, denn wir möchten ja nicht auch die Systemtabellen der Datenbank exportierten. Die Tabellen werden per Add an das AdditionalData-Objekt angehängt. Außerdem wird hier tblKunden ignoriert, denn das ist die Zentraltabelle, die man nachher in ExportXML angibt. Ohne Tabellenangabe funktioniert ExportXML nicht! Damit ist die Routine natürlich nicht allgemein verwendbar.

Sub ExportAllTablesKunden()

     Dim sPath As String

     Dim AData As AdditionalData

     Dim tdf As TableDef

     

     Set AData = CreateAdditionalData

     For Each tdf In CurrentDb.TableDefs

         If Left(tdf.Name, 4) <> "MSys" Then

             If tdf.Name <> "tblKunden" Then AData.Add tdf.Name

         End If

     Next tdf

     

     sPath = CurrentProject.Path & "\"

     ExportXML acExportTable, "tblKunden", sPath & "kunden.xml", _

         , , , , _

         acEmbedSchema Or acExportAllTableAndFieldProperties, , AData

End Sub

Listing 2: Sämtliche Tabellen der Datenbank werden in AdditionalData gepackt

Ändern wir sie deshalb so ab, wie in Listing 4. Die Boolean-Variable B hat zunächst den Wert False. Im Schleifenblock wir dies ausgewertet. Die erste gültige Tabelle wird der Variablen sTable verabreicht und B auf True gesetzt. Dadurch kommt es in der Folge immer zum Durchlaufen des zweiten Teils der Bedingung: weitere Tabellen werden an AData angehängt. Die erste Tabelle wird dann über sTable an ExportXML gereicht. Der Name für die Ausgabedatei lautet hier tabellen.xml.

Sub ExportAllTables()

     Dim sPath As String

     Dim AData As AdditionalData

     Dim tdf As TableDef

     Dim sTable As String

     Dim B As Boolean

     

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!