{"id":55000979,"date":"2015-04-01T00:00:00","date_gmt":"2020-05-22T21:07:59","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=979"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Adressen_abgleichen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/","title":{"rendered":"Adressen abgleichen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/461a51dc138646b9b161d08e5930043d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Schon seit einer Weile dr&uuml;cke ich mich um dieses Thema herum: Beim Import der Adressen aus meinem Onlineshop in meine Kundendatenbank treten manchmal Fehler auf, die dazu f&uuml;hren, dass die Daten nicht konsistent sind. Au&szlig;erdem h&auml;tte ich gern grunds&auml;tzlich eine Funktion, welche die Shopdaten mit der Kundendatenbank abgleicht &#8211; immerhin k&ouml;nnen Kunden dort ihre Daten &auml;ndern, ohne dass man es mitbekommt. In diesem Beitrag werfe ich nun einen genaueren Blick auf die M&ouml;glichkeiten zum Auffinden und Abgleichen inkonsistenter Adressdaten.<\/b><\/p>\n<p>Die Grundlage f&uuml;r diesen Beitrag sind zwei Datenquellen mit Adressdaten, die eigentlich immer den gleichen Bestand aufweisen sollten. Noch besser w&auml;re es nat&uuml;rlich, den Datenbestand nur an einem Ort zu pflegen, aber dies ist aus verschiedenen Gr&uuml;nden nicht m&ouml;glich.<\/p>\n<p>Im Onlineshop m&uuml;ssen die Daten vorliegen, damit der Benutzer darauf zugreifen kann, um die Daten zu &auml;ndern oder Aktionen mit seinem Benutzerkonto durchzuf&uuml;hren &#8211; beispielsweise das Ausl&ouml;sen neuer Bestellungen oder, im Falle meines Shops, das Abrufen von Downloads zu seinen Produkten.<\/p>\n<p>Andererseits erfolgen die nach der Bestellung durchgef&uuml;hrten Schritte auf Basis der Daten einer Access-Datenbank, in die ich die Kundendaten und Bestelldaten einlese &#8211; also beispielsweise der Versand der Bestellung oder die Zusammenstellung der Rechnungslisten f&uuml;r die Buchhaltung.<\/p>\n<p>Ich bin sicher, dass Ihre Kunden noch viel interessantere Gr&uuml;nde finden, die Daten nicht nur an einem Ort zu pflegen &#8211; geben wir also auf und programmieren einfach eine sch&ouml;ne L&ouml;sung zum Abgleichen der Adressdaten aus zwei verschiedenen Quellen.<\/p>\n<p><b>Voraussetzung: Feld-zu-Feld-Zuordnung<\/b><\/p>\n<p>Eine Grundlage f&uuml;r die Ermittlung von Inkonsistenzen ist, dass die Felder der Datenquelle, in diesem Fall also der Datenbank des Onlineshops, sich den Feldern des Ziels f&uuml;r die Daten, also der Kundendatenbank, zuweisen lassen. Die Daten m&uuml;ssen nicht auf beiden Seiten genau gleich strukturiert sein und d&uuml;rfen durchaus auf verschiedene Tabellen aufgeteilt sein. Sie m&uuml;ssen sich aber durch geschickte Formulierung von Abfragen so umwandeln lassen, dass die Daten sich in einer gleichen Struktur darstellen lassen.<\/p>\n<p><b>Voraussetzung: Zuordnung per Schl&uuml;ssel<\/b><\/p>\n<p>Die zweite Grundlage ist, dass die Datens&auml;tze bereits einander zugeordnet sind. In diesem Fall handhabe ich es so, dass ich einen neuen Kundendatensatz aus dem Onlineshop in die Kundendatenbank &uuml;bertrage und dabei ein Feld etwa namens <b>Kundennummer-ImShop <\/b>verwende, um diesen Kundendatensatz dem entsprechenden Kundendatensatz des Shops zuzuweisen.<\/p>\n<p>Auf diese Weise l&auml;sst sich auch leicht pr&uuml;fen, ob ein Kundendatensatz aus dem Shop &uuml;berhaupt schon in die lokale Kundendatenbank eingelesen wurde &#8211; liegt dort noch kein Datensatz vor, dessen Feld <b>KundennummerInShop <\/b>die Kundennummer aus dem Shop aufweist, handelt es sich offensichtlich um einen neuen Kunden, der erst noch angelegt werden muss.<\/p>\n<p><b>Flexible Zuordnung<\/b><\/p>\n<p>Wie immer m&ouml;chten wir eine m&ouml;glichst flexible und anpassbare L&ouml;sung programmieren. Das hei&szlig;t, dass wir zun&auml;chst die beiden Tabellen oder Abfragen ausw&auml;hlen k&ouml;nnen wollen, welche die Daten aus dem Shop und aus der Kundendatenbank liefern. Dann wollen wir alle Felder, die auf Unterschiede gepr&uuml;ft werden sollen, festlegen und einander zuordnen k&ouml;nnen. Das hei&szlig;t, dass wir f&uuml;r jedes Feld der Shopdatenbank, das wir abgleichen wollen, das entsprechende Feld der Kundendatenbank festlegen m&uuml;ssen.<\/p>\n<p>Um &uuml;berhaupt einen Datensatz der Kundendatenbank einem Datensatz der Shopdatenbank zuordnen zu k&ouml;nnen, m&uuml;ssen wir nat&uuml;rlich auch noch das Prim&auml;rschl&uuml;sselfeld der Tabelle aus der Shopdatenbank und das entsprechende Verkn&uuml;pfungsfeld (bisher <b>KundennummerImShop <\/b>genannt) ausw&auml;hlen.<\/p>\n<p>Dies ist nur die Konfiguration, die wir in Tabellen speichern wollen, damit Sie diese jederzeit anpassen k&ouml;nnen. Au&szlig;erdem ben&ouml;tigen wir nat&uuml;rlich eine entsprechende Benutzeroberfl&auml;che, damit Sie die Informationen f&uuml;r den Abgleich leicht ausw&auml;hlen k&ouml;nnen. Dies ist jedoch der leichtere Teil dieser L&ouml;sung.<\/p>\n<p>Die Optionen stellen Sie mit dem Formular <b>frmAbgleichoptionen<\/b>. Dieses sieht wie in Bild 1 aus und bietet ganz oben zun&auml;chst zwei Kombinationsfelder, mit denen Sie die Originaltabelle ausw&auml;hlen und die abzugleichende Tabelle.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_979_002.png\" alt=\"Einstellen der Optionen\" width=\"650\" height=\"396,3649\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einstellen der Optionen<\/span><\/b><\/p>\n<p>Direkt darunter finden Sie ein Kombinationsfeld zum Ausw&auml;hlen des Prim&auml;rschl&uuml;sselfeldes der Originaltabelle. F&uuml;r die abzugleichende Tabelle w&auml;hlen Sie ebenfalls ein Feld aus, und zwar das, &uuml;ber das die Tabelle mit der Originaltabelle verkn&uuml;pft ist.<\/p>\n<p>In diesem Beispiel haben wir einfach eine Kundentabelle namens <b>tblKunden_Original <\/b>mit ein paar Feldern und einigen Beispieldatens&auml;tzen erstellt und eine Kopie dieser Tabelle namens <b>tblKunden <\/b>angelegt &#8211; gef&uuml;llt mit den gleichen Daten. Dann haben wir einige Datens&auml;tze einer der beiden Tabellen ge&auml;ndert.<\/p>\n<p>Wir haben der Tabelle <b>tblKunden <\/b>also kein spezielles Feld hinzugef&uuml;gt, mit dem ein Datensatz dem entsprechenden Datensatz der Tabelle <b>tblKunden_Original <\/b>zugeordnet werden kann &#8211; dies ist in diesem Fall nicht n&ouml;tig, da diese ja die gleichen Prim&auml;rschl&uuml;sselwerte wie die Originaltabelle enth&auml;lt. Dies ist also auch eine Konfigurationsvariante &#8211; Sie k&ouml;nnen so zwei Versionen einer Tabelle miteinander vergleichen.<\/p>\n<p>Hier w&auml;hlen Sie also f&uuml;r beide Tabellen das Feld <b>KundeID <\/b>f&uuml;r den Abgleich aus. Danach m&uuml;ssen Sie festlegen, welche Felder verglichen und auch angezeigt werden sollen. Dies erledigen Sie mit dem Unterformular darunter, wo jeder Datensatz jeweils ein Feld der ersten Tabelle und das abzugleichende Feld der zweiten Tabelle aufnimmt.<\/p>\n<p>Wenn Sie die Tabellen oder Abfragen so gestaltet haben, dass die Feldnamen &uuml;bereinstimmen, k&ouml;nnen Sie mit einem Klick auf die Schaltfl&auml;che <b>Automatisch erkennen <\/b>eine Menge Zeit sparen &#8211; die dahinter liegende Prozedur weist identische Feldnamen dann einfach einander zu. Das Ergebnis sieht dann schlie&szlig;lich wie in der Abbildung aus.<\/p>\n<p><b>Daten abgleichen<\/b><\/p>\n<p>Der kompliziertere Teil ist der eigentliche Abgleich der Daten. Dabei soll ein Formular in einem Listenfeld alle Datens&auml;tze der abzugleichenden Tabelle anzeigen, die nicht  genau mit den Daten aus der Originaltabelle &uuml;bereinstimmen.<\/p>\n<p>Klickt der Benutzer nun auf einen dieser Datens&auml;tze, sollen die Daten aus der Originaltabelle und die aus der abzugleichenden Tabelle im unteren Bereich des Formulars nebeneinander angezeigt werden. Die Felder mit unterschiedlichen Inhalten sollen dabei auf irgendeine Weise hervorgehoben werden &#8211; beispielsweise durch eine entsprechende Hintergrundfarbe. Der Benutzer soll nun drei Optionen haben:<\/p>\n<ul>\n<li>&uuml;bernahme der Daten aus der Originaltabelle in die abzugleichende Tabelle (zum Beispiel erforderlich, wenn der Kunde eines Onlineshops die Daten in seinem Kundenbereich ge&auml;ndert hat und diese in die lokale Kundendatenbank &uuml;bertragen werden sollen)<\/li>\n<li>&uuml;bernahme der Daten aus der abzugleichenden Tabelle in die Originaltabelle (hilfreich, wenn der Kunde etwa angerufen hat, um eine Adress&auml;nderung mitzuteilen und diese in der lokalen Kundendatenbank vorgenommen wurde)<\/li>\n<li>&uuml;bernahme des Inhalts eines oder mehrerer Felder von der Originaltabelle in die abzugleichende Tabelle oder umgekehrt, bis die Daten aus beiden Datenbanken &uuml;bereinstimmen<\/li>\n<\/ul>\n<p>Das Formular sieht nun etwa wie in Bild 2 aus. Hier sehen Sie im oberen Listenfeld bereits die Datens&auml;tze der Tabelle <b>tblKunden<\/b>, die sich vom zugeordneten Datensatz aus der Tabelle <b>tblKunden_Original <\/b>unterscheiden. Klicken Sie einen der Eintr&auml;ge im Listenfeld an, zeigt der untere Bereich die Felder beider Datens&auml;tze nebeneinander an. Dabei werden die Felder, die sich unterscheiden, farbig hervorgehoben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_979_001.png\" alt=\"Formular zum Abgleichen der Unterschiede zwischen zwei Datens&auml;tzen aus verschiedenen Tabellen\" width=\"700\" height=\"392,2742\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Formular zum Abgleichen der Unterschiede zwischen zwei Datens&auml;tzen aus verschiedenen Tabellen<\/span><\/b><\/p>\n<p>Danach k&ouml;nnen Sie aktiv werden:<\/p>\n<ul>\n<li>Ein Klick auf die linke Schaltfl&auml;che <b>Alle abgleichen <\/b>&uuml;bertr&auml;gt alle Werte des linken Unterformulars in das rechte.<\/li>\n<li>Ein Klick auf die rechte Schaltfl&auml;che <b>Alle abgleichen <\/b>&uuml;bernimmt die Werte aus dem rechten Unterformular.<\/li>\n<li>Ein Doppelklick auf einen der grau markierten Eintr&auml;ge f&uuml;gt diesen Wert in das entsprechende Feld auf der anderen Seite ein.<\/li>\n<\/ul>\n<p>Damit k&ouml;nnen Sie alle gew&uuml;nschten &auml;nderungen vornehmen, um die Datens&auml;tze anzugleichen.<\/p>\n<p>Dies gelingt nat&uuml;rlich nicht, wenn Sie beispielsweise als Originaltabelle auf der linken Seite eine Abfrage verwenden, die auf komplizierte Weise die Tabellen eines Shopsystems abbildet und dadurch nicht aktualisierbar ist &#8211; in diesem Fall gelingt die Anpassung nur in Richtung der im rechten Bereich dargestellten Daten.<\/p>\n<p><b>Formularaufbau<\/b><\/p>\n<p>Die Gestaltung des Formulars ist so interessant, weil es eigentlich kein Steuerelement gibt, mit dem man so einfach zwei Datens&auml;tze nebeneinander anzeigen kann.<\/p>\n<p><!--30percent--><\/p>\n<p>Wir k&ouml;nnten zwar vielleicht zwei Unterformulare verwenden, allerdings sollten diese auch nicht allzu hoch sein: Wenn Sie dann n&auml;mlich den Inhalt des einen Unterformulars nach oben scrollen, um den unteren Bereich zu sehen, bleibt das andere stehen und zeigt die Daten nicht passend zum anderen Unterformular an.<\/p>\n<p>Also machen wir es so: Wir legen zwei Unterformulare, die hoch genug sind, in einem weiteren Unterformular an, das wir wiederum nach oben und nach unten scrollen k&ouml;nnen. Diesen beiden Unterformularen weisen wir einige Textfelder zu, die wir allerdings nicht mit einem festen Steuerelementinhalt versehen, da wir die f&uuml;r den Abgleich zu verwendenden Felder ja gegebenenfalls flexibel anpassen wollen.<\/p>\n<p>Um genau zu sein, brauchen wir sogar nur ein Unterformular anzuzeigen, dass wir dann zweimal in das &uuml;bergeordnete Unterformular einf&uuml;gen und mit verschiedenen Datenherk&uuml;nften versehen.<\/p>\n<p><b>Unterformular f&uuml;r die Felder erstellen<\/b><\/p>\n<p>Das Unterformular f&uuml;r die Felder soll <b>sfmAbgleichfelder <\/b>hei&szlig;en und 20 Textfelder enthalten. Diese benennen wir mit dem Pr&auml;fix <b>txt <\/b>und einer laufenden Nummer im zweistelligen Format (also <b>txt01 <\/b>bis <b>txt20<\/b>). Platzieren Sie die Textfelder wie in Bild 3 so, dass diese mit den R&auml;ndern des Formulars abschlie&szlig;en. Sie sollen lediglich ein Pixel Abstand vom linken Rand des Formulars erhalten, damit der linke Rand der Textfelder nicht verdeckt wird.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_979_003.png\" alt=\"Unterformular zur Darstellung der Feldinhalte eines Datensatzes\" width=\"420\" height=\"410,4546\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Unterformular zur Darstellung der Feldinhalte eines Datensatzes<\/span><\/b><\/p>\n<p>Die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Trennlinien <\/b>stellen wir auf <b>Nein <\/b>ein.<\/p>\n<p><b>Unterformular f&uuml;r die beiden Unterformulare erstellen<\/b><\/p>\n<p>Nun erstellen wir das Unterformular namens <b>sfmAbgleich<\/b>, das zwei Exemplare des soeben erstellten Unterformulars <b>sfmAbgleichfelder <\/b>aufnimmt.<\/p>\n<p>F&uuml;gen Sie diesem zweimal das Unterformular hinzu und benennen Sie die Unterformularsteuerelemente <b>sfmAbgleich1 <\/b>und <b>sfmAbgleich2<\/b>. Stellen Sie die Eigenschaft <b>Rahmenart <\/b>beider Unterformularsteuerelemente auf den Wert <b>Transparent <\/b>ein.<\/p>\n<p>Legen Sie f&uuml;r die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Trennlinien <\/b>auch hier den Wert <b>Nein <\/b>fest.<\/p>\n<p>F&uuml;gen Sie dann links die Beschriftungsfelder wie in Bild 4 hinzu. Beim Ausrichten m&uuml;ssen Sie ein wenig experimentieren, denn die Felder in den Unterformularen werden etwas anders positioniert als es in der Entwurfsansicht zu erkennen ist. Schlie&szlig;lich f&uuml;gen Sie noch die beiden Schaltfl&auml;chen <b>cmdAlleAbgleichen1 <\/b>und <b>cmdAlleAbgleichen2 <\/b>hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_979_004.png\" alt=\"Unterformular, das die Beschriftungen und die beiden Unterformulare mit den Feldern der zu vergleichenden Tabellen enth&auml;lt\" width=\"700\" height=\"458,5444\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Unterformular, das die Beschriftungen und die beiden Unterformulare mit den Feldern der zu vergleichenden Tabellen enth&auml;lt<\/span><\/b><\/p>\n<p>Im letzten Schritt legen Sie das Hauptformular an, dem Sie im Kopf ein Listenfeld namens <b>lstDatensaetze<\/b> hinzuf&uuml;gen. Darunter positionieren Sie das Unterformular <b>sfmAbgleich<\/b>.<\/p>\n<p>Danach folgt der wirklich interessante Stoff &#8211; die Programmierung des Formulars.<\/p>\n<p><b>Formular f&uuml;llen<\/b><\/p>\n<p>Die Prozedur, die durch das Ereignis <b>Beim Laden <\/b>des Hauptformulars <b>frmAbgleichen<\/b> ausgel&ouml;st wird, sieht wie in Listing 1 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strTabelleQuelle = DLookup(\"AbgleichQuelltabelle\", \"tblAbgleichOptionen\")\r\n     strTabelleZiel = DLookup(\"AbgleichZieltabelle\", \"tblAbgleichOptionen\")\r\n     strAbgleichfeldQuelle = DLookup(\"AbgleichfeldQuelltabelle\", \"tblAbgleichOptionen\")\r\n     strAbgleichfeldZiel = DLookup(\"AbgleichfeldZieltabelle\", \"tblAbgleichOptionen\")\r\n     <span style=\"color:blue;\">Set<\/span> rstAbgleichfelder = db.OpenRecordset(\"SELECT * FROM tblAbgleichfelder\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstZiel = db.OpenRecordset(\"SELECT * FROM \" & strTabelleZiel & \" WHERE 1 = 2\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstAbgleichfelder.EOF\r\n         strSQL = strSQL & \", \" & strTabelleZiel & \".\" & rstAbgleichfelder!AbgleichfeldZiel\r\n         strUnterschiede = strUnterschiede & \" * CInt(nz(\" & strTabelleQuelle & \".\" _\r\n             & rstAbgleichfelder!AbgleichfeldQuelle & \") = nz(\" & strTabelleZiel & \".\" _\r\n             & rstAbgleichfelder!AbgleichfeldZiel & \"))\"\r\n         rstAbgleichfelder.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     strUnterschiede = <span style=\"color:blue;\">Mid<\/span>(strUnterschiede, 3)\r\n     strSQL = <span style=\"color:blue;\">Mid<\/span>(strSQL, 3)\r\n     strSQL = \"SELECT \" & strTabelleZiel & \".\" & strAbgleichfeldZiel & \" AS Verkn&uuml;pfungsfeld, \" & strSQL & \" FROM \" _\r\n         & strTabelleQuelle & \", \" & strTabelleZiel & \" WHERE \" & strTabelleZiel & \".\" & strAbgleichfeldZiel & \" = \" _\r\n         & strTabelleQuelle & \".\" & strAbgleichfeldQuelle & \" AND \" & strUnterschiede & \" = 0\"\r\n     Me!lstDatensaetze.RowSource = strSQL\r\n     UnterformularBestuecken rstAbgleichfelder, strTabelleQuelle, strTabelleZiel\r\n     Unterformularereignisse\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!lstDatensaetze)<span style=\"color:blue;\"> Then<\/span>\r\n         lstDatensaetze_AfterUpdate\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: F&uuml;llen der Formulardaten beim Laden des Formulars<\/span><\/b><\/p>\n<p>Die Prozedur liest zun&auml;chst die Konfigurationsdaten aus der Tabelle <b>tblAbgleichOptionen <\/b>ein. Dann erstellt sie ein neues Recordset auf Basis der Tabelle <b>tblAbgleichfelder<\/b>, die ja die im Konfigurationsformular festgelegten Felder enth&auml;lt. Dieses Recordset durchl&auml;uft die Prozedur dann in einer <b>Do While<\/b>-Schleife und stellt dort folgende Zeichenketten zusammen:<\/p>\n<ul>\n<li><b>strSQL <\/b>nimmt schlicht die Feldliste auf, also etwa <b>tblKunde.Vorname, tblKunde.Nachname, &#8230;<\/b><\/li>\n<li><b>strUnterschiede<\/b> stellt ein Kriterium zusammen, das jeweils den Inhalt zweier Felder vergleicht und die Ergebnisse miteinander multipliziert, also beispielsweise <b>(tbl1.Anrede = tbl2.Anrede) * (tbl1.Vorname = tbl2.Vorname)<\/b>. Wenn die verglichenen Werte nicht &uuml;bereinstimmen, ergibt der Ausdruck in den Klammern den Wert <b>-1<\/b>, sonst den Wert <b>0<\/b>. Leicht auszurechnen, dass das Produkt der einzelnen Ausdr&uuml;cke <b>0 <\/b>wird, sobald auch nur ein Vergleich fehlschl&auml;gt. Und dies wird gleich auch das Kriterium daf&uuml;r, ob das Listenfeld einen Datensatz anzeigt oder nicht &#8211; denn dieses soll ja nur Datens&auml;tze mit Unterschieden anzeigen.<\/li>\n<\/ul>\n<p>Nun stellt die Prozedur die SQL-Anweisung zusammen, die als Datensatzherkunft f&uuml;r das Listenfeld zum Einsatz kommen wird.<\/p>\n<p>Diese besteht aus der <b>Select<\/b>-Anweisung, dem Feld der Zieltabelle, das zum Verkn&uuml;pfen der Datens&auml;tze mit denen der Quelltabelle verwendet wird, und den Feldern, die wir zuvor in einer Liste zusammengestellt haben. Als Kriterium dient zun&auml;chst der Ausdruck, der den Wert <b>0 <\/b>liefert, wenn ein oder mehrere Feldwerte der beiden Tabellen nicht &uuml;bereinstimmen.<\/p>\n<p>Au&szlig;erdem muss aber auch noch der Wert des Verkn&uuml;pfungsfeldes der Zieltabelle mit dem eindeutigen Feld der Quelltabelle &uuml;bereinstimmen. Diese SQL-Anweisung landet schlie&szlig;lich als Datensatzherkunft im Listenfeld, das dann alle Datens&auml;tze mit Unterschieden zwischen den Tabellen auflistet.<\/p>\n<p>Nun folgt der Aufruf der Prozedur <b>UnterformularBe-stuecken<\/b>. Diese verwendet auch wieder das Recordset mit den Abgleichfeldern, au&szlig;erdem &uuml;bergibt die Prozedur ihr den Namen der Quell- und der Zieltabelle.<\/p>\n<p>Danach sorgt eine Prozedur namens <b>Unterformularereignisse<\/b> daf&uuml;r, dass die Textfelder im Unterformular jeweils mit einem Ereignis ausgestattet werden, das durch einen Doppelklick ausgel&ouml;st wird und daf&uuml;r sorgt, dass der Inhalt des angeklickten Feldes im entsprechenden Feld der abzugleichenden Tabelle landet.<\/p>\n<p>Schlie&szlig;lich pr&uuml;ft die Prozedur noch, ob ein Eintrag im Listenfeld markiert ist, und liest den entsprechenden Datensatz in die Unterformulare ein.<\/p>\n<p><b>Unterformular f&uuml;llen<\/b><\/p>\n<p>Die Prozedur <b>UnterformularBestuecken<\/b> aus Listing 2 stellt zun&auml;chst die Datenherkunft der beiden Unterformulare in <b>sfmAbgleich1 <\/b>und <b>sfmAbgleich2 <\/b>auf die in der Optionentabelle gespeicherten Tabellen\/Abfragen ein. Dann durchl&auml;uft sie erneut die Datensatzgruppe mit den zu verwendenden Feldern aus der Tabelle <b>tblAbgleichfelder<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>UnterformularBestuecken(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, strTabelleQuelle<span style=\"color:blue;\"> As String<\/span>, strTabelleZiel<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intAnzahl<span style=\"color:blue;\"> As Integer<\/span>\r\n     Me!sfmAbgleich.Form!sfmAbgleich1.Form.RecordSource = strTabelleQuelle\r\n     Me!sfmAbgleich.Form!sfmAbgleich2.Form.RecordSource = strTabelleZiel\r\n     rst.MoveFirst\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         intAnzahl = intAnzahl + 1\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmAbgleich.Form.Controls(\"lbl\" & Format(rst.AbsolutePosition + 1, \"00\"))\r\n             .Visible = <span style=\"color:blue;\">True<\/span>\r\n             .Caption = rst!AbgleichfeldZiel & \":\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmAbgleich.Form!sfmAbgleich1.Form.Controls(\"txt\" & Format(rst.AbsolutePosition + 1, \"00\"))\r\n             .Visible = <span style=\"color:blue;\">True<\/span>\r\n             .ControlSource = rst!AbgleichfeldQuelle\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmAbgleich.Form!sfmAbgleich2.Form.Controls(\"txt\" & Format(rst.AbsolutePosition + 1, \"00\"))\r\n             .Visible = <span style=\"color:blue;\">True<\/span>\r\n             .ControlSource = rst!AbgleichfeldZiel\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     For i = intAnzahl + 1 To 20\r\n         Me!sfmAbgleich.Form.Controls(\"lbl\" & Format(i, \"00\")).Visible = <span style=\"color:blue;\">False<\/span>\r\n         Me!sfmAbgleich.Form!sfmAbgleich1.Form.Controls(\"txt\" & Format(i, \"00\")).Visible = <span style=\"color:blue;\">False<\/span>\r\n         Me!sfmAbgleich.Form!sfmAbgleich2.Form.Controls(\"txt\" & Format(i, \"00\")).Visible = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     lstDatensaetze_AfterUpdate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: F&uuml;llen der Unterformulare<\/span><\/b><\/p>\n<p>Dabei tr&auml;gt sie zun&auml;chst den Feldnamen als Beschriftung f&uuml;r die Bezeichnungsfelder links von den beiden Unterformularen ein und blendet diese ein. Dann k&uuml;mmert sie sich um die Textfelder im ersten Unterformular. Auch hier werden die Felder von oben nach unten durchlaufen, eingeblendet und mit dem Feldnamen als Steuerelementinhalt gef&uuml;llt. Dies erledigt die Prozedur auch noch f&uuml;r die Textfelder im zweiten Unterformular.<\/p>\n<p>Nun wurde die Schleife f&uuml;r jedes anzuzeigende Feld einmal durchlaufen. Dabei hat es die Steuerelementnamen jeweils &uuml;ber das Pr&auml;fix (<b>lbl<\/b>\/<b>txt<\/b>) und den Wert der Eigenschaft <b>AbsolutePosition <\/b>des aktuellen Datensatzes referenziert. Wenn dabei weniger als 20 Felder ben&ouml;tigt werden, durchl&auml;uft die Prozedur sp&auml;ter noch eine <b>For&#8230;Next<\/b>-Schleife vom x. bis zum 20. Steuerelement und blendet das Bezeichnungsfeld sowie die beiden Textfelder aus.<\/p>\n<p><b>Textfeldereignisse einrichten<\/b><\/p>\n<p>Schlie&szlig;lich haben wir eine Klasse namens <b>clsAbgleichtextfeld <\/b>angelegt, welche einen Verweis auf das Textfeld aufnimmt, auf dessen Doppelklick es reagieren soll &#8211; und einen weiteren Verweis auf das Textfeld, dessen Wert auf den Wert des angeklickten Feldes eingestellt werden soll.<\/p>\n<p>Die Prozedur <b>Unterformularereignisse <\/b>erstellt f&uuml;r jedes Textfeld eine solche Klasse und weist den beiden Eigenschaften der Klasse die beiden Textfelder zu, welche die Klasse automatisieren soll. Dies sieht wie in Listing 3 aus. Die Prozedur durchl&auml;uft eine &auml;u&szlig;ere Schleife zweimal (f&uuml;r das linke und das rechte Unterformular) und die innere 20 Mal, also f&uuml;r die maximal m&ouml;gliche Anzahl Felder. Dabei erstellt sie eine neue Instanz der Klasse und weist die beiden beteiligten Textfelder zu. Damit die Instanzen der Klasse nach dem Beenden der Prozedur nicht im Nirwana verschwinden, speichert die Prozedur diese in einer Collection, die wir wie folgt deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Unterformularereignisse()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intForm<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objAbgleichtextfeld<span style=\"color:blue;\"> As <\/span>clsAbgleichtextfeld\r\n     <span style=\"color:blue;\">Set<\/span> col = <span style=\"color:blue;\">New<\/span> Collection\r\n     For intForm = 1 To 2\r\n         For i = 1 To 20\r\n             <span style=\"color:blue;\">Set<\/span> objAbgleichtextfeld = <span style=\"color:blue;\">New<\/span> clsAbgleichtextfeld\r\n             <span style=\"color:blue;\">With<\/span> objAbgleichtextfeld\r\n                 <span style=\"color:blue;\">If <\/span>intForm = 1<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">Set<\/span> .txtQuelle = Me!sfmAbgleich.Form.Controls(\"sfmAbgleich1\").Form.Controls(\"txt\" & Format(i, \"00\"))\r\n                     <span style=\"color:blue;\">Set<\/span> .txtZiel = Me!sfmAbgleich.Form.Controls(\"sfmAbgleich2\").Form.Controls(\"txt\" & Format(i, \"00\"))\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     <span style=\"color:blue;\">Set<\/span> .txtQuelle = Me!sfmAbgleich.Form.Controls(\"sfmAbgleich2\").Form.Controls(\"txt\" & Format(i, \"00\"))\r\n                     <span style=\"color:blue;\">Set<\/span> .txtZiel = Me!sfmAbgleich.Form.Controls(\"sfmAbgleich1\").Form.Controls(\"txt\" & Format(i, \"00\"))\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             End <span style=\"color:blue;\">With<\/span>\r\n             col.Add objAbgleichtextfeld\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">Next<\/span> intForm\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Einrichtung der Unterformularereignisse<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>col<span style=\"color:blue;\"> As <\/span>Collection<\/pre>\n<p>Die Klasse selbst hat zwei lokale Variablen zum Speichern der Textfelder:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_txtQuelle<span style=\"color:blue;\"> As <\/span>TextBox\r\n<span style=\"color:blue;\">Private <\/span>m_txtZiel<span style=\"color:blue;\"> As <\/span>TextBox<\/pre>\n<p>Die folgenden beiden Prozeduren stellen sich nach au&szlig;en als Eigenschaften der Klasse dar und erm&ouml;glichen die Zuweisung der Textfelder:<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>txtQuelle(txt<span style=\"color:blue;\"> As <\/span>TextBox)\r\n     <span style=\"color:blue;\">Set<\/span> m_txtQuelle = txt\r\n     m_txtQuelle.OnDblClick = \"[Event Procedure]\"\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>txtZiel(txt<span style=\"color:blue;\"> As <\/span>TextBox)\r\n     <span style=\"color:blue;\">Set<\/span> m_txtZiel = txt\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die einzige Ereignisprozedur wird beim Doppelklick ausgel&ouml;st. Sie &uuml;bertr&auml;gt den Wert des angeklickten Textfeldes an sein Pendant und hebt die graue Hintergrundfarbe auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_txtQuelle_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     m_txtZiel = m_txtQuelle\r\n     If m_txtQuelle = m_txtZiel Or (IsNull(m_txtQuelle) _\r\n             And IsNull(m_txtZiel)) Then\r\n         m_txtQuelle.BackColor = &HFFFFFF\r\n         m_txtZiel.BackColor = &HFFFFFF\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit dieser L&ouml;sung k&ouml;nnen Sie flexibel die Daten zweier Datenherk&uuml;nfte wie von Tabellen oder Abfragen miteinander vergleichen.<\/p>\n<p>Dabei ist es wichtig, dass die Datens&auml;tze der Tabellen einander zugeordnet werden k&ouml;nnen &#8211; zum Beispiel dadurch, dass es verschiedene Versionen der gleichen Tabelle sind, deren Datens&auml;tze aber die gleichen Prim&auml;rschl&uuml;sselwerte verwenden.<\/p>\n<p>Alternativ k&ouml;nnen Sie auch beispielsweise Daten aus einem Onlineshop, die Sie per ODBC in einer Kundendatenbank verf&uuml;gbar machen, mit den dortigen Kundendaten abgleichen. Voraussetzung w&auml;re hier, dass die Kundendaten beim &uuml;bertragen in die Kundendatenbank eine Referenz auf den Prim&auml;rschl&uuml;sselwert des Originaldatensatzes aus der Onlineshop-Datenbank enthalten.<\/p>\n<p>Mit dem hier vorgestellten Formular k&ouml;nnen Sie die Unterschiede in beide Richtungen entweder in einem Rutsch oder feldweise vornehmen.<\/p>\n<p>Im folgenden Teil erl&auml;utern wir die verbleibenden VBA-Prozeduren des Hauptformulars und gehen auch noch auf das Formular zum Festlegen der Konfiguration ein.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>AdressenAbgleichen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{09735272-3A5B-48CF-9788-83C4BAD6F43E}\/aiu_979.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Schon seit einer Weile dr&uuml;cke ich mich um dieses Thema herum: Beim Import der Adressen aus meinem Onlineshop in meine Kundendatenbank treten manchmal Fehler auf, die dazu f&uuml;hren, dass die Daten nicht konsistent sind. Au&szlig;erdem h&auml;tte ich gern grunds&auml;tzlich eine Funktion, welche die Shopdaten mit der Kundendatenbank abgleicht &#8211; immerhin k&ouml;nnen Kunden dort ihre Daten &auml;ndern, ohne dass man es mitbekommt. In diesem Beitrag werfe ich nun einen genaueren Blick auf die M&ouml;glichkeiten zum Auffinden und Abgleichen inkonsistenter Adressdaten.<\/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":[66022015,662015,44000027],"tags":[],"class_list":["post-55000979","post","type-post","status-publish","format-standard","hentry","category-66022015","category-662015","category-Loesungen"],"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>Adressen abgleichen - 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\/Adressen_abgleichen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adressen abgleichen\" \/>\n<meta property=\"og:description\" content=\"Schon seit einer Weile dr&uuml;cke ich mich um dieses Thema herum: Beim Import der Adressen aus meinem Onlineshop in meine Kundendatenbank treten manchmal Fehler auf, die dazu f&uuml;hren, dass die Daten nicht konsistent sind. Au&szlig;erdem h&auml;tte ich gern grunds&auml;tzlich eine Funktion, welche die Shopdaten mit der Kundendatenbank abgleicht - immerhin k&ouml;nnen Kunden dort ihre Daten &auml;ndern, ohne dass man es mitbekommt. In diesem Beitrag werfe ich nun einen genaueren Blick auf die M&ouml;glichkeiten zum Auffinden und Abgleichen inkonsistenter Adressdaten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:07:59+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/461a51dc138646b9b161d08e5930043d\" \/>\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\\\/Adressen_abgleichen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Adressen abgleichen\",\"datePublished\":\"2020-05-22T21:07:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/\"},\"wordCount\":2879,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/461a51dc138646b9b161d08e5930043d\",\"articleSection\":[\"2\\\/2015\",\"2015\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/\",\"name\":\"Adressen abgleichen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/461a51dc138646b9b161d08e5930043d\",\"datePublished\":\"2020-05-22T21:07:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/461a51dc138646b9b161d08e5930043d\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/461a51dc138646b9b161d08e5930043d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_abgleichen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adressen abgleichen\"}]},{\"@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":"Adressen abgleichen - 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\/Adressen_abgleichen\/","og_locale":"de_DE","og_type":"article","og_title":"Adressen abgleichen","og_description":"Schon seit einer Weile dr&uuml;cke ich mich um dieses Thema herum: Beim Import der Adressen aus meinem Onlineshop in meine Kundendatenbank treten manchmal Fehler auf, die dazu f&uuml;hren, dass die Daten nicht konsistent sind. Au&szlig;erdem h&auml;tte ich gern grunds&auml;tzlich eine Funktion, welche die Shopdaten mit der Kundendatenbank abgleicht - immerhin k&ouml;nnen Kunden dort ihre Daten &auml;ndern, ohne dass man es mitbekommt. In diesem Beitrag werfe ich nun einen genaueren Blick auf die M&ouml;glichkeiten zum Auffinden und Abgleichen inkonsistenter Adressdaten.","og_url":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:07:59+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/461a51dc138646b9b161d08e5930043d","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\/Adressen_abgleichen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Adressen abgleichen","datePublished":"2020-05-22T21:07:59+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/"},"wordCount":2879,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/461a51dc138646b9b161d08e5930043d","articleSection":["2\/2015","2015","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/","url":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/","name":"Adressen abgleichen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/461a51dc138646b9b161d08e5930043d","datePublished":"2020-05-22T21:07:59+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/461a51dc138646b9b161d08e5930043d","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/461a51dc138646b9b161d08e5930043d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Adressen_abgleichen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Adressen abgleichen"}]},{"@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\/55000979","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=55000979"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000979\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}