{"id":55000746,"date":"2010-10-01T00:00:00","date_gmt":"2020-05-22T22:08:04","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=746"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Adressen_pruefen_und_ergaenzen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/","title":{"rendered":"Adressen pr&uuml;fen und erg&auml;nzen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/ab05c975cd9c4d18b14272ebeaf4da74\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Fast jede Datenbankanwendung speichert Adressen in irgendeiner Form &#8211; seien es Kunden-, Mitarbeiter-, Privat- oder Firmenadressen. Diese gelangen &uuml;ber irgendeine Schnittstelle in die Datenbank, beispielsweise &uuml;ber den Import von Daten aus externen Dateien oder auch durch manuelle Eingabe. Aber pr&uuml;fen Sie diese Adressen auch Oder lassen Sie es darauf ankommen, bis die Post einen Brief zu Ihnen zur&uuml;ckschickt, weil sie mit der Adresse nichts anfangen kann. In diesem Beitrag zeigen wir Ihnen, wie Sie fehlerhafte und unvollst&auml;ndige Adressen aufsp&uuml;ren und sie gegebenenfalls sogar automatisch korrigieren und erg&auml;nzen.<\/b><\/p>\n<p>Damit Sie sp&auml;ter nicht entt&auml;uscht sind: Die hier vorgestellte L&ouml;sung k&uuml;mmert sich tats&auml;chlich nur um Adressen, also um Stra&szlig;en, Postleitzahlen, Orte, Bundesl&auml;nder und L&auml;nder. Sie pr&uuml;ft nicht, ob eine bestimmte Person einer Adresse zugeordnet werden kann oder nicht &#8211; f&uuml;r einen Datenbestand, der dies erledigt, m&uuml;ssten Sie mit Sicherheit eine Menge Geld hinbl&auml;ttern.<\/p>\n<p>Unsere L&ouml;sung ist kostenlos und erledigt immerhin die Kontrolle und gegebenenfalls die Erg&auml;nzung von Adressen wie etwa <b>Borkhofer Str. 17, Duisburg<\/b>.<\/p>\n<p>Wenn sie eine passende Adresse findet, liefert sie eine eventuell korrigierte Version zur&uuml;ck (<b>Str. <\/b>wird beispielsweise zu <b>Stra&szlig;e<\/b>) und erg&auml;nzt die Adresse um fehlende Elemente, hier etwa Postleitzahl, Land und Bundesland. Und falls Sie Bedarf haben, erhalten Sie gleichzeitig noch die Geodaten der angegebenen Adresse.<\/p>\n<p>Wenn tats&auml;chlich keine passende Adresse zu finden ist, soll die L&ouml;sung dies melden &#8211; so k&ouml;nnen Sie sich, soweit vorhanden, via E-Mail oder Telefon an den Adressaten wenden und die korrekte Adresse ermitteln. Vielleicht stellt sich ja dabei heraus, dass es die angegebene Adresse tats&auml;chlich nicht gibt und sich jemand einen schlechten Scherz erlaubt hat.<\/p>\n<p><b>Google als Datenlieferant<\/b><\/p>\n<p>Der Kern dieser Anwendung ist ein Dienst von Google, n&auml;mlich die <b>Google Geocoding API<\/b> (<b>http:\/\/code.google.com\/intl\/de\/apis\/maps\/documentation\/geocoding\/<\/b>).<\/p>\n<p>Wenn Sie diesem unter einer bestimmten Adresse die richtigen Parameter unterjubeln, liefert er ein XML-Dokument mit den gew&uuml;nschten Informationen zur&uuml;ck. Um beim Beispiel <b>Borkhofer Str. 17, Duisburg <\/b>zu bleiben, das immerhin die Postleitzahl vermissen l&auml;sst, geben Sie einfach einmal die folgende URL im Webbrowser Ihrer Wahl ein:<\/p>\n<pre>http:\/\/maps.google.com\/maps\/api\/geocode\/xmladdress=Borkhofer+Str.,Duisburg&amp;sensor=false&amp;language=de<\/pre>\n<p>Die Bestandteile sind schnell erkl&auml;rt: <b>http:\/\/maps.google.com\/maps\/api\/geocode\/ <\/b>ist die eigentliche Webadresse des Services. <b>xml <\/b>gibt an, dass Google das Ergebnis im XML-Format liefern soll &#8211; alternativ k&ouml;nnen Sie hier <b>json <\/b>f&uuml;r die <b>JavaScript Object Notation <\/b>angeben. Schlie&szlig;lich folgen noch weitere Parameter, die durch ein Fragezeichen eingeleitet werden: <b>address<\/b> erwartet den eigentlichen Adress-Ausdruck.<\/p>\n<p>Dessen Elemente trennen Sie durch Kommata voneinander. Leerzeichen ersetzen Sie durch das Plus-Zeichen:<\/p>\n<pre>adress=Borkhofer+Str.,Duisburg<\/pre>\n<p>Weitere Parameter werden durch das Kaufmanns-Und eingeleitet. Der folgende Ausdruck gibt an, dass die Anfrage von einem Ger&auml;t ohne Positionsermittlung kommt:<\/p>\n<pre>&amp;sensor=false<\/pre>\n<p>Der letzte Ausdruck gibt schlie&szlig;lich die Sprache an, in der Google die Antwort liefern soll:<\/p>\n<pre>&amp;language=de<\/pre>\n<p>Beim Absetzen der Abfrage im Browser kann dieser Parameter wegfallen, da er normalerweise automatisch die L&auml;nderkennung auswirft, sp&auml;ter beim Aufruf per VBA m&uuml;ssen Sie die L&auml;nderkennung jedoch mitschicken.<\/p>\n<p>Als Antwort erhalten Sie eine XML-Datei wie in Bild 1.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Adresspruefer-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Diese Antwort liefert eine Adress-Anfrage via Browser.<\/span><\/b><\/p>\n<p><b>XML-Adressdaten per Code holen<\/b><\/p>\n<p>Nat&uuml;rlich sollen Sie Ihre Adressdaten nicht alle per Webbrowser abfragen, sondern dies automatisiert mit einer geeigneten VBA-Prozedur erledigen. Die einfachste Variante dieser Prozedur finden Sie in Bild 2 einen Verweis auf die Bibliothek <b>Microsoft XML 3.0<\/b> oder h&ouml;her hinzu.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Einfache Funktion zum Aufrufen des Webservices und zum Ausgeben des Ergebnisses<\/p>\n<pre>Public Function AdressePruefen()\r\n    Dim objDocument As New MSXML2.DOMDocument\r\n    Dim strRequest As String\r\n    strRequest = &quot;http:\/\/maps.google.com\/maps\/api\/geocode\/xmladdress=Borkhofer+Str.,Duisburg&amp;sensor=false&quot;\r\n    With objDocument\r\n        .async = False\r\n        .preserveWhiteSpace = False\r\n        .validateOnParse = True\r\n        .resolveExternals = False\r\n    End With\r\n    If objDocument.Load(strRequest) = True Then\r\n        Debug.Print objDocument.XML\r\n    Else\r\n        Debug.Print &quot;#Fehler beim Aufruf&quot;\r\n    End If\r\nEnd Function<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Adresspruefer-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Hinzuf&uuml;gen eines Verweises auf die XML-Bibliothek von Microsoft<\/span><\/b><\/p>\n<p>Die Prozedur <b>AdressePruefen <\/b>deklariert zun&auml;chst das Objekt <b>objDocument<\/b>, das nach einem Aufruf des Google-Webservices mit dessen Antwort gef&uuml;llt werden soll.<\/p>\n<p>Die Variable <b>strRequest <\/b>nimmt die URL mit der Anfrage auf. Nach dem Einstellen einiger Eigenschaften von <b>objDocument<\/b>, auf die wir hier nicht im Detail eingehen, wird die Anfrage als Parameter der <b>Load<\/b>-Funktion von <b>objDocument <\/b>ausgewertet. Die <b>Load<\/b>-Funktion liefert, je nachdem, ob der Aufruf erfolgreich war oder nicht, entweder den Wert <b>True<\/b> oder <b>False <\/b>zur&uuml;ck. War der Aufruf erfolgreich, k&ouml;nnen Sie anschlie&szlig;end &uuml;ber die Eigenschaft <b>XML <\/b>des Objekts <b>objDocument <\/b>den Inhalt der Antwort im XML-Format betrachten &#8211; diese wird in dieser ersten Version im Direktfenster ausgegeben (s. Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Adresspruefer-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Das Ergebnis einer Adress-Abfrage im Direktfenster des VBA-Editors<\/span><\/b><\/p>\n<p><b>Einsatzm&ouml;glichkeiten<\/b><\/p>\n<p>Sie wissen nun, wie Sie eine Anfrage an den Google-Webservice zum Pr&uuml;fen von Adressen formulieren m&uuml;ssen, und erhalten die Antwort im XML-Format. Nun machen wir uns um die weitere Vorgehensweise Gedanken, was vor allem drei Fragen betrifft:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Wie stellen wir die Anfrage zusammen, und zwar speziell den Ausdruck mit der zu pr&uuml;fenden Adresse<\/li>\n<li class=\"aufz-hlung\">Wie ermitteln wir aus dem Ergebnis im XML-Format die gew&uuml;nschten Informationen<\/li>\n<li class=\"aufz-hlung\">Und wie verarbeiten wir diese Informationen weiter<\/li>\n<\/ul>\n<p><b>Zusammenstellen der HTTP-Anfrage an Google<\/b><\/p>\n<p>Der Aufbau der Anfrage an Google ist bis auf den Wert des Parameters <b>address <\/b>immer gleich. Wir m&uuml;ssen lediglich die zu pr&uuml;fenden Adressdaten in eine geeignete Form bringen. Das bedeutet, dass die einzelnen Bestandteile (Stra&szlig;e und Hausnummer, PLZ und Ort sowie gegebenenfalls Land und Bundesland) durch Kommata voneinander getrennt aneinandergereiht werden. Leerzeichen innerhalb dieser Eintr&auml;ge ersetzen wir durch Plus-Zeichen.<\/p>\n<p><b>XML-Antwort auswerten<\/b><\/p>\n<p>Nachdem wir die Anfrage etwa wie in der Prozedur aus <a href=\"#anker-20-anchor\">Listing 1<\/a> abgeschickt haben, erhalten wir ein XML-Dokument zur&uuml;ck. Dieses enth&auml;lt entweder einen Hinweis darauf, dass die Adresse nicht gefunden oder der Aufruf aus irgendeinem anderen Grund gescheitert ist, oder es liefert die auf Basis der &uuml;bermittelten Informationen ermittelten Adressdaten. In beiden F&auml;llen m&uuml;ssen wir den Inhalt des XML-Dokuments untersuchen, was wir mit den Mitteln der <b>Microsoft XML 3.0<\/b>-Bibliothek erledigen.<\/p>\n<p><b>Adressinformationen weiterverarbeiten<\/b><\/p>\n<p>Schlie&szlig;lich m&uuml;ssen wir die so ermittelten Informationen weiterverarbeiten &#8211; beispielsweise, indem wir diese &uuml;ber die zuvor ermittelten Adressdaten schreiben und eventuell noch nicht ausgef&uuml;llte Felder des Adressbestandes mit den gewonnenen Daten f&uuml;llen.<\/p>\n<p><b>Adressen pr&uuml;fen per Klasse<\/b><\/p>\n<p>Da diese Funktionen recht umfangreich sind und m&ouml;glicherweise in mehr als nur einer Anwendung zum Einsatz kommen k&ouml;nnten, lagern wir diese in eine eigene Klasse aus. Die Beschreibung dieser Klasse folgt im Anschluss, zun&auml;chst schauen wir uns ihren praktischen Einsatz an.<\/p>\n<p>Um die Klasse einzusetzen, ben&ouml;tigen Sie zuerst eine Objektvariable zum Speichern der Referenz auf die Klasse:<\/p>\n<pre>Dim objAddressChecker As clsAddressChecker<\/pre>\n<p>Anschlie&szlig;end erstellen Sie ein Objekt auf Basis der Klasse:<\/p>\n<pre>Set objAddressChecker = New clsAddressChecker<\/pre>\n<p>Dann weisen Sie einigen Eigenschaften der Klasse die Werte der zu untersuchenden Adresse zu:<\/p>\n<pre>With objAddressChecker\r\n    .Street = &quot;Borkhofer Str.&quot;\r\n    .Streetnumber = &quot;17&quot;\r\n    .PostalCode = &quot;47137&quot;\r\n    .City = &quot;Duisburg&quot;<\/pre>\n<p>Schlie&szlig;lich rufen Sie die Funktion <b>CheckAddress<\/b> auf, die entweder den Wert <b>True <\/b>oder <b>False <\/b>zur&uuml;ckliefert. Im Falle des Wertes <b>True <\/b>m&ouml;chten wir die gefundenen Informationen im Direktfenster betrachten:<\/p>\n<pre>If .CheckAddress = True Then\r\n     Debug.Print .Street, .Streetnumber, .PostalCode, .City, .Country, .State, .Latitude, .Longitude<\/pre>\n<p>Anderenfalls soll das Direktfenster einfach eine Meldung mit einer Erkl&auml;rung liefern, warum die Adresspr&uuml;fung nicht funktioniert hat:<\/p>\n<pre>    Else\r\n         Debug.Print .Message\r\n    End If\r\nEnd With<\/pre>\n<p>Dies alles k&ouml;nnen Sie leicht in eine <b>Do While<\/b>-Schleife packen, die alle Datens&auml;tze einer Adressdatenbank durchl&auml;uft. Sie m&uuml;ssen dann statt der hier konkret zugewiesenen Zeichenketten die Inhalte der entsprechenden Felder der Adresstabelle &uuml;bergeben, damit die Adressen gepr&uuml;ft werden k&ouml;nnen. Sollte die Methode <b>CheckAddress <\/b>eine passende Adresse gefunden haben, k&ouml;nnen Sie die vorhandene Adresse gleich durch die gepr&uuml;fte und gegebenenfalls erg&auml;nzte Adresse ersetzen.<\/p>\n<p><b>Erstellen der Klasse clsAddressChecker<\/b><\/p>\n<p>Wechseln Sie zum VBA-Editor und legen Sie eine neue Klasse namens <b>clsAddressChecker <\/b>an (Men&uuml;eintrag <b>Einf&uuml;gen|Klassenmodul<\/b>).<\/p>\n<p>Dieser Klasse wollen wir sowohl unsere bestehenden Adressdaten &uuml;bergeben als auch die gepr&uuml;ften und &uuml;berarbeiteten Daten entnehmen. Wir ben&ouml;tigen also in jedem Falle einige private Variablen zum Zwischenspeichern dieser Informationen. Diese Variablen sehen wie folgt aus und speichern Informationen wie Stra&szlig;e, Hausnummer et cetera:<\/p>\n<pre>Private m_Street As String\r\nPrivate m_Streetnumber As String\r\nPrivate m_PostalCode As String\r\nPrivate m_Country As String\r\nPrivate m_City As String\r\nPrivate m_State As String\r\nPrivate m_Message As String\r\nPrivate m_Latitude As String\r\nPrivate m_Longitude As String<\/pre>\n<p>Damit Sie dem Objekt die Daten der zu pr&uuml;fenden Adressen nach dem Instanzieren &uuml;bermitteln k&ouml;nnen, legen Sie eine Reihe von <b>Property Let<\/b>-Prozeduren an. Jede dieser Prozeduren tritt nach au&szlig;en als Eigenschaft der Klasse <b>clsAddressChecker <\/b>in Erscheinung. Im laufenden Betrieb nehmen diese die Werte entgegen, die den Eigenschaften des Objekts zugewiesen werden, und speichern diese in den entsprechenden privaten Variablen:<\/p>\n<pre>Public Property Let Street(str As String)\r\n    m_Street = str\r\nEnd Property\r\nPublic Property Let Streetnumber(str As String)\r\n    m_Streetnumber = str\r\nEnd Property\r\nPublic Property Let PostalCode(str As String)\r\n    m_PostalCode = str\r\nEnd Property\r\nPublic Property Let Country(str As String)\r\n    m_Country = str\r\nEnd Property\r\nPublic Property Let City(str As String)\r\n    m_City = str\r\nEnd Property\r\nPublic Property Let State(str As String)\r\n    m_State = str\r\nEnd Property<\/pre>\n<p><!--30percent--><\/p>\n<p>Um eines vorwegzunehmen: Die Klasse soll, wenn die Methode <b>CheckAddress<\/b> erfolgreich war, die gefundenen und gegebenenfalls korrigierten Werte genau in die Variablen schreiben, in denen auch die von der aufrufenden Instanz &uuml;bergebenen Ausgangswerte landeten. Damit diese Instanz auf diese in den einzelnen Variablen gespeicherten Werte zugreifen kann, brauchen Sie eine Reihe von <b>Property Get<\/b>-Prozeduren, die das Gegenteil von dem tun, was die <b>Property Let<\/b>-Prozeduren erledigen: Sie stellen die Werte der privaten Variablen nach au&szlig;en als Eigenschaften des Objekts auf Basis der Klasse <b>clsAddressChecker <\/b>zur Verf&uuml;gung.<\/p>\n<p>Die jeweils einzige Anweisung weist dabei dem Funktionswert dieser Prozeduren den jeweiligen Variableninhalt zu:<\/p>\n<pre>Public Property Get Street() As String\r\n    Street = m_Street\r\nEnd Property\r\nPublic Property Get Streetnumber() As String\r\n    Streetnumber = m_Streetnumber\r\nEnd Property\r\n...<\/pre>\n<p>Zus&auml;tzlich zu den bekannten Eigenschaften k&ouml;nnen Sie mit den folgenden beiden die geografische Position der betroffenen Adresse ermitteln:<\/p>\n<pre>Public Property Get Latitude() As String\r\n    Latitude = m_Latitude\r\nEnd Property\r\nPublic Property Get Longitude() As String\r\n    Longitude = m_Longitude\r\nEnd Property<\/pre>\n<p>Die letzte der verwendeten <b>Property Get<\/b>-Prozeduren liefert schlie&szlig;lich einen Erkl&auml;rungstext f&uuml;r ein eventuelles Scheitern des Aufrufs von <b>CheckAddress<\/b>:<\/p>\n<pre>Public Property Get Message() As String\r\n    Message = m_Message\r\nEnd Property<\/pre>\n<p>Die Funktion <b>CheckAddress<\/b> finden Sie in <a href=\"#anker-24-anchor\">Listing 2<\/a>. Sie erwartet keine Parameter und liefert einen <b>Boolean<\/b>-Wert zur&uuml;ck. Wie aber soll eine gefundene Adresse zur&uuml;ckgeliefert werden, wenn nicht als Parameter der Pr&uuml;ffunktion<\/p>\n<p class=\"listingueberschrift\">Listing 2: Diese Funktion initiiert die Pr&uuml;fung einer Adresse.<\/p>\n<pre>Public Function CheckAddress() As Boolean\r\n    Dim strAddress As String\r\n    Dim strStatus As String\r\n    Dim objDocument As MSXML2.DOMDocument\r\n    Dim i As Integer\r\n    strAddress = GetAddress\r\n    If GetXML(strAddress, objDocument) = True Then\r\n        strStatus = objDocument.selectSingleNode(&quot;\/GeocodeResponse\/status&quot;).nodeTypedValue\r\n        If strStatus = &quot;OVER_QUERY_LIMIT&quot; Then\r\n            For i = 1 To 4\r\n                Sleep 500\r\n                GetXML strAddress, objDocument\r\n                strStatus = objDocument.selectSingleNode(&quot;\/GeocodeResponse\/status&quot;).nodeTypedValue\r\n                If strStatus = &quot;OVER QUERY LIMIT&quot; Then\r\n                    Exit For\r\n                End If\r\n            Next i\r\n        End If\r\n        Select Case strStatus\r\n            Case &quot;OK&quot;\r\n                If ExtractAddress(objDocument) Then\r\n                    CheckAddress = True\r\n                    m_Message = &quot;Adresse vollst&auml;ndig.&quot;\r\n                Else\r\n                    m_Message = &quot;Adresse unvollst&auml;ndig.&quot;\r\n                End If\r\n            Case &quot;OVER_QUERY_LIMIT&quot;\r\n                m_Message = &quot;OVER_QUERY_LIMIT&quot;\r\n            Case Else\r\n                m_Message = strStatus\r\n        End Select\r\n    End If\r\nEnd Function<\/pre>\n<p>Wer bereits einmal Klassen programmiert hat, wei&szlig; es: Die gefundenen Daten landen in den oben beschriebenen Variablen und k&ouml;nnen nach erfolgreicher Pr&uuml;fung genau so ausgelesen werden, wie die zu pr&uuml;fenden Daten zugewiesen wurden.<\/p>\n<p>Die Funktion <b>CheckAddress <\/b>verwendet zun&auml;chst die Funktion <b>GetAddress<\/b>, um den Adress-Ausdruck f&uuml;r die &Uuml;bergabe an den Google-Webservice zusammenzusetzen. Danach sendet die Funktion <b>GetXML <\/b>die Anfrage ab und nimmt das Ergebnis in Form eines XML-Dokuments entgegen, welches im Objekt <b>objDocument <\/b>gespeichert wird.<\/p>\n<p>Das darin enthaltene XML-Dokument enth&auml;lt ein Element namens <b>Status<\/b>, welches als Ergebnis der Anfrage den Ausdruck <b>OK <\/b>oder, im Fehlerfall, einen Wert wie <b>ZERO_RESULTS <\/b>zur&uuml;ckliefert (s. Bild 4). Diesen Wert erhalten wir &uuml;ber eine <b>SelectSingleNode<\/b>-Anweisung, welche Elemente des XML-Dokuments entsprechend einer bestimmten Syntax ermittelt (mehr zu diesem Thema erfahren Sie im Beitrag <b>XML-Dokumente mit VBA erstellen und lesen <\/b>unter <b>www.access-im-unternehmen.de\/522<\/b>).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Adresspruefer-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Die XML-Antwort enth&auml;lt gleich zu Beginn Informationen &uuml;ber Erfolg oder Misserfolg.<\/span><\/b><\/p>\n<p>Eine besondere Rolle kommt der <b>For&#8230;Next<\/b>-Schleife zu, die viermal durchlaufen wird und pr&uuml;ft, ob das XML-Dokument als <b>Status <\/b>den Wert <b>OVER QUERY LIMIT <\/b>zur&uuml;ckliefert. Dies kann geschen, wenn zuviele Abfragen in kurzer Zeit erfolgen oder wenn Sie tats&auml;chlich die bei Drucklegung dieses Beitrags g&uuml;ltige Grenze von 2.500 Zugriffen &uuml;berschritten haben. Im ersten Fall wartet die Prozedur jeweils eine halbe Sekunde, bevor sie einen erneuten Zugriff versucht. Sollte dies viermal schiefgehen, ist davon auszugehen, dass tats&auml;chlich das Tageslimit erreicht wurde, anderenfalls arbeitet die Prozedur mit dem nun ermittelten XML-Dokument weiter.<\/p>\n<p>Nach erfolgreichem Einlesen nimmt sich die Funktion <b>ExtractAddress <\/b>das XML-Dokument vor und schreibt die relevanten Informationen in die privaten Variablen der Klasse. Au&szlig;erdem wird der R&uuml;ckgabewert der Funktion <b>CheckAddress <\/b>im Erfolgsfall auf den Wert <b>True <\/b>eingestellt.<\/p>\n<p><b>Adressausdruck zusammenstellen<\/b><\/p>\n<p>Kommen wir nun zu den oben bereits erw&auml;hnten Funktionen, die von <b>CheckAddress <\/b>aufgerufen werden. Die erste hei&szlig;t <b>GetAddress <\/b>und soll aus den von der aufrufenden Instanz &uuml;bergebenen Werten f&uuml;r die einzelnen Adress-Bestandteile einen Ausdruck machen, den Google auswerten und in eine vollst&auml;ndige, gepr&uuml;fte Adresse umwandeln kann (s. <a href=\"#anker-26-anchor\">Listing 3<\/a>). Die Funktion f&uuml;gt den ben&ouml;tigten Ausdruck in der Variablen <b>strAddress <\/b>zusammen. Zuerst werden der um f&uuml;hrende oder folgende Leerzeichen gek&uuml;rzte Stra&szlig;enname sowie die Hausnummer zu <b>strAddress <\/b>hinzugef&uuml;gt (Leerzeichen vorne und hinten werden generell auch bei den folgenden Ausdr&uuml;cken abgeschnitten).<\/p>\n<p class=\"listingueberschrift\">Listing 3: Zusammensetzen des Adress-Ausdrucks<\/p>\n<pre>Private Function GetAddress() As String\r\n    Dim strAddress As String\r\n    strAddress = Trim(m_Street) &amp; &quot;+&quot; &amp; Trim(m_Streetnumber) &amp; &quot;,&quot;\r\n    If Right(strAddress, 2) = &quot;+,&quot; Then strAddress = Left(strAddress, Len(strAddress) - 2) &amp; &quot;,&quot;\r\n    strAddress = strAddress &amp; Trim(m_PostalCode) &amp; &quot;+&quot; &amp; Trim(m_City) &amp; &quot;,&quot;\r\n    strAddress = strAddress &amp; Trim(m_State) &amp; &quot;,&quot;\r\n    strAddress = strAddress &amp; Trim(m_Country)\r\n    strAddress = Replace(strAddress, &quot; &quot;, &quot;+&quot;)\r\n    Do While InStr(1, strAddress, &quot;++&quot;)\r\n        strAddress = Replace(strAddress, &quot;++&quot;, &quot;+&quot;)\r\n    Loop\r\n    Do While InStr(1, strAddress, &quot;,,&quot;)\r\n        strAddress = Replace(strAddress, &quot;,,&quot;, &quot;,&quot;)\r\n    Loop\r\n    If Right(strAddress, 1) = &quot;,&quot; Then\r\n        strAddress = Left(strAddress, Len(strAddress) - 1)\r\n    End If\r\n    strAddress = Replace(strAddress, &quot;&szlig;&quot;, &quot;ss&quot;)\r\n    strAddress = Replace(strAddress, &quot;&auml;&quot;, &quot;ae&quot;)\r\n    strAddress = Replace(strAddress, &quot;&ouml;&quot;, &quot;oe&quot;)\r\n    ''... weitere Sonderzeichen ersetzen\r\n    GetAddress = strAddress\r\nEnd Function<\/pre>\n<p>Gleiches geschieht mit PLZ und Ort sowie Bundesland und Land. Zwischendurch ersetzt die Funktion Leerzeichen durch Plus-Zeichen. Eventuell durch &uuml;berz&auml;hlige Leerzeichen auftretende doppelte Plus-Zeichen werden durch einfache Plus-Zeichen ersetzt, Gleiches geschieht mit doppelten Kommata.<\/p>\n<p>Der resultierende Ausdruck wird an die Funktion <b>GetXML<\/b> &uuml;bergeben (s. Listing 4). Diese setzt den Adressausdruck mit dem Rest der HTTP-Anfrage zusammen und schickt diese an den Google-Webservice.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Pr&uuml;fanfrage an Google<\/p>\n<pre>Private Function GetXML(strAddress, objDocument As MSXML2.DOMDocument) As Boolean\r\n    Dim strRequest As String\r\n    strRequest = &quot;http:\/\/maps.google.com\/maps\/api\/geocode\/xmladdress=&quot; &amp; strAddress _\r\n        &amp; &quot;&amp;sensor=false&amp;language=de&quot;\r\n    Set objDocument = New MSXML2.DOMDocument\r\n    With objDocument\r\n        .async = False\r\n        .preserveWhiteSpace = False\r\n        .validateOnParse = True\r\n        .resolveExternals = False\r\n    End With\r\n    If objDocument.Load(strRequest) = True Then\r\n        GetXML = True\r\n    Else\r\n        m_Message = &quot;Die Anfrage wurde nicht beantwortet.&quot;\r\n        GetXML = False\r\n    End If\r\nEnd Function<\/pre>\n<p>Wenn Google eine Antwort zur&uuml;ckgeschickt hat, erh&auml;lt <b>GetXML <\/b>als R&uuml;ckgabewert den Wert <b>True<\/b>, anderenfalls <b>False<\/b>. Im letzteren Fall wird auch die Variable <b>m_Message<\/b>, die beim Scheitern der Adresspr&uuml;fung eine entsprechende Erl&auml;uterung liefern soll, mit einem passenden Text gef&uuml;llt.<\/p>\n<p>Das Extrahieren der Adresse aus dem XML-Dokument &uuml;bernehmen die beiden Prozeduren <b>ExtractAddress<\/b> und <b>ExtractAddressPart<\/b>. Erstere ruft zun&auml;chst f&uuml;r jeden Adressteil die Funktion <b>ExtractAddressPart <\/b>auf und &uuml;bergibt neben einem Verweis auf das XML-Dokument die Eigenschaft, nach der die Prozedur suchen soll.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Extrahieren der Adresse aus der XML-Antwort<\/p>\n<pre>Private Function ExtractAddress(objDocument As MSXML2.DOMDocument) As Boolean\r\n    Dim lngResult As Long\r\n    m_Street = ExtractAddresspart(objDocument, &quot;route&quot;)\r\n    m_Streetnumber = ExtractAddresspart(objDocument, &quot;street_number&quot;)\r\n    m_PostalCode = ExtractAddresspart(objDocument, &quot;postal_code&quot;)\r\n    m_City = ExtractAddresspart(objDocument, &quot;locality&quot;)\r\n    m_State = ExtractAddresspart(objDocument, &quot;administrative_area_level_1&quot;)\r\n    m_Country = ExtractAddresspart(objDocument, &quot;country&quot;)\r\n    m_Latitude = objDocument.selectSingleNode(&quot;\/GeocodeResponse\/result\/geometry\/location\/lat&quot;).nodeTypedValue\r\n    m_Longitude = objDocument.selectSingleNode(&quot;\/GeocodeResponse\/result\/geometry\/location\/lng&quot;).nodeTypedValue\r\n    lngResult = Len(m_Street) * Len(m_Streetnumber) * Len(m_PostalCode) * Len(m_City) _\r\n        * Len(m_State) * Len(m_Country) * Len(m_Latitude) * Len(m_Longitude)\r\n    If lngResult &gt; 0 Then\r\n        ExtractAddress = True\r\n    Else\r\n        ExtractAddress = False\r\n    End If\r\nEnd Function\r\nPublic Function ExtractAddresspart(objDocument As MSXML2.DOMDocument, strPart As String) As String\r\n    Dim objNode As MSXML2.IXMLDOMNode\r\n    Set objNode = objDocument.selectSingleNode(&quot;\/GeocodeResponse\/result\/address_component[type=''&quot; _\r\n        &amp; strPart &amp; &quot;']&quot;)\r\n    If Not objNode Is Nothing Then\r\n        ExtractAddresspart = objNode.selectSingleNode(&quot;long_name&quot;).nodeTypedValue\r\n    End If\r\nEnd Function<\/pre>\n<p>Hintergrund ist, dass die Adressbestandteile jeweils in einem eigenen Element mit mehreren Unterelementen untergebracht sind. F&uuml;r die Hausnummer sieht dies etwa so aus:<\/p>\n<pre>&lt;address_component&gt;\r\n    &lt;long_name&gt;17&lt;\/long_name&gt;\r\n    &lt;short_name&gt;17&lt;\/short_name&gt;\r\n    &lt;type&gt;street_number&lt;\/type&gt;\r\n&lt;\/address_component&gt;<\/pre>\n<p>Die Aufgabe lautet hier, das <b>address_component<\/b>-Element zu finden, dessen Unterelement <b>type <\/b>den entsprechenden Wert aufweist, hier zum Beispiel <b>street_number<\/b>, und aus diesem Element den Inhalt des Unterelements <b>long_name <\/b>auszulesen.<\/p>\n<p>Dies erledigt jeweils die Funktion <b>ExtractAddressPart <\/b>und liefert den gefundenen Wert zur&uuml;ck &#8211; und dies nacheinander f&uuml;r die Elemente mit dem Wert <b>route<\/b>, <b>street_number<\/b>, <b>postal_code<\/b>, <b>locality<\/b>, <b>administrative_area_level_1 <\/b>und <b>country<\/b>.<\/p>\n<p>Die &uuml;brigen beiden Zeilen der Funktion <b>ExtractAddress <\/b>lesen schlie&szlig;lich noch die geografischen Koordinaten ein, die schematisch etwas anders als die &uuml;brigen Adressinformationen untergebracht und leichter zu erreichen sind &#8211; deshalb reicht ein einfacher <b>selectSingleNode<\/b>-Aufruf, um ihren Wert zu ermitteln.<\/p>\n<p>Um zu pr&uuml;fen, ob die Funktion alle Elemente der Adresse geliefert hat, erstellt eine weitere Anweisung eine Art Pr&uuml;fzahl: Sie ermittelt mit der <b>Len<\/b>-Funktion die L&auml;ngen der ermittelten Adressbestandteile und multipliziert diese miteinander.<\/p>\n<p>Sollte mindestens ein Teil die L&auml;nge <b>0 <\/b>haben, liefert der gesamte Ausdruck den Wert <b>0<\/b>. In diesem Fall liefert die Funktion den Wert <b>False <\/b>zur&uuml;ck, anderenfalls den Wert <b>True<\/b>.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Praxisbeispiel<\/p>\n<p>Schauen wir uns die L&ouml;sung noch in einem kleinen Praxisbeispiel an, bei dem wir die Datens&auml;tze einer Tabelle durchlaufen, und versuchen, alle enthaltenen Adressen zu pr&uuml;fen und gegebenenfalls zu korrigieren und zu erg&auml;nzen.<\/p>\n<p>Als Beispiel k&ouml;nnen Sie eine beliebige Tabelle mit Adressen verwenden. Am besten importieren Sie diese in die Beispieldatenbank zu diesem Beitrag, damit Sie nicht versehentlich &auml;nderungen am Originaldatenbestand durchf&uuml;hren &#8211; Sie sollten Ihre Vorgehensweise vorab sorgf&auml;ltig testen.<\/p>\n<p>Das folgende Beispiel verwendet eine Adresstabelle, welche die Felder <b>Strasse<\/b>, <b>PLZ<\/b>, <b>Ort <\/b>und <b>Land <\/b>verwendet. Wir wollen erstens die Adressen pr&uuml;fen und zweitens einige Daten umstrukturieren: Der Inhalt des Feldes <b>Strasse<\/b> soll auf die Felder <b>Strasse <\/b>und <b>Hausnummer <\/b>aufgeteilt werden. Au&szlig;erdem soll ein neues Feld <b>Bundesland <\/b>das zur Adresse passende Bundesland aufnehmen.<\/p>\n<p>Schlie&szlig;lich haben wir ein weiteres Feld namens <b>AdresseGeprueft<\/b> hinzugef&uuml;gt. Dieses erh&auml;lt den Wert <b>Ja<\/b>, wenn die Adresse erfolgreich gepr&uuml;ft wurde &#8211; das bedeutet, dass Google f&uuml;r alle sechs abgefragten Felder Ergebnisse zur&uuml;ckgeliefert hat.<\/p>\n<p>In vielen F&auml;llen geht dies schief, weil die Hausnummer nicht identifiziert werden kann &#8211; beispielsweise bei Werten wie 24\/7 oder 13a. Sie k&ouml;nnen dann nach dem Pr&uuml;fen per Abfrage alle Eintr&auml;ge anzeigen lassen, deren Pr&uuml;fung fehlgeschlagen ist.<\/p>\n<p>Desweiteren kann es sein, dass der Webservice empfindlich auf zu schnell aufeinanderfolgende Abfragen reagiert und den Wert <b>OVER_QUERY_LIMIT <\/b>als Antwort f&uuml;r den Parameter <b>Result <\/b>liefert. Die aktuelle Version des <b>AddressCheckers<\/b> gibt die Anfragen und die Resultate im Direktfenster aus. Dort k&ouml;nnen Sie sehen, ob eine Adresspr&uuml;fung erfolgreich war.<\/p>\n<p>Unsere Beispielprozedur <b>KundenadressenPruefen<\/b> aus <a href=\"#anker-29-anchor\">Listing 6<\/a> arbeitet wie folgt: Zun&auml;chst deklariert sie die ben&ouml;tigten Elemente wie das <b>Database<\/b>-Objekt, ein <b>Recordset <\/b>zum Durchlaufen der Datens&auml;tze sowie das <b>AddressChecker<\/b>-Objekt.<\/p>\n<p>Danach f&uuml;llt sie die Variable <b>CurrentDb <\/b>mit einem Verweis auf die aktuelle Datenbank und erzeugt ein <b>Recordset<\/b>-Objekt mit allen Datens&auml;tzen einer Tabelle namens <b>tblKunden<\/b>. Diese durchl&auml;uft die folgende <b>Do While<\/b>-Schleife. Dabei erzeugt die erste Anweisung ein neues Objekt auf Basis der Klasse <b>clsAddressChecker <\/b>und f&uuml;llt dessen Eigenschaften <b>City<\/b>, <b>Country<\/b>, <b>PostalCode <\/b>und <b>Street <\/b>mit den Daten, die bereits in der Tabelle <b>tblKunden<\/b> enthalten sind.<\/p>\n<p>Mit diesen Daten im Gep&auml;ck geht es zur Funktion <b>CheckAddress<\/b>, welche den eigentlichen Aufruf durchf&uuml;hrt und, sofern dieser erfolgreich ist, die Eigenschaften des Objekts <b>objAddressChecker <\/b>mit den gelieferten Werten f&uuml;llt.<\/p>\n<p>Hier sei nochmals angemerkt, dass der Aufruf nur den Wert <b>True <\/b>zur&uuml;ckliefert, wenn alle sechs Eigenschaften ermittelt werden k&ouml;nnen. In diesem Fall bereitet die Prozedur das <b>Recordset<\/b>-Objekt <b>rst <\/b>mit der <b>Edit<\/b>-Methode zum Bearbeiten der Feldinhalte vor. Die folgenden sechs Anweisungen tragen die ermittelten Adressdaten ein, bevor die <b>Update<\/b>-Methode die &auml;nderungen in die zugrunde liegende Tabelle &uuml;bertr&auml;gt. Diesen Vorgang wiederholt die Prozedur f&uuml;r jeden in der Datensatzgruppe enthaltenen Datensatz.<\/p>\n<p>Nach dem Durchlaufen aller Datens&auml;tze, was je nach Menge der zu pr&uuml;fenden Adressen einige Zeit in Anspruch nehmen kann, finden Sie die ge&auml;nderten Adressen in der entsprechenden Tabelle vor.<\/p>\n<p>Gegebenenfalls w&auml;re es sinnvoll, tempor&auml;r noch ein Feld namens <b>Message <\/b>zur Tabelle hinzuzuf&uuml;gen, um gleich nachlesen zu k&ouml;nnen, warum eine Adresse nicht erfolgreich gepr&uuml;ft werden konnte. Eine Beispieltabelle k&ouml;nnte etwa wie in Bild 5 aussehen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Adresspruefer-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Beispiel f&uuml;r eine Tabelle mit den Feldern zum Speichern des Pr&uuml;fergebnisses<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Der <b>AddressChecker<\/b> verwendet einen Google-Webservice zum Pr&uuml;fen bestehender Adressen. Dieser Service ist kostenlos und erfordert keinerlei Registrierung &#8211; allein die Anzahl der Zugriffe ist auf 2.500 pro Tag beschr&auml;nkt.<\/p>\n<p>Dank einiger spezieller Techniken k&ouml;nnen wir diesen Service auch von Access aus ansprechen und f&uuml;r einen gegebenen Adress-Ausdruck ein XML-Dokument mit den validierten und erg&auml;nzten Adress-Daten ermitteln, welches wir im Anschluss per VBA auswerten.<\/p>\n<p>Diese L&ouml;sung k&ouml;nnen Sie leicht in eigene Anwendungen einbauen. Sie brauchen nur die Klasse <b>clsAddressChecker <\/b>in die jeweilige Anwendung zu importieren und dann wie in unserer Beispielprozedur aus <a href=\"#anker-29-anchor\">Listing 6<\/a> auf die Eigenschaften und Methoden dieser Klasse zuzugreifen. Au&szlig;erden ben&ouml;tigen Sie noch den weiter oben erw&auml;hnten Verweis auf die MSXML-Bibliothek.<\/p>\n<p class=\"listingueberschrift\">Listing 6: Beispiel f&uuml;r den Einsatz des AddressCheckers<\/p>\n<pre>Public Sub KundenadressenPruefen()\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim objAddressChecker As clsAddressChecker\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;tblKunden&quot;, dbOpenDynaset)\r\n    Do While Not rst.EOF\r\n         Set objAddressChecker = New clsAddressChecker\r\n        With objAddressChecker\r\n            .City = rst!Ort\r\n            .Country = rst!Land\r\n            .PostalCode = rst!PLZ\r\n            .Street = rst!Strasse &amp; &quot; &quot; + rst!Hausnummer\r\n            If rst!AdresseGeprueft = False Then\r\n                If .CheckAddress = True Then\r\n                    rst.Edit\r\n                    rst!Strasse = .Street\r\n                    rst!Hausnummer = .Streetnumber\r\n                    rst!Ort = .City\r\n                    rst!PLZ = .PostalCode\r\n                     rst!Land = .Country\r\n                    rst!Bundesland = .State\r\n                    rst!AdresseGeprueft = True\r\n                    rst.Update\r\n                     Debug.Print &quot;OK&quot;\r\n                Else\r\n                    Debug.Print .Message\r\n                End If\r\n            End If\r\n        End With\r\n        rst.MoveNext\r\n        Set objAddressChecker = Nothing\r\n    Loop\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Nat&uuml;rlich bietet die L&ouml;sung auch Erweiterungspotenzial: So k&ouml;nnten Sie ein Formular erstellen, das die vorher verwendeten Adressdaten und gleichzeitig die vom <b>AddressChecker <\/b>ermittelte Variante anzeigt. Hier f&uuml;gen Sie Schaltfl&auml;chen hinzu, mit welchen der Benutzer selbst entscheiden kann, ob er eine oder mehrere unterschiedliche Eigenschaften der validierten Version der Adresse in die Datenbank &uuml;bernehmen m&ouml;chte.<\/p>\n<p>Anwendungsf&auml;lle finden sich prinzipiell in allen Datenbanken, die Adressdaten speichern. Durch eine Validierung sortieren Sie ung&uuml;ltige Adressen aus. Ebenso k&ouml;nnen Sie unvollst&auml;ndige Adressdaten erweitern: So finden Sie leicht die PLZ, wenn Stra&szlig;e und Ort bekannt sind. Und mit diesen Informationen ist der Weg zu Land und Bundesland ebenfalls nicht mehr weit &#8211; und wollten Sie nicht schon immer mal wissen, aus welchem Bundesland die meisten Ihrer Kunden stammen<\/p>\n<p>Der <b>AddressChecker <\/b>kann ebenfalls dabei helfen, eine Stra&szlig;e in Stra&szlig;e und Hausnummer aufzuteilen, was gelegentlich hilfreich ist.<\/p>\n<p>Teilen Sie uns doch einfach Ihre Ideen f&uuml;r weitere Anwendungsf&auml;lle unter <b>info@access-im-unternehmen.de<\/b> mit &#8211; vielleicht entsteht daraus ja ein weiterer interessanter Artikel f&uuml;r <b>Access im Unternehmen<\/b>.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Adresspruefer.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{FD079C6A-5BEB-4F0D-8F09-AAE7CB188B3D}\/aiu_746.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fast jede Datenbankanwendung speichert Adressen in irgendeiner Form &#8211; seien es Kunden-, Mitarbeiter-, Privat- oder Firmenadressen. Diese gelangen &uuml;ber irgendeine Schnittstelle in die Datenbank, beispielsweise &uuml;ber den Import von Daten aus externen Dateien oder auch durch manuelle Eingabe. Aber pr&uuml;fen Sie diese Adressen auch Oder lassen Sie es darauf ankommen, bis die Post einen Brief zu Ihnen zur&uuml;ckschickt, weil sie mit der Adresse nichts anfangen kann. In diesem Beitrag zeigen wir Ihnen, wie Sie die fehlerhafte und unvollst&auml;ndige Adressen aufsp&uuml;ren und sie gegebenenfalls sogar automatisch korrigieren und erg&auml;nzen.<\/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":[662010,66052010,44000027],"tags":[],"class_list":["post-55000746","post","type-post","status-publish","format-standard","hentry","category-662010","category-66052010","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 pr&uuml;fen und erg&auml;nzen - 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_pruefen_und_ergaenzen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adressen pr&uuml;fen und erg&auml;nzen\" \/>\n<meta property=\"og:description\" content=\"Fast jede Datenbankanwendung speichert Adressen in irgendeiner Form - seien es Kunden-, Mitarbeiter-, Privat- oder Firmenadressen. Diese gelangen &uuml;ber irgendeine Schnittstelle in die Datenbank, beispielsweise &uuml;ber den Import von Daten aus externen Dateien oder auch durch manuelle Eingabe. Aber pr&uuml;fen Sie diese Adressen auch Oder lassen Sie es darauf ankommen, bis die Post einen Brief zu Ihnen zur&uuml;ckschickt, weil sie mit der Adresse nichts anfangen kann. In diesem Beitrag zeigen wir Ihnen, wie Sie die fehlerhafte und unvollst&auml;ndige Adressen aufsp&uuml;ren und sie gegebenenfalls sogar automatisch korrigieren und erg&auml;nzen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:08:04+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/ab05c975cd9c4d18b14272ebeaf4da74\" \/>\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=\"22\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_pruefen_und_ergaenzen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Adressen pr&uuml;fen und erg&auml;nzen\",\"datePublished\":\"2020-05-22T22:08:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/\"},\"wordCount\":3379,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/ab05c975cd9c4d18b14272ebeaf4da74\",\"articleSection\":[\"2010\",\"5\\\/2010\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/\",\"name\":\"Adressen pr&uuml;fen und erg&auml;nzen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/ab05c975cd9c4d18b14272ebeaf4da74\",\"datePublished\":\"2020-05-22T22:08:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/ab05c975cd9c4d18b14272ebeaf4da74\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/ab05c975cd9c4d18b14272ebeaf4da74\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Adressen_pruefen_und_ergaenzen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adressen pr&uuml;fen und erg&auml;nzen\"}]},{\"@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 pr&uuml;fen und erg&auml;nzen - 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_pruefen_und_ergaenzen\/","og_locale":"de_DE","og_type":"article","og_title":"Adressen pr&uuml;fen und erg&auml;nzen","og_description":"Fast jede Datenbankanwendung speichert Adressen in irgendeiner Form - seien es Kunden-, Mitarbeiter-, Privat- oder Firmenadressen. Diese gelangen &uuml;ber irgendeine Schnittstelle in die Datenbank, beispielsweise &uuml;ber den Import von Daten aus externen Dateien oder auch durch manuelle Eingabe. Aber pr&uuml;fen Sie diese Adressen auch Oder lassen Sie es darauf ankommen, bis die Post einen Brief zu Ihnen zur&uuml;ckschickt, weil sie mit der Adresse nichts anfangen kann. In diesem Beitrag zeigen wir Ihnen, wie Sie die fehlerhafte und unvollst&auml;ndige Adressen aufsp&uuml;ren und sie gegebenenfalls sogar automatisch korrigieren und erg&auml;nzen.","og_url":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:08:04+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/ab05c975cd9c4d18b14272ebeaf4da74","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Adressen pr&uuml;fen und erg&auml;nzen","datePublished":"2020-05-22T22:08:04+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/"},"wordCount":3379,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/ab05c975cd9c4d18b14272ebeaf4da74","articleSection":["2010","5\/2010","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/","url":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/","name":"Adressen pr&uuml;fen und erg&auml;nzen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/ab05c975cd9c4d18b14272ebeaf4da74","datePublished":"2020-05-22T22:08:04+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/ab05c975cd9c4d18b14272ebeaf4da74","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/ab05c975cd9c4d18b14272ebeaf4da74"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Adressen_pruefen_und_ergaenzen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Adressen pr&uuml;fen und erg&auml;nzen"}]},{"@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\/55000746","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=55000746"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000746\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000746"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000746"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}