{"id":55000744,"date":"2010-10-01T00:00:00","date_gmt":"2020-05-22T22:07:50","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=744"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Duplikatsuche_in_Adressen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/","title":{"rendered":"Duplikatsuche in Adressen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/e7261852352746c38841506651f51358\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>F&uuml;r die Suche nach Duplikaten bietet Access einen speziellen Abfrageassistenten. Dieser liefert nach einigen Schritten eine Abfrage, mit der Sie die Duplikate untersuchen k&ouml;nnen. Wer etwas flexibler sein m&ouml;chte und nach der Auswahl der betroffenen Tabelle und der zu untersuchenden Felder gleich ein Ergebnis erhalten will, wird in diesem Beitrag f&uuml;ndig. Und das Beste: Sie k&ouml;nnen die passenden Duplikate nicht nur gleich beim Anlegen der Parameter betrachten, sondern auch noch die Weiterverarbeitung in die Wege leiten.<\/b><\/p>\n<p>Die Suche nach Duplikaten und das Entfernen der jeweils &uuml;berfl&uuml;ssigen Exemplare ist gerade beim Zusammenf&uuml;hren von Daten aus verschiedenen Adressbest&auml;nden eine wichtige Aufgabe. Dies gilt umso mehr, wenn Sie die Adressen verwenden, um Kunden anzuschreiben &#8211; sei es per Briefpost oder per E-Mail. Wenn ein Kunde ein Anschreiben gleich doppelt erh&auml;lt, wirft dies ein schlechtes Licht auf den Absender.<\/p>\n<p>Und bei Anschreiben per Briefpost gibt man im schlimmsten Fall unn&ouml;tig Geld aus, weil man den Kunden entweder bereits per E-Mail kontaktiert hat oder verschiedene Adressen des gleichen Kunden verwendet, von denen eine oder mehrere veraltet sind.<\/p>\n<p>Die Suche nach Duplikaten im Adressbest&auml;nden sollte daher so flexibel wie m&ouml;glich sein und ein schnelles Abgleichen von Adressen nach verschiedenen Feldern erlauben. Wenn Sie beispielsweise im ersten Ansatz Adressen von Kunden ermitteln, deren Name mehr als einmal auftritt, und dabei auf einen vierfachen Klaus M&uuml;ller treffen, sollte es schnell m&ouml;glich sein, die &uuml;brigen Daten in die Duplikatsuche miteinzubeziehen &#8211; indem Sie beispielsweise den Wohnort hinzunehmen und so vielleicht nur noch einen doppelten Klaus M&uuml;ller zur&uuml;ckbehalten, den Sie &uuml;ber weitere Kriterien als Duplikat enttarnen &#8211; oder auch nicht.<\/p>\n<p>Die in diesem Beitrag vorgestellte L&ouml;sung soll zun&auml;chst die Auswahl der zu untersuchenden Tabelle erm&ouml;glichen. Danach zeigt ein Unterformular alle Felder dieser Tabelle an und erlaubt das Festlegen der Felder, die in die Duplikatssuche mit einbezogen werden sollen. Au&szlig;erdem k&ouml;nnen Sie dort einstellen, welche Details f&uuml;r die ausgew&auml;hlten Datens&auml;tze angezeigt werden. Nach dieser Auswahl greifen Sie direkt auf die gefundenen Datens&auml;tze zu und k&ouml;nnen diese bearbeiten oder l&ouml;schen.<\/p>\n<p>Im Detail sieht das wie in Bild 1 aus. Die Auswahl der zu untersuchenden Tabelle erfolgt &uuml;ber ein Kombinationsfeld, das alle Tabellen der Datenbank mit Ausnahme der Systemtabellen anzeigt. Gleich nach dieser Auswahl f&uuml;llt das Formular ein Unterformular mit einer Liste aller Felder der ausgew&auml;hlten Tabelle. Daneben finden Sie zwei Spalten mit Kontrollk&auml;stchen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Duplikatsucher-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: &Uuml;bersicht der Funktionen des Duplikatmanagers<\/span><\/b><\/p>\n<p>Die erste Spalte erm&ouml;glicht die Auswahl aller Felder, die in die Duplikatsuche mit einbezogen werden sollen. Wenn Sie dort beispielsweise die Felder <b>Vorname <\/b>und <b>Nachname <\/b>einer Adressentabelle ausw&auml;hlen, soll die L&ouml;sung zun&auml;chst pr&uuml;fen, wieviele Datens&auml;tze es von jeder in der Tabelle vorhandenen Kombination von Vor- und Nachname gibt, und davon all diejenigen anzeigen, die mehr als zweimal vorkommen.<\/p>\n<p>Dies schl&auml;gt sich im Unterformular oben rechts nieder, wo zuerst die Anzahl der Duplikate und dann der Wert der f&uuml;r die Duplikatsuche ausgew&auml;hlten Felder erscheint.<\/p>\n<p>Kommen wir noch einmal zur&uuml;ck zur Liste der Felder der ausgew&auml;hlten Tabelle. Dort legen Sie nicht nur fest, nach welchen Feldern die Duplikate ermittelt werden sollen, sondern auch, welche Daten der gefundenen Datens&auml;tze in der Detailtabelle im Unterformular im unteren Bereich erscheinen sollen. Standardm&auml;&szlig;ig werden dort alle Felder markiert, Sie k&ouml;nnen nach Bedarf jedoch eines oder mehrere Felder abw&auml;hlen.<\/p>\n<p>Das Unterformular rechts oben zeigt nicht nur die mehrfach vorkommenden Kombinationen der gew&auml;hlten Felder an, sondern erm&ouml;glicht es auch, alle betroffenen Datens&auml;tze im unteren Formular anzuzeigen. Wenn die Adressentabelle also zwei Datens&auml;tze mit dem Vornamen <b>Achim <\/b>und dem Nachnamen <b>F&ouml;rster <\/b>enth&auml;lt, k&ouml;nnen Sie die Details dieser beiden Datens&auml;tze durch einen einfachen Klick im unteren Unterformular anzeigen lassen.<\/p>\n<p>Dort k&ouml;nnen Sie die Datens&auml;tze ganz normal bearbeiten und so etwa einen oder mehrere Datens&auml;tze l&ouml;schen oder die Daten mehrerer Datens&auml;tze zu einem Datensatz zusammenf&uuml;hren.<\/p>\n<p><b>Technische Beschreibung des Duplikatmanagers<\/b><\/p>\n<p>Auf den folgenden Seiten erfahren Sie, wie der Duplikatmanager funktioniert. Bevor wir jedoch in den Aufbau des Formulars und seiner Unterformulare einsteigen, ben&ouml;tigen wir noch die theoretischen Hintergr&uuml;nde zu der hier verwendeten Duplikatsuche.<\/p>\n<p><b>Aufbau der Abfrage zur Duplikatsuche<\/b><\/p>\n<p>Bevor wir uns um die Definition der f&uuml;r die Duplikatsuche ben&ouml;tigten Abfragen k&uuml;mmern, definieren wir die Anforderungen: Eine Abfrage zur Duplikatsuche soll alle Datens&auml;tze liefern, bei denen eine Kombination aus einem oder mehreren Feldern gleich ist, also zum Beispiel alle Datens&auml;tze, in denen Vor- und Nachname identisch sind.<\/p>\n<p>Wichtig ist, dass die Duplikatsuche nicht nur die f&uuml;r die Suche ber&uuml;cksichtigten Felder zur&uuml;ckliefert, sondern auch noch weitere, wie etwa den Prim&auml;rschl&uuml;sselwert der betroffenen Datens&auml;tze. Au&szlig;erdem wird der Benutzer die Daten der &uuml;brigen Felder sehen wollen, um zu entscheiden, welcher Datensatz gel&ouml;scht und welcher beibehalten werden soll.<\/p>\n<p>Damit k&ouml;nnen wir die ben&ouml;tigte Abfrage herleiten. Dabei brauchen wir zun&auml;chst einmal eine Abfrage, die alle Datens&auml;tze der betroffenen Tabelle sucht, die mehr als einmal vorkommen. Dazu muss die Abfrage zun&auml;chst einmal die Anzahl der Vorkommnisse einer jeden Kombination liefern. Eine solche Abfrage auf Basis der Tabelle <b>tblArtikel <\/b>aus der Beispieldatenbank erhalten Sie, wenn Sie zun&auml;chst die zu kombinierenden Felder hinzuf&uuml;gen (etwa <b>Vorname<\/b> und <b>Nachname<\/b>), die Abfrage nach diesen Feldern gruppieren und eines der beiden Felder zus&auml;tzlich als Basis einer Z&auml;hlung verwenden. In der Entwurfsansicht sieht dies wie in Bild 2 aus, der SQL-Ausdruck liefert dieses Bild:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Duplikatsucher-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Diese Abfrage zeigt die Anzahl aller vorhandenen Kombinationen aus Vor- und Nachnamen an.<\/span><\/b><\/p>\n<pre>SELECT Count(Vorname) AS AnzahlvonVorname,\r\nVorname, Nachname\r\nFROM tblAdressen\r\nGROUP BY Vorname, Nachname;<\/pre>\n<p>Uns interessieren nur diejenigen Datens&auml;tze dieser Abfrage, bei denen die Kombination aus Vor- und Nachname mehr als einmal vorkommt. Normalerweise w&uuml;rden Sie f&uuml;r den Vergleich mit einem Zahlenwert die <b>WHERE<\/b>-Klausel hinzuziehen. Wenn Sie aber nicht den Wert eines Feldes, sondern das Resultat einer Berechnung auf Basis einer Gruppierung als Kriterium verwenden m&ouml;chten, ben&ouml;tigen Sie dazu die <b>HAVING<\/b>-Klausel. Bezogen auf das obige Beispiel kommt dann Folgendes heraus:<\/p>\n<pre>SELECT Count(Vorname) AS AnzahlvonVorname,\r\nVorname, Nachname\r\nFROM tblAdressen\r\nGROUP BY Vorname, Nachname\r\nHAVING Count(Vorname)&gt;1;<\/pre>\n<p>Das Ergebnis dieser Abfrage finden Sie in Bild 3. Nun hilft dies nur bedingt, denn wir wollen ja nicht nur jeweils ein Exemplar der mehrfach vorhandenen Datens&auml;tze sehen, sondern alle &#8211; und noch dazu sollen auch die &uuml;brigen Daten der zugrunde liegenden Tabelle erscheinen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Duplikatsucher-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Zusammen mit einem entsprechenden Kriterium liefert die Abfrage alle Kombinationen aus Vor- und Nachname, die mehrmals vorkommen.<\/span><\/b><\/p>\n<p>Dies funktioniert nur, wenn wir die bereits hergeleitete Abfrage umbauen und als Unterabfrage einer weiteren Abfrage definieren. Die Hauptabfrage soll dann alle Datens&auml;tze der Herkunftstabelle anzeigen, deren Vor- und Nachname mit den in der Unterabfrage ermittelten Duplikaten &uuml;bereinstimmt.<\/p>\n<p>Nun erlaubt eine Unterabfrage aber nur die Ausgabe eines einzigen Feldes, das als Kriterium eines Feldes der Hauptabfrage dient. Wenn wir in diesem Fall den Wert des Feldes <b>Vorname <\/b>verwenden, w&uuml;rden wir alle Datens&auml;tze der Tabelle erhalten, deren Vornamen mit den in der Unterabfrage ermittelten Vornamen &uuml;bereinstimmen. Das hei&szlig;t aber, dass wir den Nachnamen komplett unter den Tisch fallen lie&szlig;en! Also gehen wir einen kleinen Umweg und legen in der Unterabfrage eine <b>WHERE<\/b>-Bedingung fest, mit der wir sicherstellen, dass die Hauptabfrage nur solche Datens&auml;tze anzeigt, deren Nachname mit dem Feld <b>Nachname<\/b> der Unterabfrage &uuml;bereinstimmt. Und dies sieht dann so aus:<\/p>\n<pre>SELECT AdresseID, AnredeID, Vorname, Nachname,\r\nFirma, Strasse, PLZ, Ort, Telefon, Telefax, Email\r\nFROM tblAdressen\r\nWHERE Vorname In (\r\nSELECT Vorname\r\nFROM tblAdressen\r\nGROUP BY Vorname, Nachname\r\nHAVING Count(Vorname)&gt;1)\r\n);<\/pre>\n<p>Das Ergebnis dieser Abfrage sieht, nach Hinzuf&uuml;gen einer Sortierung nach <b>Vorname<\/b> und <b>Nachname<\/b>, wie in Bild 4 aus. So viel zur Theorie &#8211; nun k&uuml;mmern wir uns um die Umsetzung in den angek&uuml;ndigten Assistenten. <\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Duplikatsucher-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Ausgabe aller mehrfach vorhandenen Datens&auml;tze in einer einzigen Abfrage<\/span><\/b><\/p>\n<p><b>Das Hauptformular<\/b><\/p>\n<p>Das Formular <b>frmDuplikatmanager <\/b>dient als Hauptformular der Anwendung. Es soll keine Daten anzeigen, also stellen Sie seine Eigenschaften <b>Trennlinien<\/b>, <b>Bildlaufleisten<\/b>, <b>Datensatzmarkierer <\/b>und <b>Navigationsleiste <\/b>auf <b>Nein <\/b>ein.<\/p>\n<p><!--30percent--><\/p>\n<p>Au&szlig;erdem soll das Formular beim &Ouml;ffnen zentriert erscheinen, was Sie durch Einstellen der Eigenschaft <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>erreichen. Das Formular beherbergt die folgenden Steuerelemente:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>cboTabellen<\/b>: Kombinationsfeld zur Auswahl der zu untersuchenden Tabelle<\/li>\n<li class=\"aufz-hlung\"><b>sfmDuplikatfelder<\/b>: Unterformularsteuerelement zur Anzeige der Felder der mit dem Kombinationsfeld <b>cboTabellen <\/b>ausgew&auml;hlten Tabelle. Das Unterformularsteuerelement zeigt das Formular <b>sfmDuplikatfelder <\/b>an.<\/li>\n<li class=\"aufz-hlung\"><b>cmdDuplikateSuchen<\/b>: Schaltfl&auml;che, um die in der angegebenen Tabelle enthaltenen Duplikate entsprechend den f&uuml;r die Duplikatsuche ausgew&auml;hlten Feldern zu ermitteln.<\/li>\n<li class=\"aufz-hlung\"><b>sfmDuplikate<\/b>: Unterformularsteuerelement zur Anzeige der gefundenen Kombinationen der angegebenen Felder samt Anzahl der Duplikate. Enth&auml;lt das flexibel mit Daten zu f&uuml;llende Formular <b>sfmFlex<\/b>. Als Datenherkunft dient die erst zur Laufzeit erstellte Abfrage <b>_qryDuplikate<\/b>.<\/li>\n<li class=\"aufz-hlung\"><b>sfmDuplikatdetails<\/b>: Unterformularsteuerelement zur Anzeige der Details des im Unterformularsteuerelement <b>sfmDuplikate <\/b>ausgew&auml;hlten Eintrags. Enth&auml;lt kein Formular als Herkunftsobjekt, sondern die Abfrage <b>_qryDuplikateDetail<\/b>, die dynamisch auf Basis der gemachten Angaben erstellt wird.<\/li>\n<\/ul>\n<p>Die Anwendung enth&auml;lt einige weitere Objekte, die f&uuml;r die Ausf&uuml;hrung unentbehrlich sind:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Tabelle <b>tblDuplikatfelder <\/b>speichert alle Felder, die in der mit dem Kombinationsfeld <b>cboTabellen <\/b>ausgew&auml;hlten Tabelle enthalten sind. Gef&uuml;llt mit den Feldern einer einfachen Adressentabelle sieht die Tabelle etwa wie in Bild 5 aus.<\/li>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/Duplikatsucher-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Diese Tabelle speichert Informationen &uuml;ber die f&uuml;r die Duplikatsuche zu verwendenden Felder der betroffenen Tabelle.<\/span><\/b><\/p>\n<li class=\"aufz-hlung\">Das Formular <b>sfmDuplikatfelder <\/b>zeigt die Daten dieser Tabelle an und dient als Unterformular des Formulars <b>frmDuplikatmanager<\/b>. Die Eigenschaft <b>Standardansicht <\/b>ist auf <b>Datenblatt <\/b>eingestellt.<\/li>\n<li class=\"aufz-hlung\">Das Formular <b>sfmFlex <\/b>zeigt die gefundenen Duplikate inklusive Anzahl an. Dieses Formular wird je nach den in der Tabelle <b>tblDuplikatefelder <\/b>festgelegten Feldern dynamisch gef&uuml;llt. Eine ausf&uuml;hrliche Beschreibung dieses Formulars finden Sie im Beitrag <b>Flexibles Unterformular <\/b>(<b>www.access-im-unternehmen.de\/743<\/b>).<\/li>\n<li class=\"aufz-hlung\">Die beiden Abfragen <b>_qryDuplikate <\/b>und <b>_qryDuplikateDetail <\/b>werden jeweils zur Laufzeit erstellt und basieren auf den Feldern der zu untersuchenden Tabelle, die in der Tabelle <b>tblDuplikatfelder <\/b>in den Spalten <b>Duplikatfeld <\/b>und <b>FeldAnzeigen <\/b>festgelegt wurden.<\/li>\n<\/ul>\n<p><b>Initialisieren des Hauptformulars<\/b><\/p>\n<p>Das Hauptformular f&uuml;hrt gleich beim &Ouml;ffnen einige Aufgaben durch, die im Wesentlichen in der Prozedur stattfinden, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird (s. <a href=\"#anker-30-anchor\">Listing 1<\/a>).<\/p>\n<p class=\"listingueberschrift\">Listing 1: Diese Prozedur wir beim Laden des Formulars frmDuplikatmanager ausgel&ouml;st.<\/p>\n<pre>Private Sub Form_Load()\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    db.Execute &quot;DELETE FROM tblDuplikatfelder&quot;, dbFailOnError\r\n    Me!sfmDuplikatfelder.Form.Requery\r\n    Set frm_sfmDuplikate = Me!sfmDuplikate.Form\r\n    frm_sfmDuplikate.OnCurrent = &quot;[Event Procedure]&quot;\r\n    Set objCW_Duplikatfelder = New clsColumnWidths\r\n    Set objCW_Duplikatfelder.Subform = Me!sfmDuplikatfelder.Form\r\n    Set objCW_Duplikate = New clsColumnWidths\r\n    Set objCW_Duplikate.Subform = Me!sfmDuplikate.Form\r\n    Set objCW_DuplikateDetail = New clsColumnWidths\r\n    Set db = CurrentDb\r\nEnd Sub<\/pre>\n<p>Als Erstes l&ouml;scht diese Prozedur den Inhalt der Tabelle <b>tblDuplikatfelder<\/b>, die noch Daten von vorherigen Eins&auml;tzen enthalten k&ouml;nnte. Danach aktualisiert sie den Inhalt des Unterformulars <b>sfmDuplikatfelder<\/b>, das genau die Daten der soeben geleerten Tabelle anzeigt.<\/p>\n<p>Die &uuml;brigen Schritte liefern die Grundlage f&uuml;r Funktionen, die erst sp&auml;ter ausgef&uuml;hrt werden. Eine davon betrifft das flexible Formular <b>sfmFlex<\/b>, das im Unterformularsteuerelement <b>sfmDuplikate <\/b>angezeigt wird. Es soll daf&uuml;r sorgen, dass bei der Auswahl eines der Datens&auml;tze dieses Unterformulars ein Ereignis im Hauptformular ausgel&ouml;st wird, damit die Daten im Unterformular <b>sfmDuplikateDetail <\/b>aktualisiert werden k&ouml;nnen. Zu diesem Zweck definieren wir im Kopf des Moduls die folgende Objektvariable:<\/p>\n<pre>Dim WithEvents\r\nfrm_sfmDuplikate As Form<\/pre>\n<p>Mit dem Schl&uuml;sselwort <b>WithEvents <\/b>sorgen wir daf&uuml;r, dass wir im aktuellen Klassenmodul Ereignisprozeduren f&uuml;r das referenzierte Formular-Objekt eintragen k&ouml;nnen. Dazu f&uuml;llen wir im Ereignis <b>Beim Laden <\/b>des Formulars zun&auml;chst die Objektvariable mit einem Verweis auf das Unterformular:<\/p>\n<pre>Set frm_sfmDuplikate = Me!sfmDuplikate.Form<\/pre>\n<p>Dann f&uuml;llen wir die Eigenschaft <b>OnCurrent <\/b>dieses Objekts mit dem Wert <b>[Event Procedure]<\/b>. Access wie&szlig; so, dass es in den Klassenmodulen, die das im Unterformular enthaltene Formular referenzieren, nach entsprechenden Ereignisprozeduren suchen soll:<\/p>\n<pre>frm_sfmDuplikate.OnCurrent = &quot;[Event Procedure]&quot;<\/pre>\n<p>Auf die entsprechende Ereignisprozedur kommen wir weiter unten zu sprechen. Bis dahin schauen wir uns drei weitere Objektvariablen an, welche die Prozedur <b>Form_Load <\/b>mit Leben f&uuml;llt. Dies ist ihre Deklaration im Modulkopf: <\/p>\n<pre>Dim objCW_Duplikatfelder As clsColumnWidths\r\nDim objCW_Duplikate As clsColumnWidths\r\nDim objCW_DuplikateDetail As clsColumnWidths<\/pre>\n<p>Alle Drei instanzieren die Klasse <b>clsColumnWidths<\/b>, welche eine Methode liefert, die Spaltenbreiten eines Unterformulars zu optimieren. Die technischen Hintergr&uuml;nde dokumentiert der Beitrag <b>Datenblatt-Spaltenbreiten automatisch anpassen <\/b>(<b>www.access-im-unternehmen.de\/740<\/b>). An dieser Stelle reicht es, wenn Sie wissen, dass wir f&uuml;r jedes Unterformular im Formular <b>frmDuplikatmanager <\/b>eine Instanz dieser Klasse erzeugen und der Eigenschaft <b>Form <\/b>dieser Klasse jeweils einen Verweis auf das entsprechende Unterformular zuweisen &#8211; zum Beispiel so:<\/p>\n<pre>Set objCW_Duplikatfelder = New clsColumnWidths\r\nSet objCW_Duplikatfelder.Subform = Me!sfmDuplikatfelder.Form<\/pre>\n<p>Zu gegebener Zeit rufen wir dann die Methode <b>OptimizeColumnWidth<\/b> auf &#8211; aktuell ist es noch zu fr&uuml;h, weil die Unterformulare ohnehin noch keine Daten enthalten.<\/p>\n<p><b>Auswahl der Tabelle mit Duplikaten<\/b><\/p>\n<p>Das Kombinationsfeld <b>cboTabellen <\/b>bietet alle Tabellen der aktuellen Datenbank mit Ausnahme der Objekttabellen zur Auswahl an. Dazu haben wir die <b>Datensatzherkunft <\/b>des Kombinationsfeldes auf den folgenden Ausdruck eingestellt:<\/p>\n<pre>SELECT Name FROM MSysObjects WHERE Name Not Like ''Msys*'' And Name Not Like ''Usys*'' And Type=1;<\/pre>\n<p>Das Ausw&auml;hlen einer der angezeigten Tabellen l&ouml;st die Prozedur aus <a href=\"#anker-32-anchor\">Listing 2<\/a> aus. Die Prozedur l&ouml;scht zun&auml;chst den Inhalt der Tabelle <b>tblDuplikatfelder<\/b>. Danach durchl&auml;uft sie in einer <b>For Each<\/b>-Schleife alle Felder der ausgew&auml;hlten Tabelle. Dabei f&uuml;hrt sie f&uuml;r jedes Feld eine Anf&uuml;geabfrage aus, die der Tabelle <b>tblDuplikatfelder <\/b>jeweils einen Datensatz hinzuf&uuml;gt. Dabei f&uuml;llt sie das Feld <b>Feldname <\/b>logischerweise mit dem Namen des Feldes und das Feld <b>FeldAnzeigen <\/b>mit dem Wert <b>True<\/b>. Das <b>Ja\/Nein<\/b>-Feld <b>Duplikatfeld <\/b>wird nicht ber&uuml;cksichtigt &#8211; der Benutzer soll im n&auml;chsten Schritt selbst festlegen, welche Felder auf Duplikate hin untersucht werden sollen.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Die Auswahl einer Tabelle im Kombinationsfeld cboTabellen l&ouml;st diese Prozedur aus.<\/p>\n<pre>Private Sub cboTabellen_AfterUpdate()\r\n    Dim db As DAO.Database\r\n    Dim fld As DAO.Field\r\n    Dim tdf As DAO.TableDef\r\n    Set db = CurrentDb\r\n    Set tdf = db.TableDefs(Me!cboTabellen)\r\n    db.Execute &quot;DELETE FROM tblDuplikatfelder&quot;, dbFailOnError\r\n    For Each fld In tdf.Fields\r\n        db.Execute &quot;INSERT INTO tblDuplikatfelder(Feldname, _\r\n        FeldAnzeigen) VALUES(''&quot; &amp; fld.name &amp; &quot;'', True)&quot;, dbFailOnError\r\n    Next fld\r\n    Me!sfmDuplikatfelder.Form.Requery\r\n    objCW_Duplikatfelder.OptimizeColumnWidths\r\nEnd Sub<\/pre>\n<p>Die folgende Anweisung aktualisiert das Unterformular <b>sfmDuplikatfelder<\/b>, damit dieses die Inhalte der frisch gef&uuml;llten Tabelle <b>tblDuplikatefelder <\/b>anzeigt, und ruft die Methode <b>OptimizeColumnWidths <\/b>f&uuml;r dieses Unterformular auf.<\/p>\n<p><b>Duplikate suchen<\/b><\/p>\n<p>Nachdem das Unterformular gef&uuml;llt und aktualisiert ist, kann der Benutzer die Felder f&uuml;r die Duplikatsuche ausw&auml;hlen und die Schaltfl&auml;che <b>cmdDuplikateSuchen <\/b>bet&auml;tigen, um die Suche zu starten. Die Prozedur &ouml;ffnet zun&auml;chst eine Datensatzgruppe, die alle Datens&auml;tze der Tabelle <b>tblDuplikatfelder <\/b>enth&auml;lt, f&uuml;r die der Benutzer in der Spalte <b>Duplikatfeld <\/b>einen Haken gesetzt hat.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Nach einem Klick auf die Schaltfl&auml;che Duplikate suchen startet diese Prozedur.<\/p>\n<pre>Private Sub cmdDuplikateSuchen_Click()\r\n    Dim db As DAO.Database\r\n    Dim qdf As DAO.QueryDef\r\n    Dim strSQL As String\r\n    Dim strDuplikatfelder As String\r\n    Dim strAnzahlfeld As String\r\n    Dim rstDuplikatfelder As DAO.Recordset\r\n    Set db = CurrentDb\r\n    Set rstDuplikatfelder = db.OpenRecordset(&quot;SELECT * FROM tblDuplikatfelder &quot; _\r\n        &amp; &quot;WHERE Duplikatfeld = True&quot;, dbOpenDynaset)\r\n    If rstDuplikatfelder.EOF Then\r\n        MsgBox &quot;Bitte w&auml;hlen Sie mindestens ein Feld aus, das als Kriterium f&uuml;r die &quot; _\r\n            &amp; &quot;Duplikatsuche dienen soll.&quot;\r\n        Exit Sub\r\n    End If\r\n    strAnzahlfeld = rstDuplikatfelder!Feldname\r\n    Do While Not rstDuplikatfelder.EOF\r\n        strDuplikatfelder = strDuplikatfelder &amp; rstDuplikatfelder!Feldname &amp; &quot;,&quot;\r\n        rstDuplikatfelder.MoveNext\r\n    Loop\r\n    strDuplikatfelder = Left(strDuplikatfelder, Len(strDuplikatfelder) - 1)\r\n    strSQL = &quot;SELECT Count(&quot; &amp; strAnzahlfeld &amp; &quot;) AS Duplikatanzahl, &quot;\r\n    strSQL = strSQL &amp; strDuplikatfelder &amp; &quot; FROM &quot; &amp; Me!cboTabellen\r\n    strSQL = strSQL &amp; &quot; GROUP BY &quot; &amp; strDuplikatfelder &amp; &quot; HAVING Count(&quot; &amp; strAnzahlfeld &amp; &quot;) &gt; 1&quot;\r\n    If Not IsNull(Me!cboTabellen) Then\r\n        On Error Resume Next\r\n        db.QueryDefs.Delete &quot;_qryDuplikate&quot;\r\n        On Error GoTo 0\r\n        db.QueryDefs.Refresh\r\n        Set qdf = db.CreateQueryDef(&quot;_qryDuplikate&quot;, strSQL)\r\n        Me!sfmDuplikate.Form.FillFlexForm &quot;_qryDuplikate&quot;\r\n        Me!sfmDuplikate.Form.Requery\r\n        objCW_Duplikate.OptimizeColumnWidths\r\n    End If\r\nEnd Sub<\/pre>\n<p>Nach einer Pr&uuml;fung, ob &uuml;berhaupt ein Eintrag ausgew&auml;hlt wurde, wird der Name des ersten betroffenen Feldes in der Variablen <b>strAnzahlfeld <\/b>zwischengespeichert. Dieses wird sp&auml;ter zum Z&auml;hlen der Datens&auml;tze mit der <b>HAVING Count(&lt;Feldname&gt;)<\/b>-Klausel verwendet &#8211; wir haben dies weiter oben in den theoretischen Grundlagen der verwendeten Abfragen erl&auml;utert. <\/p>\n<p>Danach durchl&auml;uft eine <b>Do While<\/b>-Schleife alle gefundenen Datens&auml;tze und stellt aus den Feldnamen einen Ausdruck wie <b>Vorname, Nachname, <\/b>zusammen. Eine weitere Anweisung entfernt hier noch das hintere Komma dieses Ausdrucks. Die folgenden Anweisungen stellen den als Datenherkunft dienenden SQL-Ausdruck zusammen &#8211; zum Beispiel so:<\/p>\n<pre>SELECT Count(Vorname) AS Duplikatanzahl, Vorname, Nachname FROM tblAdressen GROUP BY \r\nVorname, Nachname HAVING (Count(Vorname))&gt;1;<\/pre>\n<p>Auf Basis dieses SQL-Ausdrucks erzeugt die Prozedur nun eine neue Abfrage namens <b>_qryDuplikate <\/b>&#8211; nicht, ohne eine eventuell bestehende, gleichnamige Abfrage zu l&ouml;schen. Diese Abfrage wird dann der Methode <b>FillFlexForm<\/b> des als Unterformular verwendeten Formulars <b>sfmFlex <\/b>zugewiesen. Nach dem Aufruf der <b>Requery<\/b>-Methode dieses Formulars sowie dem Optimieren der Spaltenbreiten ist das Unterformular <b>sfmFlex <\/b>mit den gew&uuml;nschten Daten gef&uuml;llt.<\/p>\n<p><b>Anzeigen der Duplikatdetails<\/b><\/p>\n<p>Fehlt nur eine letzte Prozedur, die daf&uuml;r sorgt, dass nach einem Klick auf einen der Eintr&auml;ge der gefundenen Duplikat-Kombinationen die betroffenen Datens&auml;tze im Unterformular <b>sfmDuplikatdetails <\/b>angezeigt werden.<\/p>\n<p>Diese Prozedur (s. <a href=\"#anker-34-anchor\">Listing 4<\/a>) arbeitet so &auml;hnlich wie die zum Anzeigen der Duplikate selbst. Als Erstes erzeugt die Prozedur eine Datensatzgruppe, die ebenfalls auf der Tabelle <b>tblDuplikatfelder <\/b>basiert, diesmal allerdings alle Datens&auml;tze liefern soll, die der Benutzer in der Spalte <b>FeldAnzeigen <\/b>aktiviert beziehungsweise nicht deaktiviert hat. Auch diese Datens&auml;tze durchl&auml;uft die Prozedur nur zum Zusammenstellen einer weiteren SQL-Abfrage. Diesmal entsteht beim Durchlaufen einer <b>Do While<\/b>-Schleife &uuml;ber die Datens&auml;tze des Recordsets ein Ausdruck, der alle durch Kommata voneinander getrennten Felder enth&auml;lt, die im Unterformular angezeigt werden sollen:<\/p>\n<pre>AdresseID,AnredeID,Vorname,Nachname,Firma,Strasse,PLZ,Ort,Telefon,Telefax,Email,Aktiv,<\/pre>\n<p class=\"listingueberschrift\">Listing 4: Schlie&szlig;lich zeigt diese Prozedur die Details ausgew&auml;hlter Duplikate an.<\/p>\n<pre>Private Sub frm_sfmDuplikate_Current()\r\n    ''...Variablendeklaration aus Platzgr&uuml;nden nicht abgedruckt\r\n    Set db = CurrentDb\r\n    Set rstAnzeigefelder = db.OpenRecordset(&quot;SELECT Feldname FROM tblDuplikatfelder &quot; _\r\n        &amp; &quot;WHERE FeldAnzeigen = True&quot;, dbOpenDynaset)\r\n    If rstAnzeigefelder.EOF Then\r\n        MsgBox &quot;Bitte w&auml;hlen Sie mindestens ein Feld aus, das in der Detailliste der Duplikate &quot; _\r\n               &amp; &quot;erscheinen soll.&quot;\r\n        Exit Sub\r\n    End If\r\n    Do While Not rstAnzeigefelder.EOF\r\n        strAnzeigefelder = strAnzeigefelder &amp; rstAnzeigefelder!Feldname &amp; &quot;,&quot;\r\n        rstAnzeigefelder.MoveNext\r\n    Loop\r\n    strAnzeigefelder = Left(strAnzeigefelder, Len(strAnzeigefelder) - 1)\r\n    Set rstDuplikatfelder = db.OpenRecordset(&quot;SELECT Feldname FROM tblDuplikatfelder &quot; _\r\n         &amp; &quot;WHERE Duplikatfeld = True&quot;, dbOpenDynaset)\r\n    Do While Not rstDuplikatfelder.EOF\r\n        On Error Resume Next\r\n        strWhere = strWhere &amp; rstDuplikatfelder!Feldname &amp; &quot;=''&quot; _\r\n            &amp; Me!sfmDuplikate.Form.Recordset.Fields(rstDuplikatfelder!Feldname) &amp; &quot;'' AND &quot;\r\n        If Not Err.Number = 0 Then\r\n            On Error GoTo 0\r\n            Exit Sub\r\n        End If\r\n        rstDuplikatfelder.MoveNext\r\n    Loop\r\n    If Len(strWhere) &gt; 0 Then\r\n        strWhere = Left(strWhere, Len(strWhere) - 4)\r\n    End If\r\n    On Error Resume Next\r\n    db.QueryDefs.Delete &quot;_qryDuplikateDetail&quot;\r\n    On Error GoTo 0\r\n    db.QueryDefs.Refresh\r\n    strSQL = &quot;SELECT &quot; &amp; strAnzeigefelder &amp; &quot; FROM &quot; &amp; Me!cboTabellen &amp; &quot; WHERE &quot; &amp; strWhere\r\n    Set qdf = db.CreateQueryDef(&quot;_qryDuplikateDetail&quot;, strSQL)\r\n    Me!sfmDuplikateDetails.SourceObject = &quot;Query._qryDuplikateDetail&quot;\r\n    Set objCW_DuplikateDetail.Subform = Me!sfmDuplikateDetails.Form\r\n    objCW_DuplikateDetail.OptimizeColumnWidths\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Danach erzeugt die Prozedur eine zweite Datensatzgruppe, die wiederum alle Datens&auml;tze der Tabelle <b>tblDuplikatfelder <\/b>durchl&auml;uft, die auf Duplikate hin untersucht werden sollen. Der dabei entstehende Ausdruck soll allerdings sp&auml;ter als <b>WHERE<\/b>-Klausel dienen und sieht beispielsweise so aus:<\/p>\n<pre>Vorname=''Achim'' AND Nachname=''Beck'' AND<\/pre>\n<p>Hier werden also nicht nur die Feldnamen hinzugezogen, sondern auch noch die entsprechenden Werte des Datensatzes, den der Benutzer soeben im Unterformular <b>sfmFlex <\/b>ausgew&auml;hlt hat. Zusammengefasst erzeugt die Prozedur eine SQL-Abfrage, die wie folgt aussieht:<\/p>\n<pre>SELECT AdresseID,AnredeID,Vorname,Nachname,Firma,Strasse,PLZ,Ort,Telefon,Telefax,Email,Aktiv FROM tblAdressen WHERE Vorname=''Achim'' AND Nachname=''Beck''<\/pre>\n<p>Auch diese SQL-Abfrage wird in Form einer richtigen Abfrage namens <b>_qryDuplikateDetail <\/b>gespeichert und anschlie&szlig;end dem Unterformularsteuerelement <b>sfmDuplikateDetail <\/b>mit dem folgenden Ausdruck als Herkunftsobjekt zugewiesen:<\/p>\n<pre>Me!sfmDuplikateDetails.SourceObject = _\r\n&quot;Query._qryDuplikateDetail&quot;<\/pre>\n<p>Sicher wissen Sie, dass Unterformularsteuerelemente auch Tabellen oder Abfragen als Herkunftsobjekt verwenden k&ouml;nnen &#8211; dies ist ein gutes Beispiel daf&uuml;r. Nach dem Zuweisen wird die Eigenschaft <b>Subform <\/b>der Objektvariablen <b>objCW_DuplikateDetail <\/b>mit einem Verweis auf dieses Unterformular gef&uuml;llt, damit wir im n&auml;chsten Schritt mit der Methode <b>OptimizeColumnWidths <\/b>f&uuml;r eine perfekte Einstellung der Spaltenbreiten sorgen k&ouml;nnen.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Diese L&ouml;sung vereinfacht das Finden und L&ouml;schen beziehungsweise Bearbeiten von Duplikaten deutlich. Sie brauchen lediglich die Objekte <b>tblDuplikatfelder<\/b>, <b>frmDuplikatemanager<\/b>, <b>sfmDuplikatfelder<\/b>, <b>sfmFlex <\/b>und <b>clsColumnWidths <\/b>in die Zielanwendung zu kopieren und k&ouml;nnen gleich alle enthaltenen Tabellen auf Duplikate hin untersuchen. Vor allem aber gibt es eine Menge Erweiterungsm&ouml;glichkeiten: Sie k&ouml;nnen diese L&ouml;sung beispielsweise in ein Add-In umwandeln, das in allen ge&ouml;ffneten Datenbanken automatisch zur Verf&uuml;gung steht, oder Sie erweitern die L&ouml;sung beispielsweise um eine &auml;hnlichkeitssuche, um auch &auml;hnlich geschriebene Duplikate aufzufinden.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Duplikatsucher.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{947CF2BC-0BDE-4AA9-B28E-F2FF3F115012}\/aiu_744.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>F&uuml;r die Suche nach Duplikaten bietet Access einen speziellen Abfrageassistenten. Dieser liefert nach einigen Schritten eine Abfrage, mit der Sie die Duplikate untersuchen k&ouml;nnen. Wer etwas flexibler sein m&ouml;chte und nach der Auswahl der betroffenen Tabelle und der zu untersuchenden Felder gleich ein Ergebnis erhalten will, wird in diesem Beitrag f&uuml;ndig. Und das Beste: Sie k&ouml;nnen die passenden Duplikate nicht nur gleich beim Anlegen der Parameter betrachten, sondern auch noch die Weiterverarbeitung in die Wege leiten.<\/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,44000020],"tags":[],"class_list":["post-55000744","post","type-post","status-publish","format-standard","hentry","category-662010","category-66052010","category-Tools"],"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>Duplikatsuche in Adressen - 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\/Duplikatsuche_in_Adressen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Duplikatsuche in Adressen\" \/>\n<meta property=\"og:description\" content=\"F&uuml;r die Suche nach Duplikaten bietet Access einen speziellen Abfrageassistenten. Dieser liefert nach einigen Schritten eine Abfrage, mit der Sie die Duplikate untersuchen k&ouml;nnen. Wer etwas flexibler sein m&ouml;chte und nach der Auswahl der betroffenen Tabelle und der zu untersuchenden Felder gleich ein Ergebnis erhalten will, wird in diesem Beitrag f&uuml;ndig. Und das Beste: Sie k&ouml;nnen die passenden Duplikate nicht nur gleich beim Anlegen der Parameter betrachten, sondern auch noch die Weiterverarbeitung in die Wege leiten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:07:50+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/e7261852352746c38841506651f51358\" \/>\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=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Duplikatsuche in Adressen\",\"datePublished\":\"2020-05-22T22:07:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/\"},\"wordCount\":3007,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/e7261852352746c38841506651f51358\",\"articleSection\":[\"2010\",\"5\\\/2010\",\"Tools\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/\",\"name\":\"Duplikatsuche in Adressen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/e7261852352746c38841506651f51358\",\"datePublished\":\"2020-05-22T22:07:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/e7261852352746c38841506651f51358\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/e7261852352746c38841506651f51358\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Duplikatsuche_in_Adressen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Duplikatsuche in Adressen\"}]},{\"@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":"Duplikatsuche in Adressen - 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\/Duplikatsuche_in_Adressen\/","og_locale":"de_DE","og_type":"article","og_title":"Duplikatsuche in Adressen","og_description":"F&uuml;r die Suche nach Duplikaten bietet Access einen speziellen Abfrageassistenten. Dieser liefert nach einigen Schritten eine Abfrage, mit der Sie die Duplikate untersuchen k&ouml;nnen. Wer etwas flexibler sein m&ouml;chte und nach der Auswahl der betroffenen Tabelle und der zu untersuchenden Felder gleich ein Ergebnis erhalten will, wird in diesem Beitrag f&uuml;ndig. Und das Beste: Sie k&ouml;nnen die passenden Duplikate nicht nur gleich beim Anlegen der Parameter betrachten, sondern auch noch die Weiterverarbeitung in die Wege leiten.","og_url":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:07:50+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/e7261852352746c38841506651f51358","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Duplikatsuche in Adressen","datePublished":"2020-05-22T22:07:50+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/"},"wordCount":3007,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/e7261852352746c38841506651f51358","articleSection":["2010","5\/2010","Tools"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/","url":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/","name":"Duplikatsuche in Adressen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/e7261852352746c38841506651f51358","datePublished":"2020-05-22T22:07:50+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/e7261852352746c38841506651f51358","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/e7261852352746c38841506651f51358"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Duplikatsuche_in_Adressen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Duplikatsuche in Adressen"}]},{"@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\/55000744","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=55000744"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000744\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}