{"id":55000803,"date":"2011-12-01T00:00:00","date_gmt":"2020-05-22T21:58:45","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=803"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Daten_zusammenfuehren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/","title":{"rendered":"Daten zusammenf&uuml;hren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/d8a44867c7114dac9f2283311e458e29\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Haben Sie auch Kunden, die ihre Daten in mehreren Datenbanken und\/oder Tabellen halten und diese gern zusammenf&uuml;hren m&ouml;chten Oder kommt das vielleicht sogar bei Ihnen selbst vor Das ist kein Grund zum Sch&auml;men: Auch dem Autor dieser Zeilen passiert so etwas. Das ist aber nicht schlimm, wenn man wei&szlig;, wie man die Daten zuverl&auml;ssig in einer einzigen Datenbankanwendung zusammenf&uuml;hrt. Im konkreten Fall geht es um zwei Kundendatenbanken f&uuml;r verschiedene Produkte, die vereinigt werden sollten.<\/b><\/p>\n<p>Eine Datenbank verwaltet Kunden und deren Abonnements, die andere Kunden und Softwaretools. Es w&auml;re doch toll, wenn es hier einen gemeinsamen Kundenstamm g&auml;be. Sonst hilft einem etwa die Erkenntnis, dass ein Kunde nicht gern Rechnungen bezahlt, gar nichts, wenn seine n&auml;chste Bestellung von einer v&ouml;llig anderen Datenbank verwaltet wird.<\/p>\n<p>G&auml;be es nur einen Kunden-Stammdatensatz in einer einzigen Datenbank mit allen Produkten, k&ouml;nnte man gleich den Riegel vorschieben und beispielsweise Vorkasse verlangen, wenn ein s&auml;umiger Kunde mal wieder eine Bestellung aufgibt.<\/p>\n<p>Andersherum lassen sich in einer einzigen Datenbank viel einfacher Rabattaktionen f&uuml;r Kunden durchf&uuml;hren, die gegebenenfalls schon mehrere Produkte erworben haben &#8211; und vieles mehr. Und generell tut es gut, wenn man wei&szlig;, dass es Stammkunden gibt, die immer wieder auf die angebotenen Produkte zugreifen. Bis dahin ist es allerdings ein langer Weg, wenn die Kundendaten sich noch nicht in einer einzigen Datenbank befinden.<\/p>\n<p><b>Von S&uuml;dwind zu S&uuml;dwind<\/b><\/p>\n<p>In diesem Beitrag schauen wir uns beispielhaft anhand der S&uuml;dwind-Datenbank an, wie Sie die Daten der einen Datenbank zu denen der anderen Datenbank hinzuf&uuml;gen k&ouml;nnen. Vereinfachend gehen wir davon aus, dass Sie schlicht zwei gleich aufgebaute Datenbanken verwenden, um unterschiedliche Produkte zu verwalten &#8211; beispielsweise f&uuml;r einen Lebensmittel-Shop und einen Shop mit Haarpflegeprodukten.<\/p>\n<p>Die Daten der eigentlichen S&uuml;dsturm-Datenbank (unserer optimierten Version der Nordwind-Datenbank) haben wir beibehalten, zus&auml;tzlich verwenden wir eine Kopie der S&uuml;dsturm-Datenbank, die allerdings in der Artikeltabelle nur Haarpflegeprodukte enth&auml;lt. Au&szlig;erdem gibt es dort andere Mitarbeiter, Kategorien, Kunden, Lieferanten et cetera &#8211; genug Material also, um einen Import zu programmieren.<\/p>\n<p><b>Vorhandene Daten<\/b><\/p>\n<p>Wichtig ist vorab, dass Sie f&uuml;r jede Tabelle den Umgang mit vorhandenen Daten kl&auml;ren. Sollen vorhandene Datens&auml;tze, die in bestimmten Kriterien mit einem neuen Datensatz &uuml;bereinstimmen, ersetzt werden Oder behalten Sie den vorhandenen Datensatz bei Und welche Kriterien legen &uuml;berhaupt fest, ob der Datensatz als vorhanden definiert wird<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Prim&auml;rschl&uuml;sselwerte<\/p>\n<p>Wie geht man mit zu importierenden Datens&auml;tzen um, deren Prim&auml;rschl&uuml;sselwert bereits vorhanden ist Eines ist klar: Zweifach k&ouml;nnen Sie keinen Prim&auml;rschl&uuml;sselwert vergeben. Also m&uuml;ssen Sie dem neuen Datensatz einen neuen Prim&auml;rschl&uuml;sselwert zuweisen.<\/p>\n<p><b>Fremdschl&uuml;sselfelder<\/b><\/p>\n<p>An sich kein Problem, wenn da die verkn&uuml;pften Tabellen nicht w&auml;ren: Wenn Sie beispielsweise einen Artikel neu anlegen und dessen Prim&auml;rschl&uuml;sselwert dabei ebenfalls neu vergeben, m&uuml;ssen Sie bei zu importierenden Daten, die mit dem Artikel verkn&uuml;pft sind, auch die Fremdschl&uuml;sselfelder anpassen.<\/p>\n<p>Dies erledigen wir in diesem Fall auf einfache Weise: Wir f&uuml;gen den Tabellen der Zieldatenbank ein neues Feld hinzu, das <b>PKAlt <\/b>hei&szlig;t. Bei neu eingef&uuml;gten Datens&auml;tzen schreiben wir den alten Prim&auml;rschl&uuml;sselwert als Erinnerung in dieses Feld. Wenn Sie dann sp&auml;ter etwa eine Bestellposition importieren, die einen solchen Artikel referenziert, brauchen Sie nur zu pr&uuml;fen, welcher Artikeldatensatz in der Zieltabelle den Fremdschl&uuml;sselwert im Feld <b>PKAlt<\/b> aufweist. Dann ermitteln Sie den neuen Prim&auml;rschl&uuml;sselwert dieses Datensatzes und tragen ihn als neuen Wert des entsprechenden Fremdschl&uuml;sselfeldes der Bestellposition ein.<\/p>\n<p><b>Reihenfolge der Tabellen<\/b><\/p>\n<p>Auch die Reihenfolge der Tabellen beim Import ist wichtig. Tabellen, die Fremdschl&uuml;sselfelder mit Verkn&uuml;pfungen zu anderen Tabellen enthalten, k&ouml;nnen Sie erst importieren, wenn die entsprechenden Datens&auml;tze der verkn&uuml;pften Tabellen vorliegen. Im Falle der S&uuml;dsturm-Datenbank s&auml;he dies wie folgt aus:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>tblKategorien <\/b>(keine Fremdschl&uuml;sselfelder)<\/li>\n<li class=\"aufz-hlung\"><b>tblPersonal <\/b>(keine Fremdschl&uuml;sselfelder)<\/li>\n<li class=\"aufz-hlung\"><b>tblLieferanten <\/b>(keine Fremdschl&uuml;sselfelder)<\/li>\n<li class=\"aufz-hlung\"><b>tblVersandfirmen <\/b>(keine Fremdschl&uuml;sselfelder)<\/li>\n<li class=\"aufz-hlung\"><b>tblKunden <\/b>(keine Fremdschl&uuml;sselfelder)<\/li>\n<li class=\"aufz-hlung\"><b>tblArtikel <\/b>(verkn&uuml;pft mit <b>tblKategorien <\/b>und <b>tblLieferanten<\/b>)<\/li>\n<li class=\"aufz-hlung\"><b>tblBestellungen <\/b>(verkn&uuml;pft mit <b>tblKunden<\/b>, <b>tblPersonal <\/b>und <b>tblLieferanten<\/b>)<\/li>\n<li class=\"aufz-hlung\"><b>tblBestellpositionen <\/b>(verkn&uuml;pft mit <b>tblBestellungen <\/b>und <b>tblArtikel<\/b>)<\/li>\n<\/ul>\n<p><b>Zugriff auf die zu importierenden Daten<\/b><\/p>\n<p>Auf die Quelldaten f&uuml;r den Import k&ouml;nnen Sie auf verschiedene Arten zugreifen. Am einfachsten ist es vermutlich, die Tabellen einfach zu verkn&uuml;pfen. Sie liegen dann wie lokale Tabellen vor und k&ouml;nnen per VBA genau so behandelt werden.<\/p>\n<p>Eine zweite Variante ist es, die Tabellen nicht zu verkn&uuml;pfen, sondern mit der <b>IN<\/b>-Klausel in <b>SELECT<\/b>&#8211; Statements auf die Daten zuzugreifen. Dies ist jedoch etwas un&uuml;bersichtlicher, da man auch nicht mal eben ein paar Werte in den betroffenen Tabellen pr&uuml;fen kann, ohne die Quelldatenbank zu &ouml;ffnen.<\/p>\n<p><b>Kategorien zusammenf&uuml;hren<\/b><\/p>\n<p>Beginnen wir mit einer kleinen Aufw&auml;rm&uuml;bung: dem Zusammenf&uuml;hren der Datens&auml;tze der Tabelle <b>tblKategorien<\/b>. Die Quelltabelle ist in der Zieldatenbank in Form einer Verkn&uuml;pfung eingebunden und hei&szlig;t <b>tblKategorien1<\/b>. Das Zusammenf&uuml;hren &uuml;bernimmt in diesem Fall die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-anchor\">Listing 1<\/a><\/span>.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Zusammenf&uuml;hren der beiden Tabellen tblKategorien und tblKategorien1<\/p>\n<pre>Public Sub DatenZusammenfuehren()\r\n    Dim db As DAO.Database\r\n    Dim rstQuelle As DAO.Recordset\r\n    Dim rstZiel As DAO.Recordset\r\n    Dim lngZielID As Long\r\n    Set db = CurrentDb\r\n    Set rstQuelle = db.OpenRecordset(&quot;SELECT * FROM tblKategorien1&quot;, dbOpenDynaset)\r\n    Set rstZiel = db.OpenRecordset(&quot;SELECT * FROM tblKategorien&quot;, dbOpenDynaset)\r\n    Do While Not rstQuelle.EOF\r\n        lngZielID = Nz(DLookup(&quot;KategorieID&quot;, &quot;tblKategorien&quot;, &quot;Kategoriename = ''&quot; _\r\n            &amp; rstQuelle!Kategoriename &amp; &quot;''&quot;))\r\n        If lngZielID = 0 Then\r\n            rstZiel.AddNew\r\n            rstZiel!Kategoriename = rstQuelle!Kategoriename\r\n            rstZiel!Beschreibung = rstQuelle!Beschreibung\r\n            rstZiel!Abbildung = rstQuelle!Abbildung\r\n            rstZiel!PKAlt = rstQuelle!KategorieID\r\n            rstZiel.Update\r\n        Else\r\n            rstZiel.FindFirst &quot;KategorieID = &quot; &amp; lngZielID\r\n            rstZiel.Edit\r\n            rstZiel!PKAlt = rstQuelle!KategorieID\r\n            rstZiel.Update\r\n        End If\r\n        rstQuelle.MoveNext\r\n    Loop\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Die Prozedur deklariert zun&auml;chst ein <b>Database<\/b>-Objekt und zwei <b>Recordset<\/b>-Objekte &#8211; je eines f&uuml;r die Quell- und die Zieldatenbank. Au&szlig;erdem ben&ouml;tigen wir eine Variable, welche den Wert eines Datensatzes mit einer eventuell bereits vorhandenen Kategorie speichert. Danach weist die Prozedur den Objekten den Verweis auf die aktuelle Datenbank sowie auf die beiden betroffenen Tabellen zu. Eine <b>Do While<\/b>-Schleife durchl&auml;uft die Quelltabelle und pr&uuml;ft zun&auml;chst, ob die Zieltabelle bereits eine gleichnamige Kategorie enth&auml;lt.<\/p>\n<p>Ist dies der Fall, wird die Variable <b>lngZielID <\/b>mit dem Wert des Prim&auml;rschl&uuml;sselwertes des entsprechenden Datensatzes gef&uuml;llt. Ist noch keine Kategorie dieses Namens vorhanden, erh&auml;lt <b>lngZielID <\/b>den Wert <b>0<\/b>. <\/p>\n<p>In diesem Fall wird der Tabelle ein neuer Datensatz hinzugef&uuml;gt. Das Erstellen des neuen Datensatzes erledigt die <b>AddNew<\/b>-Methode des Recordset-Objekts.<\/p>\n<p>Die folgenden Zeilen weisen den jeweiligen Feldern die Werte aus dem Quelldatensatz zu &#8211; au&szlig;er einem Feld: Das Prim&auml;rschl&uuml;sselfeld <b>KategorieID <\/b>ist ein Autowertfeld, das seinen Wert automatisch erh&auml;lt. Schlie&szlig;lich speichert die <b>Update<\/b>-Anweisung den neuen Datensatz.<\/p>\n<p>Ist bereits eine gleichnamige Kategorie vorhanden, hat <b>lngZielID <\/b>einen Wert ungleich <b>0<\/b>. Die Prozedur sucht in diesem Fall mit der <b>FindFirst<\/b>-Methode nach dem entsprechenden Datensatz und verschiebt den Datensatzzeiger auf diesen Datensatz.<\/p>\n<p>Dann bereitet sie diesen mit der <b>Edit<\/b>-Methode zum &auml;ndern vor. Die einzige &auml;nderung ist der Eintrag des Prim&auml;rschl&uuml;sselwertes des Datensatzes aus der Quelltabelle in das Feld <b>PKAlt <\/b>der Zieltabelle. Die <b>Update<\/b>-Methode speichert die &auml;nderung in der Tabelle. Das Ergebnis sieht dann beispielsweise wie in Bild 1 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Datenmerge-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Zieltabelle mit Angabe der Prim&auml;rschl&uuml;sselwerte der Quelltabelle<\/span><\/b><\/p>\n<p>Auf die gleiche Weise f&uuml;gen wir einige Zeilen Code zur Prozedur hinzu, welche die Lieferanten der Quelldatenbank zur Tabelle <b>tblLieferanten <\/b>der Zieltabelle hinzuf&uuml;gt. Die Unterschiede finden sich lediglich in den verwendeten Tabellen und Feldnamen. Auch f&uuml;r die Tabelle <b>tblLieferanten <\/b>gilt: Die Datens&auml;tze der Tabelle <b>tblArtikel <\/b>sind &uuml;ber das Feld <b>LieferantID <\/b>mit den Lieferanten-Datens&auml;tzen verkn&uuml;pft.<\/p>\n<p><!--30percent--><\/p>\n<p>Damit wir sp&auml;ter ermitteln k&ouml;nnen, wie der neue Prim&auml;rschl&uuml;sselwert eines importierten Lieferanten-Datensatzes lautet, m&uuml;ssen wir auch den alten Wert in der Zieltabelle speichern. Daf&uuml;r legen Sie auch hier ein neues Feld namens <b>PKAlt <\/b>an.<\/p>\n<p><b>Daten mit Verkn&uuml;pfungen hinzuf&uuml;gen<\/b><\/p>\n<p>Prinzipiell unterscheidet sich das Hinzuf&uuml;gen von Daten aus Tabellen, f&uuml;r die bereits &uuml;ber Fremdschl&uuml;sselfelder verkn&uuml;pfte Daten in der Zieltabelle vorliegen, kaum von dem oben beschriebenen Vorgang zum Einlesen einfacher Daten ohne Verkn&uuml;pfung. Die Erweiterung aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-44-anchor\">Listing 2<\/a><\/span> zeigt, wie der ben&ouml;tigte Code aussieht.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Zusammenf&uuml;hren von Kategorien, Lieferanten und Artikeln in einem Rutsch<\/p>\n<pre>Public Sub DatenZusammenfuehren_KategorienLieferantenArtikel()\r\n    Dim db As DAO.Database\r\n    Dim rstQuelle As DAO.Recordset\r\n    Dim rstZiel As DAO.Recordset\r\n    Dim lngZielID As Long\r\n    Set db = CurrentDb\r\n    ''... Kategorien hinzuf&uuml;gen\r\n    ''... Lieferanten hinzuf&uuml;gen    \r\n    Set rstQuelle = db.OpenRecordset(&quot;SELECT * FROM tblArtikel1&quot;, dbOpenDynaset)\r\n    Set rstZiel = db.OpenRecordset(&quot;SELECT * FROM tblArtikel&quot;, dbOpenDynaset)\r\n    Do While Not rstQuelle.EOF\r\n        lngZielID = Nz(DLookup(&quot;ArtikelID&quot;, &quot;tblArtikel&quot;, &quot;Artikelname = ''&quot; _\r\n            &amp; rstQuelle!Artikelname &amp; &quot;''&quot;))\r\n        If lngZielID = 0 Then\r\n            rstZiel.AddNew\r\n            rstZiel!Artikelname = rstQuelle!Artikelname\r\n            rstZiel!LieferantID = DLookup(&quot;LieferantID&quot;, &quot;tblLieferanten&quot;, &quot;PKAlt = &quot; _\r\n                &amp; rstQuelle!LieferantID)\r\n            rstZiel!KategorieID = DLookup(&quot;KategorieID&quot;, &quot;tblKategorien&quot;, &quot;PKAlt = &quot; _\r\n                &amp; rstQuelle!KategorieID)\r\n            rstZiel!Liefereinheit = rstQuelle!Liefereinheit\r\n            rstZiel!Einzelpreis = rstQuelle!Einzelpreis\r\n            rstZiel!Lagerbestand = rstQuelle!Lagerbestand\r\n            rstZiel!BestellteEinheiten = rstQuelle!BestellteEinheiten\r\n            rstZiel!Mindestbestand = rstQuelle!Mindestbestand\r\n            rstZiel!Auslaufartikel = rstQuelle!Auslaufartikel\r\n            rstZiel!PKAlt = rstQuelle!ArtikelID\r\n            rstZiel.Update\r\n        Else\r\n            rstZiel.FindFirst &quot;ArtikelID = &quot; &amp; lngZielID\r\n            rstZiel.Edit\r\n            rstZiel!PKAlt = rstQuelle!ArtikelID\r\n            rstZiel.Update\r\n        End If\r\n        rstQuelle.MoveNext\r\n    Loop\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Genau genommen finden sich nur beim Eintragen der Werte der Fremdschl&uuml;sselfelder Unterschiede: Sie k&ouml;nnen dort nat&uuml;rlich nicht einfach den Wert des Feldes aus der Originaltabelle anlegen, sondern m&uuml;ssen pr&uuml;fen, welchen Prim&auml;rschl&uuml;sselwert der verkn&uuml;pfte Datensatz in der Zieltabelle aufweist.<\/p>\n<p>Genau f&uuml;r diesen Zweck haben wir in den Zieltabellen das Feld <b>PKAlt<\/b> eingerichtet. Um zu ermitteln, wie der neue Prim&auml;rschl&uuml;sselwert lautet, sucht die Prozedur zun&auml;chst nach dem Datensatz, dessen Wert im Feld <b>PKAlt <\/b>mit dem im Fremdschl&uuml;sselfeld der Tabelle <b>tblArtikel <\/b>angegebenen Wert &uuml;bereinstimmt. Zu diesem Datensatz ben&ouml;tigen Sie dann nur noch den Wert des Prim&auml;rschl&uuml;sselfeldes und tragen diesen in das Fremdschl&uuml;sselfeld des neuen Datensatzes ein. Wie dies schematisch aussieht, erfahren Sie in Bild 2.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Datenmerge-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Schematischer Ablauf beim Ermitteln des neuen Fremdschl&uuml;sselwertes eines importierten Datensatzes<\/span><\/b><\/p>\n<p>In der Prozedur verwenden Sie f&uuml;r diesen Zweck schlicht zwei Aufrufe der <b>DLookup<\/b>-Funktion. Diese greift auf die Daten der verkn&uuml;pften Zieltabellen zu, also beispielsweise auf die Tabelle <b>tblKategorien<\/b>. Als Kriterium kommt ein Ausdruck zum Einsatz, der nach der Kategorie sucht, deren Feld <b>PKAlt <\/b>den Wert aufweist, den das Fremdschl&uuml;sselfeld <b>KategorieID <\/b>der Tabelle <b>tblArtikel1 <\/b>(also der Quelltabelle) enth&auml;lt.<\/p>\n<p>Zu genau diesem Datensatz ermittelt <b>DLookup <\/b>dann den Prim&auml;rschl&uuml;sselwert, also den neuen Wert des Fremdschl&uuml;sselfeldes <b>KategorieID <\/b>in der Zieltabelle <b>tblArtikel<\/b>.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Daten weiterer Tabellen integrieren<\/p>\n<p>Die Daten der &uuml;brigen Tabellen f&uuml;gen Sie auf die gleiche Weise in die Tabellen der Zieldatenbank ein &#8211; es gibt hier kaum Hindernisse, wenn Sie &uuml;ber ein sauberes Datenmodell verf&uuml;gen.<\/p>\n<p><b>Keine &auml;nderung des Datenmodells m&ouml;glich<\/b><\/p>\n<p>Gegebenenfalls haben Sie keinen Zugriff auf das Datenmodell der Zieldatenbank oder d&uuml;rfen dieses nicht &auml;ndern. Das bedeutet, dass Sie in den Zieltabellen kein Feld anlegen k&ouml;nnen, das die vorherigen Prim&auml;rschl&uuml;sselwerte neu angelegter Datens&auml;tze speichern kann &#8211; ein Mapping der Datens&auml;tze mit Fremdschl&uuml;sselfeldern ist somit anders durchzuf&uuml;hren.<\/p>\n<p>Keine Sorge: Die dazu ben&ouml;tigten Daten k&ouml;nnen Sie auch in einer eigenen Tabelle unterbringen, die noch nicht einmal in der Zieldatenbank vorliegen muss. Sie k&ouml;nnen die Tabelle auch in der Quelldatenbank oder in einer dritten Datenbank anlegen &#8211; Hauptsache, Sie k&ouml;nnen auf die Daten dieser Tabelle zugreifen, etwa &uuml;ber eine Verkn&uuml;pfung. Diese Tabelle muss die folgenden Informationen speichern:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Name der Zieltabelle<\/li>\n<li class=\"aufz-hlung\">Name des Prim&auml;rschl&uuml;sselfeldes der Zieltabelle<\/li>\n<li class=\"aufz-hlung\">Wert des Prim&auml;rschl&uuml;sselfeldes des Datensatzes in der Zieltabelle<\/li>\n<li class=\"aufz-hlung\">Wert des Prim&auml;rschl&uuml;sselfeldes des Datensatzes aus der Quelltabelle<\/li>\n<\/ul>\n<p>Den Namen der Zieltabelle und des Feldes schreiben wir zusammen in ein Feld &#8211; die Daten werden niemals getrennt abgefragt, also ist eine Aufteilung nicht n&ouml;tig. Weiterhin gehen wir davon aus, dass die Prim&auml;rschl&uuml;sselfelder den Datentyp <b>Long<\/b> verwenden, und legen zum Speichern des alten und neuen Prim&auml;rschl&uuml;sselwerts jeweils Zahlenfelder an. Die komplette Tabelle zum Speichern des Mappings sieht inklusive einiger Beispieldaten wie in Bild 3 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Datenmerge-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Tabelle zum Speichern alter und neuer Prim&auml;rschl&uuml;sselwerte<\/span><\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Code f&uuml;r Mapping-Tabelle anpassen<\/p>\n<p>Nun m&uuml;ssen Sie noch den Code zum Importieren der Daten anpassen &#8211; immerhin werden die Mapping-Daten nun nicht mehr in die jeweiligen Zieltabellen geschrieben, sondern in eine eigens daf&uuml;r vorgesehene Tabelle (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-31-anchor\">Listing 3<\/a><\/span>). Im Detail ben&ouml;tigen Sie dazu die folgenden &auml;nderungen:<\/p>\n<p class=\"listingueberschrift\">Listing 4: Ermitteln der neuen Prim&auml;rschl&uuml;sselwerte aus der Mapping-Tabelle<\/p>\n<pre>    Set rstQuelle = db.OpenRecordset(&quot;SELECT * FROM tblArtikel1&quot;, dbOpenDynaset)\r\n    Set rstZiel = db.OpenRecordset(&quot;SELECT * FROM tblArtikel&quot;, dbOpenDynaset)\r\n    Do While Not rstQuelle.EOF\r\n        lngZielID = Nz(DLookup(&quot;ArtikelID&quot;, &quot;tblArtikel&quot;, &quot;Artikelname = ''&quot; _\r\n            &amp; rstQuelle!Artikelname &amp; &quot;''&quot;))\r\n        If lngZielID = 0 Then\r\n            rstZiel.AddNew\r\n            rstZiel!Artikelname = rstQuelle!Artikelname\r\n            rstZiel!LieferantID = DLookup(&quot;PKNeu&quot;, &quot;tblPKAltUndNeu&quot;, _\r\n                &quot;PKFeld = ''tblLieferanten.LieferantID'' AND PKAlt = &quot; &amp; rstQuelle!LieferantID)\r\n            rstZiel!KategorieID = DLookup(&quot;PKNeu&quot;, &quot;tblPKAltUndNeu&quot;, _\r\n                &quot;PKFeld = ''tblKategorien.KategorieID'' AND PKAlt =  &quot; &amp; rstQuelle!KategorieID)\r\n            rstZiel!Liefereinheit = rstQuelle!Liefereinheit\r\n            rstZiel!Einzelpreis = rstQuelle!Einzelpreis\r\n            rstZiel!Lagerbestand = rstQuelle!Lagerbestand\r\n            rstZiel!BestellteEinheiten = rstQuelle!BestellteEinheiten\r\n            rstZiel!Mindestbestand = rstQuelle!Mindestbestand\r\n            rstZiel!Auslaufartikel = rstQuelle!Auslaufartikel\r\n            lngZielID = rstZiel!ArtikelID\r\n            rstZiel.Update\r\n        End If\r\n        db.Execute &quot;INSERT INTO tblPKAltUndNeu(PKFeld, PKAlt, PKNeu) VALUES(''tblArtikel.&quot; _\r\n            &amp; &quot;ArtikelID'', &quot; &amp; rstQuelle!ArtikelID &amp; &quot;, &quot; &amp; lngZielID &amp; &quot;)&quot;, dbFailOnError\r\n        rstQuelle.MoveNext\r\n    Loop<\/pre>\n<ul>\n<li class=\"aufz-hlung\">Die Tabelle <b>tblPKAltUndNeu <\/b>wird zu Beginn der Prozedur geleert.<\/li>\n<li class=\"aufz-hlung\">Das Eintragen des alten Prim&auml;rschl&uuml;sselwertes in das Feld <b>PKAlt <\/b>der Zieltabelle entf&auml;llt.<\/li>\n<li class=\"aufz-hlung\">Daf&uuml;r wird jeweils ein neuer Datensatz in der Tabelle <b>tblPKAltUndNeu <\/b>angelegt. Dieser enth&auml;lt den Namen von Tabelle und Feld sowie den alten und den neuen Prim&auml;rschl&uuml;sselwert.<\/li>\n<li class=\"aufz-hlung\">Der neue Prim&auml;rschl&uuml;sselwert wird in der Variablen <b>lngZielID <\/b>zwischengespeichert. Wenn &#8211; in diesem Fall &#8211; die anzulegende Kategorie bereits vorhanden ist, wird der Wert f&uuml;r <b>lngZielID <\/b>gleich zu Beginn per <b>DLookup <\/b>ermittelt, die Prozedur kann dann gleich den Mapping-Datensatz anlegen.<\/li>\n<li class=\"aufz-hlung\">Falls nicht, wird der neue Datensatz, hier die Kategorie, zun&auml;chst per DAO angelegt. Dabei k&ouml;nnen Sie kurz vor dem Speichern des neuen Datensatzes den neuen Wert des Prim&auml;rschl&uuml;sselfeldes abgreifen und in <b>lngZielID <\/b>speichern.<\/li>\n<li class=\"aufz-hlung\">In beiden F&auml;llen legt eine <b>Execute<\/b>-Methode mit einer entsprechenden <b>INSERT INTO<\/b>-Anweisung einen neuen Datensatz in der Tabelle <b>tblPKAltUndNeu <\/b>an.<\/li>\n<\/ul>\n<p>Auch das Erstellen der Daten mit Fremdschl&uuml;sselfeldern &auml;ndert sich geringf&uuml;gig. Hier m&uuml;ssen ebenfalls entsprechende Mapping-Eintr&auml;ge vorgenommen werden. Au&szlig;erdem &auml;ndert sich nat&uuml;rlich der Zugriff auf die Mapping-Informationen, die sich nun nicht mehr im Feld <b>PKAlt <\/b>der jeweiligen Tabellen befinden.<\/p>\n<p>Stattdessen greift die Prozedur mit entsprechenden Lookup-Anweisungen auf die Mapping-Tabelle <b>tblPKAltUndNeu <\/b>zu (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-32-anchor\">Listing 4<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 5: Durchf&uuml;hren des Abgleichs im Rahmen einer Transaktion<\/p>\n<pre>Public Sub DatenZusammenfuehren_KategorienLieferantenArtikel_MitTransaktion()\r\n    Dim wrk As DAO.Workspace\r\n    Dim db As DAO.Database\r\n    Dim rstQuelle As DAO.Recordset\r\n    Dim rstZiel As DAO.Recordset\r\n    Dim lngZielID As Long\r\n    Dim strMeldung As String\r\n    Dim rstAenderungen As DAO.Recordset\r\n    Set wrk = DBEngine(0)\r\n    Set db = wrk.Databases(0)\r\n    wrk.BeginTrans\r\n    ''Durchf&uuml;hrung des Abgleichs mit kleinen Detail&auml;nderungen - hier Ersatz von DLookup durch FLookup:\r\n            rstZiel!LieferantID = FLookup(&quot;PKNeu&quot;, &quot;tblPKAltUndNeu&quot;, _\r\n                &quot;PKFeld = ''tblLieferanten.LieferantID'' AND PKAlt = &quot; &amp; rstQuelle!LieferantID)\r\n            rstZiel!KategorieID = FLookup(&quot;PKNeu&quot;, &quot;tblPKAltUndNeu&quot;, _\r\n                &quot;PKFeld = ''tblKategorien.KategorieID'' AND PKAlt =  &quot; &amp; rstQuelle!KategorieID)\r\n    Set rstAenderungen = db.OpenRecordset(&quot;qryPKAltUndNeu&quot;, dbOpenDynaset)\r\n    Do While Not rstAenderungen.EOF\r\n        strMeldung = strMeldung &amp; &quot; &quot; &amp; Left(rstAenderungen!PKFeld, _\r\n            InStr(1, rstAenderungen!PKFeld, &quot;.&quot;) - 1) &amp; &quot; &quot; &amp; rstAenderungen!Alt &amp; vbCrLf\r\n        rstAenderungen.MoveNext\r\n    Loop\r\n    If MsgBox(&quot;&auml;nderungen durchf&uuml;hren&quot; &amp; vbCrLf &amp; strMeldung, vbYesNo) = vbYes Then\r\n        wrk.CommitTrans\r\n    Else\r\n        wrk.Rollback\r\n    End If\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p><b>&auml;nderungen erst pr&uuml;fen<\/b><\/p>\n<p>Die Programmierung eines solchen Imports kann mitunter einige Experimente erfordern. Dabei speichern Sie nat&uuml;rlich immer wieder Daten aus der Quelldatenbank in der Zieldatenbank, die Sie vor dem n&auml;chsten Versuch wieder entfernen m&uuml;ssen.<\/p>\n<p>Um dies zu erledigen, gibt es zwei Varianten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie merken sich, welcher der gr&ouml;&szlig;te Prim&auml;rschl&uuml;sselwert der bestehenden Datens&auml;tze der Zieltabelle waren und l&ouml;schen mit ein paar <b>DELETE<\/b>-Anweisungen jeweils die Datens&auml;tze, deren Prim&auml;rschl&uuml;sselwert gr&ouml;&szlig;er ist. Dies hat einen Nachteil: Wenn Sie den Import einmal erweitern, um bereits vorhandene Datens&auml;tze auch mit den neuen Datens&auml;tzen abzugleichen (beispielsweise um die Adresse eines Kunden aus dem bestehenden Datensatz zu behalten, aber die Telefonnummer aus dem Quelldatensatz zu entnehmen), k&ouml;nnen Sie die Datenbasis nicht so einfach wieder herstellen.<\/li>\n<li class=\"aufz-hlung\">F&uuml;r diesen Fall hilft Variante II: Hier starten Sie vor dem Abgleich eine Transaktion. Dabei werden alle &auml;nderungen am Datenbestand erst durchgef&uuml;hrt, wenn die Transaktion &#8222;committed&#8220; wird. Sie k&ouml;nnen dann etwa anhand der in der Tabelle <b>tblPKAltUndNeu <\/b>gespeicherten Daten ermitteln, wie viele Datens&auml;tze pro Tabelle zu den bestehenden Datens&auml;tzen hinzugef&uuml;gt werden, und diese Information in einem Meldungsfenster anzeigen. Stimmen die Werte mit den erwarteten Daten &uuml;berein, k&ouml;nnen Sie die Transaktion per Klick auf die entsprechende Schaltfl&auml;che durchf&uuml;hren.<\/li>\n<\/ul>\n<p>Eine solche Meldung sieht etwa wie in Bild 4<\/a><\/span> aus. Die notwendigen &auml;nderungen an der bestehenden Prozedur finden Sie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-36-anchor\">Listing 5. Wichtig sind hier vor allem die Erstellung einer <b>Workspace<\/b>-Instanz, in deren Rahmen die Transaktion durchgef&uuml;hrt werden soll.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Datenmerge-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Meldung zur Anzeige der geplanten Daten&auml;nderungen<\/span><\/b><\/p>\n<p>Alle Aktionen, die im Kontext dieser Transaktion erfolgen, k&ouml;nnen Sie mit der <b>Rollback<\/b>-Methode r&uuml;ckg&auml;ngig machen. Mit <b>CommitTrans <\/b>hingegen f&uuml;hren Sie die &auml;nderungen endg&uuml;ltig durch.<\/p>\n<p>Wichtig ist auch, dass Sie nicht per <b>DLookup <\/b>oder anderweitig auf Tabellen zugreifen k&ouml;nnen, die w&auml;hrend der Transaktion ge&auml;ndert wurden. Stattdessen verwenden Sie die auf DAO basierende, aber gleich arbeitende Funktion <b>FLookup<\/b>.<\/p>\n<p><b>Datens&auml;tze abgleichen<\/b><\/p>\n<p>Wenn es &ouml;fter vorkommt, dass Sie verschiedene Versionen des gleichen Datensatzes zusammenf&uuml;hren, wie es manchmal bei Adressdaten der Fall ist, kann ein Formular zum Abgleichen der Daten hilfreich sein.<\/p>\n<p>Ein solches Formular stellen wir im Beitrag <b>Datens&auml;tze abgleichen per Formular <\/b>vor (<b>www.access-im-unternehmen.de\/805<\/b>). <\/p>\n<p>Mit diesem Formular k&ouml;nnen Sie zwei Datens&auml;tze gegen&uuml;berstellen und die Daten der einzelnen Felder mischen, also den Inhalt eines jeden Feldes aus einem der beiden Datens&auml;tze ausw&auml;hlen.<\/p>\n<p>Das Formular in Aktion sehen Sie in Bild 5, ein Beispiel f&uuml;r die Integration dieses Formulars in die hier vorgestellten Beispiele finden Sie im Modul <b>mdlDatenZusammenfuehren <\/b>unter <b>DatenZusammenfuehren_Lieferanten_MitAbgleich<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/Datenmerge-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Daten per Formular vermischen<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die hier vorgestellten Techniken k&ouml;nnen Sie zum Zusammenf&uuml;hren von Daten aus verschiedenen Datenbanken verwenden. Damit ist es m&ouml;glich, auch die Daten aus verkn&uuml;pften Tabellen so von einer in die andere Datenbank zu &uuml;bertragen, dass die Verkn&uuml;pfungen auch nach dem Import noch g&uuml;ltig sind.<\/p>\n<p>Selbst wenn Datens&auml;tze entsprechend bestimmter Kriterien bereits vorhanden sind, funktioniert das Importieren: Die Datens&auml;tze der Zieltabelle werden dabei beibehalten und eventuelle Verkn&uuml;pfungsfelder auf die neuen Masterdatens&auml;tze &#8222;umgebogen&#8220;.<\/p>\n<p>Mit der im Beitrag <b>Datens&auml;tze abgleichen per Formular <\/b>vorgestellten L&ouml;sung f&uuml;hren Sie &auml;hnliche Datens&auml;tze zusammen.<\/p>\n<p>Schlie&szlig;lich d&uuml;rfte die L&ouml;sung aus dem Beitrag <b>Der Merge-Assistent <\/b>Sie interessieren (<b>www.access-im-unternehmen.de\/810<\/b>): Mit dem dort vorgestellten Assistenten k&ouml;nnen Sie Vorg&auml;nge wie den hier erl&auml;uterten Datenabgleich ganz einfach per Assistent erledigen.<\/p>\n<p><a id=\"anker-27-anchor\" name=\"anker-27-anchor\" \/><\/p>\n<p><a id=\"anker-29-anchor\" name=\"anker-29-anchor\" \/><\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p class=\"listingueberschrift\">Listing 3: Zusammenf&uuml;hren der beiden Tabellen tblKategorien und tblKategorien1 mit Mapping-Tabelle<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre>Public Sub DatenZusammenfuehren_KategorienLieferantenArtikel_OhnePKAlt()\r\n    ''...\r\n    db.Execute &quot;DELETE FROM tblPKAltUndNeu&quot;, dbFailOnError\r\n    Do While Not rstQuelle.EOF\r\n        lngZielID = Nz(DLookup(&quot;KategorieID&quot;, &quot;tblKategorien&quot;, &quot;Kategoriename = ''&quot; \r\n             &amp; rstQuelle!Kategoriename &amp; &quot;''&quot;))\r\n        If lngZielID = 0 Then\r\n            rstZiel.AddNew\r\n            rstZiel!Kategoriename = rstQuelle!Kategoriename\r\n            rstZiel!Beschreibung = rstQuelle!Beschreibung\r\n            rstZiel!Abbildung = rstQuelle!Abbildung\r\n            lngZielID = rstZiel!KategorieID\r\n            rstZiel.Update\r\n        End If\r\n        db.Execute &quot;INSERT INTO tblPKAltUndNeu(PKFeld, PKAlt, PKNeu) VALUES(''tblKategorien.&quot; _\r\n            &amp; &quot;KategorieID'', &quot; &amp; rstQuelle!KategorieID &amp; &quot;, &quot; &amp; lngZielID &amp; &quot;)&quot;, dbFailOnError\r\n        rstQuelle.MoveNext\r\n    Loop\r\n    ''...<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DatenZusammenfuehren.mdb<\/p>\n<p>Friseurbedarf.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{0DF10E48-AC27-44F8-B364-249E61E617C1}\/aiu_803.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Haben Sie auch Kunden, die Ihre Daten in mehreren Datenbanken und\/oder Tabellen halten und diese gern zusammenf&uuml;hren m&ouml;chten Oder kommt das vielleicht sogar bei Ihnen selbst vor Das ist kein Grund zum Sch&auml;men: Auch dem Autor dieser Zeilen passiert so etwas. Das ist aber nicht schlimm, wenn man wei&szlig;, wie man die Daten zuverl&auml;ssig in einer einzigen Datenbankanwendung zusammenf&uuml;hrt. Im konkreten Fall geht es um zwei Kundendatenbanken f&uuml;r verschiedene Produkte, die vereinigt werden sollten.<\/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":[662011,66062011,44000021],"tags":[],"class_list":["post-55000803","post","type-post","status-publish","format-standard","hentry","category-662011","category-66062011","category-Tabellen_und_Datenmodellierung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Daten zusammenf&uuml;hren - 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\/Daten_zusammenfuehren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Daten zusammenf&uuml;hren\" \/>\n<meta property=\"og:description\" content=\"Haben Sie auch Kunden, die Ihre Daten in mehreren Datenbanken und\/oder Tabellen halten und diese gern zusammenf&uuml;hren m&ouml;chten Oder kommt das vielleicht sogar bei Ihnen selbst vor Das ist kein Grund zum Sch&auml;men: Auch dem Autor dieser Zeilen passiert so etwas. Das ist aber nicht schlimm, wenn man wei&szlig;, wie man die Daten zuverl&auml;ssig in einer einzigen Datenbankanwendung zusammenf&uuml;hrt. Im konkreten Fall geht es um zwei Kundendatenbanken f&uuml;r verschiedene Produkte, die vereinigt werden sollten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:58:45+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/d8a44867c7114dac9f2283311e458e29\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Daten zusammenf&uuml;hren\",\"datePublished\":\"2020-05-22T21:58:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/\"},\"wordCount\":2958,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/d8a44867c7114dac9f2283311e458e29\",\"articleSection\":[\"2011\",\"6\\\/2011\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/\",\"name\":\"Daten zusammenf&uuml;hren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/d8a44867c7114dac9f2283311e458e29\",\"datePublished\":\"2020-05-22T21:58:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/d8a44867c7114dac9f2283311e458e29\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/d8a44867c7114dac9f2283311e458e29\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_zusammenfuehren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Daten zusammenf&uuml;hren\"}]},{\"@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":"Daten zusammenf&uuml;hren - 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\/Daten_zusammenfuehren\/","og_locale":"de_DE","og_type":"article","og_title":"Daten zusammenf&uuml;hren","og_description":"Haben Sie auch Kunden, die Ihre Daten in mehreren Datenbanken und\/oder Tabellen halten und diese gern zusammenf&uuml;hren m&ouml;chten Oder kommt das vielleicht sogar bei Ihnen selbst vor Das ist kein Grund zum Sch&auml;men: Auch dem Autor dieser Zeilen passiert so etwas. Das ist aber nicht schlimm, wenn man wei&szlig;, wie man die Daten zuverl&auml;ssig in einer einzigen Datenbankanwendung zusammenf&uuml;hrt. Im konkreten Fall geht es um zwei Kundendatenbanken f&uuml;r verschiedene Produkte, die vereinigt werden sollten.","og_url":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:58:45+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/d8a44867c7114dac9f2283311e458e29","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Daten zusammenf&uuml;hren","datePublished":"2020-05-22T21:58:45+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/"},"wordCount":2958,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/d8a44867c7114dac9f2283311e458e29","articleSection":["2011","6\/2011","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/","url":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/","name":"Daten zusammenf&uuml;hren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/d8a44867c7114dac9f2283311e458e29","datePublished":"2020-05-22T21:58:45+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/d8a44867c7114dac9f2283311e458e29","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/d8a44867c7114dac9f2283311e458e29"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Daten_zusammenfuehren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Daten zusammenf&uuml;hren"}]},{"@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\/55000803","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=55000803"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000803\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}