Schon seit einer Weile drücke ich mich um dieses Thema herum: Beim Import der Adressen aus meinem Onlineshop in meine Kundendatenbank treten manchmal Fehler auf, die dazu führen, dass die Daten nicht konsistent sind. Außerdem hätte ich gern grundsätzlich eine Funktion, welche die Shopdaten mit der Kundendatenbank abgleicht – immerhin können Kunden dort ihre Daten ändern, ohne dass man es mitbekommt. In diesem Beitrag werfe ich nun einen genaueren Blick auf die Möglichkeiten zum Auffinden und Abgleichen inkonsistenter Adressdaten.
Die Grundlage für diesen Beitrag sind zwei Datenquellen mit Adressdaten, die eigentlich immer den gleichen Bestand aufweisen sollten. Noch besser wäre es natürlich, den Datenbestand nur an einem Ort zu pflegen, aber dies ist aus verschiedenen Gründen nicht möglich.
Im Onlineshop müssen die Daten vorliegen, damit der Benutzer darauf zugreifen kann, um die Daten zu ändern oder Aktionen mit seinem Benutzerkonto durchzuführen – beispielsweise das Auslösen neuer Bestellungen oder, im Falle meines Shops, das Abrufen von Downloads zu seinen Produkten.
Andererseits erfolgen die nach der Bestellung durchgeführten Schritte auf Basis der Daten einer Access-Datenbank, in die ich die Kundendaten und Bestelldaten einlese – also beispielsweise der Versand der Bestellung oder die Zusammenstellung der Rechnungslisten für die Buchhaltung.
Ich bin sicher, dass Ihre Kunden noch viel interessantere Gründe finden, die Daten nicht nur an einem Ort zu pflegen – geben wir also auf und programmieren einfach eine schöne Lösung zum Abgleichen der Adressdaten aus zwei verschiedenen Quellen.
Voraussetzung: Feld-zu-Feld-Zuordnung
Eine Grundlage für die Ermittlung von Inkonsistenzen ist, dass die Felder der Datenquelle, in diesem Fall also der Datenbank des Onlineshops, sich den Feldern des Ziels für die Daten, also der Kundendatenbank, zuweisen lassen. Die Daten müssen nicht auf beiden Seiten genau gleich strukturiert sein und dürfen durchaus auf verschiedene Tabellen aufgeteilt sein. Sie müssen sich aber durch geschickte Formulierung von Abfragen so umwandeln lassen, dass die Daten sich in einer gleichen Struktur darstellen lassen.
Voraussetzung: Zuordnung per Schlüssel
Die zweite Grundlage ist, dass die Datensätze bereits einander zugeordnet sind. In diesem Fall handhabe ich es so, dass ich einen neuen Kundendatensatz aus dem Onlineshop in die Kundendatenbank übertrage und dabei ein Feld etwa namens Kundennummer-ImShop verwende, um diesen Kundendatensatz dem entsprechenden Kundendatensatz des Shops zuzuweisen.
Auf diese Weise lässt sich auch leicht prüfen, ob ein Kundendatensatz aus dem Shop überhaupt schon in die lokale Kundendatenbank eingelesen wurde – liegt dort noch kein Datensatz vor, dessen Feld KundennummerInShop die Kundennummer aus dem Shop aufweist, handelt es sich offensichtlich um einen neuen Kunden, der erst noch angelegt werden muss.
Flexible Zuordnung
Wie immer möchten wir eine möglichst flexible und anpassbare Lösung programmieren. Das heißt, dass wir zunächst die beiden Tabellen oder Abfragen auswählen können wollen, welche die Daten aus dem Shop und aus der Kundendatenbank liefern. Dann wollen wir alle Felder, die auf Unterschiede geprüft werden sollen, festlegen und einander zuordnen können. Das heißt, dass wir für jedes Feld der Shopdatenbank, das wir abgleichen wollen, das entsprechende Feld der Kundendatenbank festlegen müssen.
Um überhaupt einen Datensatz der Kundendatenbank einem Datensatz der Shopdatenbank zuordnen zu können, müssen wir natürlich auch noch das Primärschlüsselfeld der Tabelle aus der Shopdatenbank und das entsprechende Verknüpfungsfeld (bisher KundennummerImShop genannt) auswählen.
Dies ist nur die Konfiguration, die wir in Tabellen speichern wollen, damit Sie diese jederzeit anpassen können. Außerdem benötigen wir natürlich eine entsprechende Benutzeroberfläche, damit Sie die Informationen für den Abgleich leicht auswählen können. Dies ist jedoch der leichtere Teil dieser Lösung.
Die Optionen stellen Sie mit dem Formular frmAbgleichoptionen. Dieses sieht wie in Bild 1 aus und bietet ganz oben zunächst zwei Kombinationsfelder, mit denen Sie die Originaltabelle auswählen und die abzugleichende Tabelle.
Bild 1: Einstellen der Optionen
Direkt darunter finden Sie ein Kombinationsfeld zum Auswählen des Primärschlüsselfeldes der Originaltabelle. Für die abzugleichende Tabelle wählen Sie ebenfalls ein Feld aus, und zwar das, über das die Tabelle mit der Originaltabelle verknüpft ist.
In diesem Beispiel haben wir einfach eine Kundentabelle namens tblKunden_Original mit ein paar Feldern und einigen Beispieldatensätzen erstellt und eine Kopie dieser Tabelle namens tblKunden angelegt – gefüllt mit den gleichen Daten. Dann haben wir einige Datensätze einer der beiden Tabellen geändert.
Wir haben der Tabelle tblKunden also kein spezielles Feld hinzugefügt, mit dem ein Datensatz dem entsprechenden Datensatz der Tabelle tblKunden_Original zugeordnet werden kann – dies ist in diesem Fall nicht nötig, da diese ja die gleichen Primärschlüsselwerte wie die Originaltabelle enthält. Dies ist also auch eine Konfigurationsvariante – Sie können so zwei Versionen einer Tabelle miteinander vergleichen.
Hier wählen Sie also für beide Tabellen das Feld KundeID für den Abgleich aus. Danach müssen Sie festlegen, welche Felder verglichen und auch angezeigt werden sollen. Dies erledigen Sie mit dem Unterformular darunter, wo jeder Datensatz jeweils ein Feld der ersten Tabelle und das abzugleichende Feld der zweiten Tabelle aufnimmt.
Wenn Sie die Tabellen oder Abfragen so gestaltet haben, dass die Feldnamen übereinstimmen, können Sie mit einem Klick auf die Schaltfläche Automatisch erkennen eine Menge Zeit sparen – die dahinter liegende Prozedur weist identische Feldnamen dann einfach einander zu. Das Ergebnis sieht dann schließlich wie in der Abbildung aus.
Daten abgleichen
Der kompliziertere Teil ist der eigentliche Abgleich der Daten. Dabei soll ein Formular in einem Listenfeld alle Datensätze der abzugleichenden Tabelle anzeigen, die nicht genau mit den Daten aus der Originaltabelle übereinstimmen.
Klickt der Benutzer nun auf einen dieser Datensätze, sollen die Daten aus der Originaltabelle und die aus der abzugleichenden Tabelle im unteren Bereich des Formulars nebeneinander angezeigt werden. Die Felder mit unterschiedlichen Inhalten sollen dabei auf irgendeine Weise hervorgehoben werden – beispielsweise durch eine entsprechende Hintergrundfarbe. Der Benutzer soll nun drei Optionen haben:
- übernahme der Daten aus der Originaltabelle in die abzugleichende Tabelle (zum Beispiel erforderlich, wenn der Kunde eines Onlineshops die Daten in seinem Kundenbereich geändert hat und diese in die lokale Kundendatenbank übertragen werden sollen)
- übernahme der Daten aus der abzugleichenden Tabelle in die Originaltabelle (hilfreich, wenn der Kunde etwa angerufen hat, um eine Adressänderung mitzuteilen und diese in der lokalen Kundendatenbank vorgenommen wurde)
- übernahme des Inhalts eines oder mehrerer Felder von der Originaltabelle in die abzugleichende Tabelle oder umgekehrt, bis die Daten aus beiden Datenbanken übereinstimmen
Das Formular sieht nun etwa wie in Bild 2 aus. Hier sehen Sie im oberen Listenfeld bereits die Datensätze der Tabelle tblKunden, die sich vom zugeordneten Datensatz aus der Tabelle tblKunden_Original unterscheiden. Klicken Sie einen der Einträge im Listenfeld an, zeigt der untere Bereich die Felder beider Datensätze nebeneinander an. Dabei werden die Felder, die sich unterscheiden, farbig hervorgehoben.
Bild 2: Formular zum Abgleichen der Unterschiede zwischen zwei Datensätzen aus verschiedenen Tabellen
Danach können Sie aktiv werden:
- Ein Klick auf die linke Schaltfläche Alle abgleichen überträgt alle Werte des linken Unterformulars in das rechte.
- Ein Klick auf die rechte Schaltfläche Alle abgleichen übernimmt die Werte aus dem rechten Unterformular.
- Ein Doppelklick auf einen der grau markierten Einträge fügt diesen Wert in das entsprechende Feld auf der anderen Seite ein.
Damit können Sie alle gewünschten änderungen vornehmen, um die Datensätze anzugleichen.
Dies gelingt natürlich nicht, wenn Sie beispielsweise als Originaltabelle auf der linken Seite eine Abfrage verwenden, die auf komplizierte Weise die Tabellen eines Shopsystems abbildet und dadurch nicht aktualisierbar ist – in diesem Fall gelingt die Anpassung nur in Richtung der im rechten Bereich dargestellten Daten.
Formularaufbau
Die Gestaltung des Formulars ist so interessant, weil es eigentlich kein Steuerelement gibt, mit dem man so einfach zwei Datensätze nebeneinander anzeigen kann.
Wir könnten zwar vielleicht zwei Unterformulare verwenden, allerdings sollten diese auch nicht allzu hoch sein: Wenn Sie dann nämlich den Inhalt des einen Unterformulars nach oben scrollen, um den unteren Bereich zu sehen, bleibt das andere stehen und zeigt die Daten nicht passend zum anderen Unterformular an.
Also machen wir es so: Wir legen zwei Unterformulare, die hoch genug sind, in einem weiteren Unterformular an, das wir wiederum nach oben und nach unten scrollen können. Diesen beiden Unterformularen weisen wir einige Textfelder zu, die wir allerdings nicht mit einem festen Steuerelementinhalt versehen, da wir die für den Abgleich zu verwendenden Felder ja gegebenenfalls flexibel anpassen wollen.
Um genau zu sein, brauchen wir sogar nur ein Unterformular anzuzeigen, dass wir dann zweimal in das übergeordnete Unterformular einfügen und mit verschiedenen Datenherkünften versehen.
Unterformular für die Felder erstellen
Das Unterformular für die Felder soll sfmAbgleichfelder heißen und 20 Textfelder enthalten. Diese benennen wir mit dem Präfix txt und einer laufenden Nummer im zweistelligen Format (also txt01 bis txt20). Platzieren Sie die Textfelder wie in Bild 3 so, dass diese mit den Rändern des Formulars abschließen. Sie sollen lediglich ein Pixel Abstand vom linken Rand des Formulars erhalten, damit der linke Rand der Textfelder nicht verdeckt wird.
Bild 3: Unterformular zur Darstellung der Feldinhalte eines Datensatzes
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo