{"id":55000524,"date":"2007-12-01T00:00:00","date_gmt":"2021-02-11T21:19:00","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=524"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"XML_Von_Datenbank_zu_Datenbank","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/","title":{"rendered":"XML: Von Datenbank zu Datenbank"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/1dbb6393268245bf9e9f3e6e222c6bcf\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>XML-Dateien bieten die M&ouml;glichkeit, Daten in hierarchischer Struktur im Textformat abzulegen. Die daraus entstehenden Dateien liefern im Wesentlichen eine M&ouml;glichkeit zum Austauschen von Daten. Dieser Beitrag zeigt, wie Sie dieses Format zum Austauschen oder Sammeln von Daten zwischen Access-Datenbanken mit identischem Datenmodell einsetzen.<\/b><\/p>\n<\/div>\n<div class=\"story\">\n<p><b>XML als Austauschformat<\/b><\/p>\n<p>Den Einsatz von XML als Datenaustauschformat rechtfertigen einige Szenarios. In den meisten F&auml;llen ist dabei Ma&szlig;arbeit angesagt: Es kann beispielsweise sein, dass eine andere Anwendung eine Spezifikation bereitstellt, die das Format zu importierender XML-Daten definiert. Die Wahrscheinlichkeit, dass Access &#8211; egal in welcher Version &#8211; den Export automatisch im gew&uuml;nschten Format vornimmt, ist gering. Also legen Sie selbst Hand an und erzeugen entweder direkt mit der XML-Bibliothek von Microsoft ein entsprechendes XML-Dokument oder Sie schneiden die von Access ausgegebene Datei auf die Zielanwendung zu.<\/p>\n<p>Genauso kann es auch andersherum geschehen: Eine externe Anwendung liefert Daten in einem bestimmten XML-Schema, die Sie gern in Ihre Access-Datenbank importieren m&ouml;chten. Auch hier k&ouml;nnen Sie die Daten per XSL entsprechend modifizieren oder direkt eine passende VBA-Routine entwickeln, die aus der Ausgangsdatei die ben&ouml;tigten Daten herausliest.<\/p>\n<p>Unter Umst&auml;nden sind die Ziel- und die Quellanwendung identisch &#8211; zumindest in Bezug auf das Datenmodell: So k&ouml;nnte es beispielsweise sein, dass Au&szlig;endienstmitarbeiter bei Kundenbesuchen oder daheim am Telefon Daten zu Kunden oder Bestellungen aufnehmen. Zum Synchronisieren der Daten mit der zentralen Datenbank, die etwa auf einem Rechner in der Gesch&auml;ftsstelle liegt, gibt es dann verschiedene Wege &#8211; beispielsweise das direkte Schreiben der Daten &uuml;ber eine passende ODBC-Verbindung.<\/p>\n<p>Ist die Menge der Daten &uuml;berschaubar, kann aber auch eine XML-Datei als Tr&auml;ger der auszutauschenden Informationen herhalten &#8211; zum Beispiel als Inhalt einer E-Mail oder als Anhang einer solchen. Nat&uuml;rlich kann man solche XML-Dateien auch per FTP oder mit einem anderen Protokoll &uuml;ber einen Webserver austauschen.<\/p>\n<p>Der zuletzt geschilderte Fall steht in diesem Beitrag im Mittelpunkt: Aus einer Datenbank sollen zun&auml;chst die Daten einer oder mehrerer Tabellen in eine XML-Datei exportiert und dann in eine weitere Datenbank mit gleichem Aufbau importiert werden. Prinzipiell sind damit nat&uuml;rlich auch die ersten beiden Varianten abgedeckt &#8211; immerhin ben&ouml;tigen Sie hier ja jeweils einen Export, der auf das von der Zielanwendung ben&ouml;tigte XML-Schema abzielt und umgekehrt.<\/p>\n<p><b>Beispieldatenbank<\/b><\/p>\n<p>Als Beispieldatenbank dient die modifizierte Nordwind-Datenbank. Modifiziert deshalb, weil die bei den meisten Entwicklern g&auml;ngige Konvention f&uuml;r die Benennung von Tabellen und Feldern angewendet wurde.<\/p>\n<p>Sie enth&auml;lt neben den &uuml;blichen Tabellen auch noch eine Kopie aller Tabellen, deren Name um den Zusatz 1 erweitert ist &#8211; auf diese Weise ben&ouml;tigen Sie zum Experimentieren mit den Beispielen dieses Beitrags nicht mehrere Datenbanken.<\/p>\n<p><b>Von der Tabelle in das XML-Dokument<\/b><\/p>\n<p>Die Abbildung einfacher Tabellen in XML-Dokumenten ist nicht besonders schwierig. Die Tabelle aus Bild 1 etwa lie&szlig;e sich beispielsweise so abbilden:<\/p>\n<pre>&lt;Kontakte&gt;\r\n &lt;Kontakt&gt;\r\n    &lt;KontaktID&gt;1&lt;\/KontaktID&gt;\r\n    &lt;Vorname&gt;Andr&eacute;&lt;\/Vorname&gt;\r\n    &lt;Nachname&gt;Minhorst&lt;\/Nachname&gt;\r\n    &lt;Telefon&gt;0203-4494477&lt;\/Telefon&gt;\r\n &lt;\/Kontakt&gt;\r\n &lt;Kontakt&gt;\r\n    ...\r\n &lt;\/Kontakt&gt;\r\n&lt;\/Kontakte&gt;<\/pre>\n<div class=\"image\">\n    <img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_05\/XMLExport-web-images\/pic001_opt.jpeg\" alt=\"pic001.tif\" \/>\n<\/div>\n<div class=\"story\">\n<p><b><span style=\"color:darkgrey\">Bild 1: Eine einfache, als XML-Dokument abzubildende Tabelle<\/span><\/b><\/p>\n<\/div>\n<p>Dabei entspricht jeder Datensatz einem Kontakt-Element und jedes Feld einem weiteren Element mit einem Text-Wert.<\/p>\n<p>Es gibt noch weitere Varianten, Daten aus Tabellen in XML-Dokumenten unterzubringen. Dabei entspricht wiederum je ein Kontakt-Element einem Datensatz, allerdings werden die Feldinhalte nun nicht in eigenen Elementen, sondern in Eigenschaften des Kontakt-Elements gespeichert:<\/p>\n<pre>&lt;Kontakte&gt;\r\n &lt;Kontakt KontaktID=&quot;1&quot; Vorname=&quot;Andr&eacute;&quot; <br \/>    Nachname=&quot;Minhorst&quot; Telefon=&quot;0203-4494477&quot;\/&gt;\r\n &lt;Kontakt KontaktID=&quot;2&quot; Vorname=&quot;Sascha&quot; <br \/>    Nachname=&quot;Trowitzsch&quot; Telefon=&quot;030-1234566&quot;\/&gt;\r\n&lt;\/Kontakte&gt;<\/pre>\n<p>Die beiden Varianten lassen sich auch derart kombinieren, dass die Gesch&auml;ftsdaten in eigenen Elementen und die ID, die nur der eindeutigen Identifizierung des Datensatzes dient, in einer Eigenschaft gespeichert werden:<\/p>\n<pre>&lt;Kontakte&gt;\r\n &lt;Kontakt ID=&quot;1&quot;&gt;\r\n    &lt;Vorname&gt;Andr&eacute;&lt;\/Vorname&gt;\r\n    &lt;Nachname&gt;Minhorst&lt;\/Nachname&gt;\r\n    &lt;Telefon&gt;0203-4494477&lt;\/Telefon&gt;\r\n &lt;\/Kontakt&gt;\r\n &lt;Kontakt ID=&quot;2&quot;&gt;\r\n    &lt;Vorname&gt;Sascha&lt;\/Vorname&gt;\r\n    &lt;Nachname&gt;Trowitzsch&lt;\/Nachname&gt;\r\n    &lt;Telefon&gt;030-1234566&lt;\/Telefon&gt;\r\n &lt;\/Kontakt&gt;\r\n&lt;\/Kontakte&gt;<\/pre>\n<p>Daneben gibt es sicher noch viel allgemeinere Schemata f&uuml;r das Speichern von Tabelleninhalten in XML-Dateien. Diese sollen jedoch aus Platzgr&uuml;nden hier nicht n&auml;her beleuchtet werden.<\/p>\n<p><b>1:n-Beziehungen<\/b><\/p>\n<p>Ein wenig interessanter wird es, wenn Beziehungen und damit verkn&uuml;pfte Daten ins Spiel kommen. Wie stellt man beispielsweise eine 1:n-Beziehung in einem XML-Dokument dar Erweitern wir das obige Beispiel um eine kleine Tabelle namens <b>tblAnreden<\/b>, die zwei Felder namens <b>AnredeID <\/b>und <b>Anrede <\/b>enth&auml;lt und die von der Tabelle <b>tblKontakte <\/b>&uuml;ber das Fremdschl&uuml;sselfeld <b>AnredeID <\/b>referenziert wird.<\/p>\n<p><b>Eindeutige Daten<\/b><\/p>\n<p>Wann immer Daten nicht nur in einer, sondern &uuml;ber mehrere, verteilte Datenbanken eindeutig identifizierbar sein sollen, brauchen Sie entsprechende Prim&auml;rschl&uuml;ssel. Mit hoher Wahrscheinlichkeit eindeutig sind Globally Unified Identifier (GUIDs). Sie erzeugen diese mit Hilfe zweier API-Funktionen und einem entsprechenden Wrapper, den Sie unter dem Namen <b>CreateGUID <\/b>im Modul <b>mdlGlobal <\/b>der Beispieldatenbank finden.<\/p>\n<p>Das Anpassen einer bestehenden Datenbank auf GUIDs als Prim&auml;rschl&uuml;ssel ist eine nicht besonders komplizierte Flei&szlig;arbeit. Beim Zusammenf&uuml;hren von Daten aus verschiedenen Datenbanken ist dies aber unerl&auml;sslich: Sie k&ouml;nnen auf diese Weise genau feststellen, ob ein Datensatz bereits vorhanden ist und angepasst werden muss oder ob dieser komplett neu zu erstellen ist. Auch die in Access eingebaute Replikation arbeitet auf diese Weise.<\/p>\n<p><b>Probleme<\/b><\/p>\n<p>Beim Export von Daten in eine XML-Datei und beim anschlie&szlig;enden kompletten Import in eine gleich aufgebaute Datenbank tritt das eine oder andere kleinere Problem auf &#8211; wer schon einmal Daten von Excel nach Access transportiert hat oder umgekehrt, kennt das vermutlich. Beim Erstellen der Routinen zum Weitergeben der Daten der S&uuml;dsturm-Datenbank sind beispielsweise folgende Probleme aufgetreten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Bin&auml;rdaten lassen sich nicht als Inhalt einfacher Elemente weitergeben.<\/li>\n<li class=\"aufz-hlung\">Zeilenumbr&uuml;che (<b>Chr(13) + Chr(10)<\/b>) wurden in <b>Chr(10) <\/b>umgewandelt, was in Tabellen und Formularen der Zieldatenbank nicht mehr richtig angezeigt wurde.<\/li>\n<li class=\"aufz-hlung\">Zahlen mit Dezimalteil wurden nur als Text ordnungsgem&auml;&szlig; weitergegeben, weil so das Komma als Dezimalzeichen beibehalten wurde. Beim Speichern mit <b>nodeTypedValue <\/b>wurde dieses in einen Punkt umgewandelt, der in der Zieldatenbank nicht als Dezimalzeichen erkannt wird.<\/li>\n<li class=\"aufz-hlung\">Nullwerte in Feldern der Tabelle l&ouml;sten beim Einf&uuml;gen &uuml;ber die Eigenschaft <b>text <\/b>Fehler aus.<\/li>\n<\/ul>\n<p>Die Datentypen in XML-Dateien liefert &uuml;brigens die Referenz aus [1] unter <b>MSXML|XML Standards Preference|XDR Reference|XDR Schema Data Types Reference|XDR Schema Data Types<\/b>. Wie die oben gefundenen Probleme behoben werden, erfahren Sie in den folgenden Abschnitten.<\/p>\n<p><b>Komplette Datenbank exportieren<\/b><\/p>\n<p>F&uuml;r das Exportieren beliebiger Datenbanken ist lediglich die Routine aus Listing 1 n&ouml;tig. Sie erledigt alle notwendigen Schritte, indem sie zun&auml;chst die Zeile mit den Angaben zu Format und Codierung erzeugt und dann in verschachtelten <b>For Each<\/b>&#8211; und <b>Do While<\/b>-Schleifen die Tabellen, die Datens&auml;tze, die Felder und Werte durchl&auml;uft und in Form geeigneter XML-Elemente zum <b>DOMDocument<\/b>-Objekt hinzuf&uuml;gt. Voraussetzung f&uuml;r den Einsatz dieser Routine ist, dass alle zu ber&uuml;cksichtigenden Tabellen mit dem Pr&auml;fix <b>tbl <\/b>beginnen &#8211; das ist aber bei dieser Datenbank der Fall.<\/p>\n<div class=\"abbildung\">\n<p class=\"tabellenkopf\">Listing 1: Tabellen in ein XML-Dokument exportieren<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">Public Sub TabellenExportieren()<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    &apos; &#8230; Deklaration aus Platzgr&uuml;nden nicht abgedruckt<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Set db = CurrentDb<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Set objXML = New DOMDocument<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    AddFormat objXML, eEncodingUTF8<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Set nodeRoot = objXML.createElement(&quot;Datenbank&quot;)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    strTableNames = ExportOrder<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    For i = LBound(strTableNames) To UBound(strTableNames)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        strTablename = strTableNames(i)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        If Left(strTablename, 3) = &quot;tbl&quot; Then<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            Set rst = db.OpenRecordset(&quot;SELECT * FROM &quot; &amp; strTablename, dbOpenDynaset)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            Do While Not rst.EOF<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                Set nodeTable = objXML.createElement(strTablename)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                nodeTable.setAttribute &quot;Tabellenname&quot;, strTablename<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                For Each fld In rst.Fields<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    Set nodeField = objXML.createElement(fld.Name)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    Select Case fld.Type<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        Case dbLongBinary<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.DataType = &quot;bin.base64&quot;<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.nodeTypedValue = fld.Value<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        Case dbDate<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.DataType = &quot;date&quot;<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.nodeTypedValue = fld.Value<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        Case dbBoolean<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.nodeTypedValue = rst(fld.Name).Value<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        Case dbBigInt, dbBinary, dbByte, dbDecimal, dbDouble, dbFloat, dbInteger, _<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            dbLong, dbNumeric, dbSingle, dbCurrency<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.DataType = &quot;float&quot;<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.nodeTypedValue = fld.Value<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        Case dbChar, dbText, dbMemo<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.DataType = &quot;string&quot;<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.nodeTypedValue = fld.Value<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        Case Else<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            Debug.Print fld.Name, fld.Type<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            nodeField.nodeTypedValue = Nz(rst(fld.Name).Value, &quot;&quot;)<\/p>\n<\/div>\n<p><!--30percent--><\/p>\n<p>Die Routine enth&auml;lt einige weitere Finessen: So werden die Tabellen beispielsweise nicht in einer willk&uuml;rlichen, sondern in einer durch eine weitere Funktion festgelegten Reihenfolge durchlaufen &#8211; dazu sp&auml;ter mehr.<\/p>\n<p>Des Weiteren schreibt die Routine nicht einfach alle Daten als Text in die jeweiligen Objekte, sondern pr&uuml;ft zuvor den Datentyp des Feldes und schreibt die Daten unter Angabe gewisser Datentypinformationen in das XML-Dokument. Wichtig ist dies vor allem, damit der Inhalt von OLE-Objekten, von Boolean- und Datumsfeldern und von Feldern mit Dezimalzahlen korrekt wieder hergestellt werden kann.<\/p>\n<p><b>Import komplexerer Daten<\/b><\/p>\n<p>Sie haben nun mit einer recht einfachen Routine alle Daten der S&uuml;dsturm-Datenbank in ein XML-Dokument geschrieben &#8211; scheinbar mit allen Informationen, die f&uuml;r das Zur&uuml;ckschreiben in eine Datenbank mit gleichem Datenmodell n&ouml;tig sind.<\/p>\n<p>Leider sind die Informationen doch nicht ganz vollst&auml;ndig und der Import wird nur mit viel Gl&uuml;ck reibungslos &uuml;ber die B&uuml;hne gehen &#8211; zumindest, wenn die Zieldatenbank dieselben Beziehungen wie die Quelldatenbank aufweist. Diese legen n&auml;mlich in gewissem Ma&szlig;e die Reihenfolge des Imports von Daten fest. So k&ouml;nnen Sie beispielsweise nicht die Daten von Tabellen einlesen, deren Fremdschl&uuml;sselfelder auf die Daten in Tabellen verweisen, die zuvor noch nicht gef&uuml;llt wurden, wenn referenzielle Integrit&auml;t vorgesehen ist.<\/p>\n<p>Wenn Sie also etwa die Bestellungen aus der XML-Datei in die Tabelle <b>tblBestellungen <\/b>schreiben m&ouml;chten, l&ouml;st dies einen Fehler etwa mit folgender Meldung aus: &#8222;Der Datensatz kann nicht hinzugef&uuml;gt oder ge&auml;ndert werden, da ein Datensatz der Tabelle &#8222;tblKunden&#8216; mit diesem Datensatz in Beziehung stehen muss.&#8220;<\/p>\n<p>Sie brauchen also Informationen dar&uuml;ber, in welcher Reihenfolge die Tabellen beim Import bearbeitet werden sollen. Wenn man das Datenmodell betrachtet, lassen sich die einzelnen Schritte recht leicht ableiten: Die Tabellen <b>tblPersonal<\/b>, <b>tblLieferanten<\/b>, <b>tblKategorien <\/b>und <b>tblVersandfirmen <\/b>besitzen beispielsweise gar keine Fremdschl&uuml;sselfelder und k&ouml;nnen direkt zu Beginn in beliebiger Reihenfolge eingelesen werden. Dann folgen die Tabellen <b>tblArtikel <\/b>und <b>tblBestellungen<\/b>, die beide ausschlie&szlig;lich Fremdschl&uuml;ssel aufweisen, die auf die bereits aufgef&uuml;hrten Tabellen zeigen. Die Tabelle <b>tblBestelldetails<\/b> referenziert ihrerseits weitere Tabellen, wird aber von keiner der anderen Tabellen referenziert und somit als letzte importiert.<\/p>\n<p>Nun erfolgt der Export der Daten in das XML-Dokument innerhalb einer Routine, die selbst keine einzige der betroffenen Tabellen oder Felder namentlich referenziert und daher auch mit Tabellen anderer Datenbanken funktionieren w&uuml;rde &#8211; vorausgesetzt, diese gen&uuml;gen der in der Export-Prozedur geforderten Konvention nach Tabellennamen, die mit <b>tbl <\/b>beginnen (die Prozedur lie&szlig;e sich aber auch an andere Tabellennamen anpassen). Da w&auml;re es doch sch&ouml;n, wenn der Import in die Zieldatenbank auf genauso flexible Weise erfolgen k&ouml;nnte.<\/p>\n<p><b>Die richtige Export-Reihenfolge<\/b><\/p>\n<p>Sie m&uuml;ssen also vor dem Import mit einem geeigneten Algorithmus die Reihenfolge der zu importierenden Tabellen ermitteln oder &#8211; noch besser &#8211; die Tabellen direkt in der richtigen Reihenfolge in die XML-Datenbank schreiben.<\/p>\n<p>Die nachfolgend beschriebene Routine, deren kompletten Code Sie in der Beispieldatenbank im Modul <b>mdlXML <\/b>unter dem Namen <b>ExportOrder <\/b>finden, erledigt diese Aufgabe und liefert als Ergebnis ein Array mit den Namen der Tabellen in der richtigen Reihenfolge.<\/p>\n<p><b>Tabellen ohne Fremdschl&uuml;ssel finden<\/b><\/p>\n<p>Im ersten Schritt ben&ouml;tigen Sie alle Tabellen, die nicht auf andere Tabellen verweisen. Beim Auffinden dieser Tabellen helfen die Systemtabellen von Access: Die Tabelle <b>MSysObjects <\/b>verzeichnet alle Tabellen (und auch alle &uuml;brigen Objekte einer Datenbank) und die Tabelle <b>MSysRelationships <\/b>Informationen &uuml;ber die Beziehungen zwischen den Tabellen.<\/p>\n<p>Die Routine aus Listing 2 f&uuml;llt zun&auml;chst ein Array namens <b>strTables <\/b>mit den Namen der in der Datenbank enthaltenen Tabellen, die mit <b>tbl <\/b>beginnen.<\/p>\n<div class=\"abbildung\">\n<p class=\"tabellenkopf\">Listing 2: Sortieren der Tabellen einer Datenbank in eine Reihenfolge, in der Tabellen mit Fremdschl&uuml;sselfeldern erst nach dem Anlegen der Datens&auml;tze der verkn&uuml;pften Tabellen gef&uuml;llt werden.<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">Public Function ExportOrder() As Variant<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim strTables() As String<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim db As DAO.Database<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim intTable As Integer<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim intReferencedTable As Integer<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim rstTables As DAO.Recordset<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim rstRelations As DAO.Recordset<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim intTables As Integer<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim strTemp As String<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Dim boltausch As Boolean<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Set db = CurrentDb<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Set rstTables = _<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        db.OpenRecordset(&quot;SELECT Name FROM MSysObjects WHERE Name LIKE &apos;tbl*&apos; AND Type=1&quot;, dbOpenDynaset)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Do While Not rstTables.EOF<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        ReDim Preserve strTables(intTable)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        strTables(intTable) = rstTables!Name<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        intTable = intTable + 1<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        rstTables.MoveNext<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Loop<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    intTables = intTable<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    boltausch = True<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Do While boltausch = True<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        boltausch = False<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        For intTable = 0 To intTables &#8211; 1<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            For intReferencedTable = intTable + 1 To intTables &#8211; 1<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                Set rstRelations = db.OpenRecordset(&quot;SELECT * FROM MSysRelationships WHERE szObject = &apos;&quot; _<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    &amp; strTables(intTable) &amp; &quot;&apos; AND szReferencedObject = &apos;&quot; &amp; strTables(intReferencedTable) &amp; &quot;&apos;&quot;)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                If Not rstRelations.EOF Then<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    strTemp = strTables(intTable)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    strTables(intTable) = strTables(intReferencedTable)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    strTables(intReferencedTable) = strTemp<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    boltausch = True<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                End If<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            Next intReferencedTable<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        Next intTable<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Loop<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    ExportOrder = strTables<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">End Function<\/p>\n<\/div>\n<p>Nachfolgend durchlaufen zwei <b>For&#8230;Next<\/b>-Schleifen alle Kombinationen von Tabellen und pr&uuml;ft, ob die eine auf die jeweils andere verweist. Dazu &ouml;ffnet die Routine jeweils ein Recordset basierend auf den Eintr&auml;gen der Tabelle <b>MSysRelationships<\/b>, wobei nur diejenigen Eintr&auml;ge ermittelt werden, in denen die erste Tabelle als <b>szObject <\/b>und die zweite als <b>szReferencedObject <\/b>gef&uuml;hrt wird.<\/p>\n<p>Das ist in der Regel maximal ein Datensatz f&uuml;r jede Kombination (wenn es bei Ihnen mal mehr sein sollten, pr&uuml;fen Sie dringend Ihr Datenmodell!). Ist die erste Tabelle von der zweiten abh&auml;ngig, vertauscht die Routine die Positionen der beiden Eintr&auml;ge im Array <b>strTables<\/b>. Dies geschieht so lange, bis alle Kombinationen einmal durchlaufen wurden. Wichtig ist hierbei, dass es tats&auml;chlich um die Position im Array geht und nicht um die Tabellennamen selbst &#8211; die werden ja hin- und hergeschoben. Durch diese Schieberei k&ouml;nnen nat&uuml;rlich auch nicht alle Kombinationen von Tabellen gepr&uuml;ft und entsprechend sortiert werden. Deshalb gibt es au&szlig;en um die beiden <b>For&#8230;Next<\/b>-Schleifen herum noch eine <b>Do While<\/b>-Schleife. Diese hat eine Abbruchbedingung, die dann zutrifft, wenn beim Durchlaufen der aktuellen Positionen keine Umsortierung mehr stattfindet.<\/p>\n<p>Daf&uuml;r sorgt die Variable <b>bolTausch<\/b>: Sie wird auf <b>True <\/b>gesetzt, sobald zwei Elemente vertauscht wurden, was nach Durchlaufen der aktuellen Kombinationen f&uuml;r eine Wiederholung des ganzen sorgt &#8211; so lange, bis sich alle Elemente in der richtigen Reihenfolge befinden.<\/p>\n<p>Die Funktion gibt ein Array mit der richtigen Reihenfolge der Tabellen zur&uuml;ck, was auch in der Routine aus Listing 1 zum Einsatz kommt.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">XML-Daten in die Zieldatenbank schreiben<\/p>\n<p>Der hier vorgestellte Import geht davon aus, dass die Zieldatenbank noch keine Daten enth&auml;lt &#8211; oder zumindest keine, die den Prim&auml;rschl&uuml;sselwerten der zu importierenden Daten in die Quere kommen.<\/p>\n<p>Dies lie&szlig;e sich leicht l&ouml;sen, wenn man GUIDs als Prim&auml;rschl&uuml;ssel verwenden w&uuml;rde: Diese sind mit hoher Wahrscheinlichkeit eindeutig, sodass Daten an verschiedenen Stellen angelegt und dann in einer zentralen Datenbank gesammelt werden k&ouml;nnen.<\/p>\n<p>Damit die Beispieldatenbank (<b>XMLZiel.mdb<\/b>) beim Experimentieren keine Probleme macht, finden Sie hier eine kleine Routine, die alle vorhandenen Datenbanken, die mit <b>tbl <\/b>beginnen, leert:<\/p>\n<pre>Public Sub DBLeeren()\r\n    Dim strTables() As String\r\n    Dim db As DAO.Database\r\n    Dim i As Integer\r\n    strTables = ExportOrder\r\n    Set db = CurrentDb\r\n    For i = UBound(strTables) To _<br \/>            LBound(strTables) Step -1\r\n        db.Execute &quot;DELETE FROM &quot; _<br \/>            &amp; strTables(i), dbFailOnError\r\n    Next i\r\nEnd Sub<\/pre>\n<p>Wie auch die &uuml;brigen Routinen in diesem Beitrag l&ouml;scht auch diese die Daten aller Tabellen, ohne dass Sie die Namen der Tabellen programmatisch festlegen m&uuml;ssen. Dabei behilft die Routine sich der soeben vorgestellten Funktion <b>ExportOrder<\/b>, die ja die Tabellen in die richtige Reihenfolge zum Importieren der Daten bringt. Beim L&ouml;schen geht dies freilich genau andersherum: Erst m&uuml;ssen die Daten der Tabellen entfernt werden, die auf andere Tabellen verweisen, und dann die &uuml;brigen. Das ist zumindest zwingend erforderlich, wenn Sie f&uuml;r die Beziehungen referentielle Integrit&auml;t festgelegt haben.<\/p>\n<p>Wenn die Zieldatenbank leer ist, k&ouml;nnen Sie getrost die Routine aus Listing 3 starten: Diese schnappt sich das XML-Dokument und f&uuml;llt dessen Daten in die Tabellen der leeren S&uuml;dsturm-Datenbank.<\/p>\n<div class=\"abbildung\">\n<p class=\"tabellenkopf\">Listing 3: Importieren der Daten aus einer XML-Datei in die Tabellen der Zieldatenbank<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">Public Sub TabellenEinlesen()<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    &apos; &#8230; Deklaration aus Platzgr&uuml;nden nicht abgedruckt<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    DBLeeren<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Set db = CurrentDb<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Set objXML = New DOMDocument<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    If objXML.Load(CurrentProject.Path &amp; &quot;\\Suedsturm.xml&quot;) Then<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        Set objRoot = objXML.childNodes(1)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        For i = 0 To objRoot.childNodes.length &#8211; 1<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            Set objTable = objRoot.childNodes.Item(i)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            Set rst = db.OpenRecordset(objTable.nodeName, dbOpenDynaset)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            rst.AddNew<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            For l = 0 To objTable.childNodes.length &#8211; 1<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                Set objField = objTable.childNodes.Item(l)<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                Select Case objField.DataType<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    Case &quot;bin.base64&quot;<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        strField = objField.nodeName<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        rst(strField) = objField.nodeTypedValue<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    Case &quot;string&quot;<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        strField = objField.nodeName<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        If Len(objField.Text) &gt; 0 Then<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                            rst(strField) = objField.nodeTypedValue<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        End If<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                    Case Else<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        strField = objField.nodeName<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                        rst(strField) = objField.nodeTypedValue<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">                End Select<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            Next l<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            rst.Update<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        Next i<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    Else<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">        MsgBox &quot;Fehler: &quot; &amp; objXML.parseError.reason &amp; &quot;Zeile &quot; &amp; objXML.parseError.Line &amp; &quot;, Zeichen &quot; <\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">            &amp; objXML.parseError.linepos<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">    End If<\/p>\n<p class=\"quellcode-funktionssammlung-1-5\">End Sub<\/p>\n<\/div>\n<p>Dabei passiert wiederum nicht viel Spektakul&auml;res: Im Wesentlichen durchl&auml;uft die Routine die Elemente des XML-Dokuments, die ja bez&uuml;glich der Tabellen schon in der richtigen Reihenfolge gespeichert wurden, und legt je Element einen neuen Datensatz in der aktuell zu f&uuml;llenden Tabelle an.<\/p>\n<p>Die einzigen interessanten Stellen sind die, wo der Datentyp des XML-Elements ausgewertet wird: Im Falle eines Strings liefert ein XML-Dokument n&auml;mlich immer eine Zeichenkette, auch wenn es eine leere ist.<\/p>\n<p>Da aber Textfelder standardm&auml;&szlig;ig so eingestellt sind, dass zwar Nullwerte, aber keine leeren Zeichenketten erlaubt sind, erzeugt das Einf&uuml;gen einer leeren Zeichenkette meist einen Fehler. Dem beugt die Routine vor, indem sie &uuml;berhaupt nur einen Wert einf&uuml;gt, wenn die vom XML-Dokument gelieferte Zeichenkette nicht leer ist.<\/p>\n<p><b>Verbleibende Probleme<\/b><\/p>\n<p>Die S&uuml;dsturm-Datenbank verursachte nur an einer Stelle Probleme &#8211; und zwar dort, wo der Inhalt von Textfeldern Zeilenumbr&uuml;che enthielt, der ja dort &uuml;blicherweise durch die Zeichen <b>Chr(10) <\/b>und <b>Chr(13) <\/b>angegeben wird. Nach dem Export in das XML-Dokument und dem Importieren in die Zieldatenbank ist davon allerdings nur noch der Wert <b>Chr(10) <\/b>&uuml;brig, der leider als Sonderzeichen und nicht als Zeilenumbruch interpretiert wird. F&uuml;r solche F&auml;lle empfiehlt sich das gleiche Vorgehen wie beispielsweise beim Import von Daten aus Excel-Tabellen: man sieht eine Sonderbehandlung vor. Dabei f&uuml;gen Sie einfach an allen Stellen, die <b>Chr(10) <\/b>ohne vorheriges <b>Chr(13) <\/b>enthalten, die gew&uuml;nschte Kombination der beiden Zeichen ein.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Sie haben hier in kompakter Form erfahren, wie Sie halbwegs komplexe Daten aus einer Datenbank heraus in einem XML-Dokument speichern und andersherum. Die Anforderungen in der Praxis sind zuweilen komplizierter, aber mit den hier und im Beitrag <b>XML-Dokumente mit VBA erstellen und lesen <\/b>vorgestellten Techniken zum gr&ouml;&szlig;ten Teil erf&uuml;llbar. Sollten Sie selbst einmal planen, Daten mehrerer Datenbanken &uuml;ber die Zwischenstation XML-Dokument zu synchronisieren, planen Sie fr&uuml;hzeitig die Verwendung von GUIDs als Prim&auml;rschl&uuml;ssel ein. Ein interessanter Anwendungsfall f&uuml;r die hier vorgestellten Techniken ist ein Onlineshop, der die Bestelldaten im XML-Format per E-Mail an den Betreiber sendet. Die E-Mails k&ouml;nnten dann von Outlook aus automatisiert ausgelesen und in die Bestelldatenbank geschrieben werden.<\/p>\n<p>Wie so etwas im Detail aussieht, erfahren Sie in der n&auml;chsten Ausgabe im Beitrag <b>Bestellverwaltung f&uuml;r Onlineshops<\/b>, Shortlink 542.<\/p>\n<p class=\"quellen\">[1] Microsoft Core XML Services (MSXML) 6.0: http:\/\/www.microsoft.com\/downloads\/details.aspxFamilyID=993c0bcf-3bcf-4009-be21-27e85e1857b1&amp;DisplayLang=en, hier die Datei msxml6_SDK.msi herunterladen<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>XML.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/3C43DD06-D561-4E96-9600-8A76A2D1EA2C\/aiu_524.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>XML-Dateien bieten die M&ouml;glichkeit, Daten in hierarchischer Struktur im Textformat abzulegen. Die daraus entstehenden Dateien liefern im Wesentlichen eine M&ouml;glichkeit zum Austauschen von Daten. Dieser Beitrag zeigt, wie Sie dieses Format zum Austauschen oder Sammeln von Daten zwischen Access-Datenbanken mit identischem Datenmodell einsetzen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662007,66062007,44000030,44000025],"tags":[],"class_list":["post-55000524","post","type-post","status-publish","format-standard","hentry","category-662007","category-66062007","category-Internet","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>XML: Von Datenbank zu Datenbank - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"XML: Von Datenbank zu Datenbank\" \/>\n<meta property=\"og:description\" content=\"XML-Dateien bieten die M&ouml;glichkeit, Daten in hierarchischer Struktur im Textformat abzulegen. Die daraus entstehenden Dateien liefern im Wesentlichen eine M&ouml;glichkeit zum Austauschen von Daten. Dieser Beitrag zeigt, wie Sie dieses Format zum Austauschen oder Sammeln von Daten zwischen Access-Datenbanken mit identischem Datenmodell einsetzen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-11T21:19:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/1dbb6393268245bf9e9f3e6e222c6bcf\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"XML: Von Datenbank zu Datenbank\",\"datePublished\":\"2021-02-11T21:19:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/\"},\"wordCount\":3231,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/1dbb6393268245bf9e9f3e6e222c6bcf\",\"articleSection\":[\"2007\",\"6\\\/2007\",\"Internet\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/\",\"name\":\"XML: Von Datenbank zu Datenbank - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/1dbb6393268245bf9e9f3e6e222c6bcf\",\"datePublished\":\"2021-02-11T21:19:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/1dbb6393268245bf9e9f3e6e222c6bcf\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/1dbb6393268245bf9e9f3e6e222c6bcf\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XML_Von_Datenbank_zu_Datenbank\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"XML: Von Datenbank zu Datenbank\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"XML: Von Datenbank zu Datenbank - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/","og_locale":"de_DE","og_type":"article","og_title":"XML: Von Datenbank zu Datenbank","og_description":"XML-Dateien bieten die M&ouml;glichkeit, Daten in hierarchischer Struktur im Textformat abzulegen. Die daraus entstehenden Dateien liefern im Wesentlichen eine M&ouml;glichkeit zum Austauschen von Daten. Dieser Beitrag zeigt, wie Sie dieses Format zum Austauschen oder Sammeln von Daten zwischen Access-Datenbanken mit identischem Datenmodell einsetzen.","og_url":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-11T21:19:00+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/1dbb6393268245bf9e9f3e6e222c6bcf","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"XML: Von Datenbank zu Datenbank","datePublished":"2021-02-11T21:19:00+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/"},"wordCount":3231,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/1dbb6393268245bf9e9f3e6e222c6bcf","articleSection":["2007","6\/2007","Internet","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/","url":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/","name":"XML: Von Datenbank zu Datenbank - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/1dbb6393268245bf9e9f3e6e222c6bcf","datePublished":"2021-02-11T21:19:00+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/1dbb6393268245bf9e9f3e6e222c6bcf","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/1dbb6393268245bf9e9f3e6e222c6bcf"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/XML_Von_Datenbank_zu_Datenbank\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"XML: Von Datenbank zu Datenbank"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000524"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000524\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}