XML-Export mit VBA

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Access stellt verschiedene Möglichkeiten für den Export von Daten im XML-Format zur Verfügung. Die Variante, mit der Sie Tabellen über die Benutzeroberfläche in das XML-Format exportieren können, können Sie natürlich auch per VBA nutzen – und zwar mit dem Befehl “ExportXML” des “Application”-Objekts. Dieser Beitrag zeigt, welcher Parameter welcher Option entspricht und welche zusätzlichen Features Sie per VBA erhalten.

Der Export von Daten aus Access heraus in ein XML-Dokument erfordert immer zumindest die Angabe einer Tabelle sowie der Zieldatei. Außerdem können Sie nicht nur Tabellen, sondern auch alle anderen Objekttypen von Access im XML-Format exportieren – also müssen Sie auch noch den Objekttyp angeben. Dementsprechend lautet die minimale Version eines Aufrufs der Methode ExportXML des Application-Objekts wie folgt:

Application.ExportXML acExportTable, "tblAnreden", _
    CurrentProject.Path & "\tblAnreden.xml"

Der erste Parameter erwartet den Objekttyp, in diesem Fall acExportTable (bei einer Abfrage würden Sie etwa acExportQuery nutzen). Der zweite gibt den Namen des zu exportierenden Objekts an (hier tblAnreden) und der dritte den Pfad zu der zu erzeugenden Datei. Hier haben wir CurrentProject.Path zur Ermittlung des Verzeichnisses der aktuellen Datenbank genutzt, damit die XML-Datei direkt in diesem Verzeichnis angelegt wird – und zwar unter dem Namen tblAnreden.xml. Damit können Sie den ersten einfachen Export per Einzeiler erledigen und sich das Ergebnis ansehen:

<xml version="1.0" encoding="UTF-8">
<dataroot ...>
   <tblAnreden>
     <AnredeID>1</AnredeID>
     <Anrede>Herr</Anrede>
   </tblAnreden>
   <tblAnreden>
     <AnredeID>2</AnredeID>
     <Anrede>Frau</Anrede>
   </tblAnreden>
</dataroot>

Mit diesem Einzeiler sparen Sie sich einige Mausklicks, die Sie bei der Benutzung des Export-Assistenten über die Benutzeroberfläche hätten ausführen müssen – zumindest, wenn Sie diese Anweisung einmal in eine Prozedur eingetragen haben und dann aufrufen.

Nun bietet der Assistent noch einige weitere Möglichkeiten, die wir uns auch schon im Beitrag XML-Export ohne VBA (www.access-im-unternehmen.de/1045) angesehen haben. Diese wollen wir nun auch mit VBA abbilden.

Zu exportierende Daten einschränken

In manchen Fällen möchten Sie vielleicht nicht alle Daten einer Tabelle exportieren, sondern nur eine Teilmenge. Bei Benutzung des Assistenten musste dafür die Tabelle mit den zu exportierenden Daten geöffnet sein.

Wenn Sie einen einzelnen Datensatz exportieren wollten, mussten Sie diesen zunächst markieren und dann den Assistenten starten, der nun die Option Aktueller Datensatz bereitstellte. Wenn Sie zuvor einen Filter für die Tabelle oder Abfrage festgelegt haben, konnten Sie auch mit der Option Bestehenden Filter anwenden arbeiten.

Nun sollen Sie vor dem Exportieren der Tabellendaten nicht erst die Tabelle öffnen und den Filter definieren. Dies erledigen Sie nämlich mit einem einfachen Parameter der ExportXML-Methode. Im Gegensatz zu den bereits im vorherigen Beispiel vorgestellten drei Parametern befindet sich der nun gesuchte Parameter relativ weit hinten in der Parameterliste, sodass Sie entweder eine entsprechende Anzahl Kommata setzen, um zum gewünschten Parameter zu gelangen oder den Parameter benennen. Wir wollen in diesem Fall alle Datensätze der Tabelle tblArtikel exportieren, deren Artikelname mit A beginnt.

Im ersten Anlauf fügen wir die entsprechende Anzahl Kommata ein, wobei uns IntelliSense wie in Bild 1 unterstützt. Der Befehl sieht dann wie folgt aus:

Eingabe der Parameter für den Export mit einer Bedingung

Bild 1: Eingabe der Parameter für den Export mit einer Bedingung

Application.ExportXML acExportTable, "tblArtikel",  _
    CurrentProject.Path & "\tblArtikel.xml", , , , , ,  "Artikelname LIKE ''''A*''''"

Das Ergebnis überrascht: Es liefert nur den Kopf des Exportdokuments, aber keinerlei Artikeldaten (s. Bild 2). Eine kurze Prüfung der zu exportierenden Tabelle tblArtikel zeigt, dass dort durchaus Artikel vorliegen, deren Artikelname mit A beginnt. Ein Blick in die Online-Dokumentation liefert auch keine Hinweise auf einen Fehler in der Formulierung unserer Bedingung.

XML-Export ohne Daten

Bild 2: XML-Export ohne Daten

Also experimentieren wir einfach etwas herum und finden heraus, dass es mit kompletten Vergleichswerten funktioniert – also etwa mit folgendem Aufruf:

Application.ExportXML acExportTable, "tblArtikel",  _
    CurrentProject.Path & "\tblArtikel.xml", , , , , ,  "Artikelname LIKE ''''Alice Mutton''''"

Wie Bild 3 zeigt, funktioniert das Setzen einer Bedingung also grundsätzlich.

XML-Export mit Filter nach Artikelname

Bild 3: XML-Export mit Filter nach Artikelname

Woran also hapert es bei Verwendung eines Platzhalters wie dem Sternchen (*)

Da wir wissen, dass in anderen SQL-Dialekten durchaus auch mal andere Platzhalter-Zeichen zum Einsatz kommen, wobei statt des Sternchens beispielsweise das Prozentzeichen (%) verwendet wird, probieren wir es einfach einmal so aus:

Application.ExportXML acExportTable, "tblArtikel", _
    CurrentProject.Path & "\tblArtikel.xml", , , , , ,  "Artikelname LIKE ''''A%''''"

Und siehe da: Es funktioniert! Hier ist die Ausgabe für diese Anweisung mit den beiden betroffenen Artikel-Datensätzen:

<xml version="1.0" encoding="UTF-8">
<dataroot ...>
   <tblArtikel>
     <ArtikelID>3</ArtikelID>
     <Artikelname>Aniseed Syrup</Artikelname>
     <LieferantID>1</LieferantID>
     <KategorieID>2</KategorieID>
     <Liefereinheit>12 x 550-ml-Flaschen</Liefereinheit>
     <Einzelpreis>5</Einzelpreis>
     <Lagerbestand>13</Lagerbestand>
     <BestellteEinheiten>70</BestellteEinheiten>
     <Mindestbestand>25</Mindestbestand>
     <Auslaufartikel>0</Auslaufartikel>
   </tblArtikel>
   <tblArtikel>
     <ArtikelID>17</ArtikelID>
     <Artikelname>Alice Mutton</Artikelname>
     <LieferantID>7</LieferantID>
     <KategorieID>6</KategorieID>
     <Liefereinheit>20 x 1-kg-Dosen</Liefereinheit>
     <Einzelpreis>19.5</Einzelpreis>
     <Lagerbestand>0</Lagerbestand>
     <BestellteEinheiten>0</BestellteEinheiten>
     <Mindestbestand>0</Mindestbestand>
     <Auslaufartikel>1</Auslaufartikel>
   </tblArtikel>
</dataroot>

Wenn Sie nicht mit den vielen Kommata durcheinanderkommen wollen, können Sie, wie oben erwähnt, mit einem benannten Parameter arbeiten. Der Aufruf sieht dann so aus:

Application.ExportXML acExportTable, _
    "tblArtikel", CurrentProject.Path & "\tblArtikel.xml", _
    WhereCondition:="Artikelname LIKE ''''A%''''"

Sie können auch alle Parameter benennen:

Application.ExportXML ObjectType:=acExportTable,  DataSource:="tblArtikel", _
    DataTarget:=CurrentProject.Path & "\tblArtikel.xml",  WhereCondition:="Artikelname LIKE ''''A%''''"

Parameter des Aufrufs

Einige Parameter haben Sie nun schon kennen gelernt, dennoch hier die übersicht aller möglichen Parameter:

  • ObjectType: Konstante für den Objekttyp, hier sinnvollerweise acExportTable oder acExportQuery. Andere Werte wie acExportForm oder acExportReport erscheinen auf den ersten Blick sinnlos, aber haben doch ihre Daseinsberechtigung: Sie exportieren damit nämlich nicht etwa eine Formular- oder Berichtsdefinition, sondern die darin angezeigten Daten.
  • DataSource: Name der Datenquelle, also etwa der Tabelle oder der Abfrage.
  • DataTarget: Pfad zur Zieldatei für den Export. Vorhandene Dateien werden ohne Warnung überschrieben.
  • SchemaTarget: Ziel für die erstellte Schema-Datei.
  • PresentationTarget: Ziel für eine Datei mit Informationen zur Präsentation der Daten.
  • ImageTarget: Pfad für eventuell zu exportierende Bilder. Im Test konnten wir damit keine Bilder exportieren.
  • Encoding: Konstante für die Kodierung des XML-Dokuments (acUTF16 oder acUTF32)
  • OtherFlags: Kombination aus keinem, einem oder mehreren der folgenden Konstanten (hier nur die wichtigsten – mehr in der Onlinehilfe): acEmbedSchema (1) – sorgt dafür, dass Schemainformationen in das XML-Dokument geschrieben werden, acExcludePrimaryKeyAndIndexes (2) – schließt Primärschlüssel und Indizes beim Export aus, acExportAllTableAndFieldProperties (32) – exportiert Eigenschaften von Tabellen und Feldern mit dem Schema.
  • WhereCondition: Bedingung für die auszugebenden Datensätze
  • AdditionalData: Angabe weiterer Tabellen, die exportiert werden sollen. Ermöglicht die Auswahl der Tabellen, wie es beim Assistenten per TreeView möglich ist (s. Bild 4). AdditionalData bietet allerdings noch mehr Möglichkeiten.
  • Auswahl der zu exportierenden Tabellen per TreeView und Kontrollkästchen

    Bild 4: Auswahl der zu exportierenden Tabellen per TreeView und Kontrollkästchen

Daten aus mehreren Tabellen

Den Parameter AdditionalData schauen wir uns als Nächstes an. Onlinehilfe und Objektkatalog schweigen sich ebenso wie Intellisense über den Datentyp des zu übergebenden Wertes oder Objekts aus – hier taucht lediglich der Datentyp Variant auf, der ja verschiedene Typen aufnehmen kann. Schließlich hilft eine Suche nach dem Schlüsselwort AdditionalData im Objektkatalog weiter (s. Bild 5). Hier erfahren wir, dass es sich um eine eigene Klasse handelt, der wir wohl auch noch rekursiv weitere AdditionalData-Elemente zuweisen können. Das macht natürlich Sinn, denn auch der Assistent für den XML-Export bietet ja die verknüpften Tabellen in hierarchischer Anordnung an.

Der Objektkatalog liefert Informationen über den Datentyp von AdditionalData.

Bild 5: Der Objektkatalog liefert Informationen über den Datentyp von AdditionalData.

Export von Tabellen mit verknüpfter Lookuptabelle

Schauen wir uns ein einfaches Beispiel an – Kunden und ihre Anreden. Dazu wollen wir die Tabelle tblKunden exportieren und die Daten der Tabelle tblAnreden als zusätzliche Daten mitliefern. Wenn wir das mit dem Assistenten erledigen, definieren wir den Export wie in Bild 6. Das Ergebnis sieht dann so aus:

Definition des Exports von Kunden und ihren Anreden

Bild 6: Definition des Exports von Kunden und ihren Anreden

<xml version="1.0" encoding="UTF-8">
<dataroot ...>
   <tblKunden>
     <KundeID>1</KundeID>
     <KundenCode>ALFKI</KundenCode>
     <Firma>Alfreds Futterkiste</Firma>
     <AnredeID>2</AnredeID>
     <Vorname>Maria</Vorname>
     <Nachname>Anders</Nachname>
     ...
   </tblKunden>
   ...
   <tblAnreden>
     <AnredeID>1</AnredeID>
     <Anrede>Herr</Anrede>
   </tblAnreden>
   <tblAnreden>
     <AnredeID>2</AnredeID>
     <Anrede>Frau</Anrede>
   </tblAnreden>
</dataroot>

Das heißt, dass die Anrede im tblKunden-Element als Fremdschlüsselwert gespeichert wird und alle Datensätze der Tabelle tblAnreden ebenfalls angehängt werden, sodass diese einfach wieder importiert werden können.

Nun schauen wir uns an, was geschieht, wenn wir den Export per VBA durchführen und dem Parameter AdditionalData ein Objekt des gleichnamigen Typs übergeben, das wir zuvor mit dem Element tblAnreden gefüllt haben.

Den Code finden Sie in Listing 1. Hier deklarieren wir das AdditionalData-Objekt mit der Variablen objAdditionalData und erstellen es dann mit der Methode CreateAdditionalData des Application-Objekts. Dann fügen wir mit der Add-Methode die Tabelle tblAnreden hinzu. Schließlich übergeben wir das Objekt mit dem Parameter AdditionalData an die Methode ExportXML.

Public Sub ExportKundenUndAnreden()
     Dim objAdditionalData As AdditionalData
     Set objAdditionalData = Application.CreateAdditionalData
     objAdditionalData.Add "tblAnreden"
     Application.ExportXML acExportTable, "tblKunden", _
         CurrentProject.Path & "\KundenUndAnreden.xml", _
         AdditionalData:=objAdditionalData
End Sub

Listing 1: Export der Kundendaten und der Anreden

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

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar