Sie sind nun wieder eingeladen, die Diskussion spezieller technischer Probleme mit zu verfolgen. Bitte schicken Sie Fragen, Anregungen oder Antworten zu den vorgestellten Themen – ebenso wie Ihre Kritik – an unsere e-Mail-Adressen: dieter.bender@bender-dv.de oder Redaktion@MidrangeMagazin.de
Frage:
Wir haben in unserem Kundenstamm etliche Kunden mehrfach angelegt. Wie können wir diese Dubletten auffinden – oder noch besser ihre Anlage verhindern?
Antwort:
Bei automatischer Vergabe eines künstlichen Schlüssels in Form einer Kundennummer ist die mehrfache Anlage von Kunden – insbesondere bei der automatischen Anlage von Stammdaten aus Überleitungsdaten – nicht völlig vermeidbar. Soweit andere Kriterien einen Kunden eindeutig identifizieren, ist das doppelte Anlegen identischer Kunden bereits durch einen zusätzlichen eindeutigen Schlüssel vermeidbar. So ist in vielen Fällen sichergestellt, dass Firmenname und Ort einen eindeutigen Schlüssel bilden. Bei Endkundensätzen reicht dies sicher nicht aus, da muss zumindest noch um den Rest der Adresse erweitert werden.
Eine entsprechende Schlüsselbedingung lässt sich am einfachsten mit SQL anlegen. Dokumentiert geschieht das am besten in Form eines kleinen Skripts in einer normalen Quelldatei, die mit RUNSQLSTM ausgeführt werden kann. Die hier oft propagierte Verwendung des Operations Navigator ist allenfalls in einer Testumgebung als Alternative vertretbar. Im Produktionsumfeld muss das SQL-Statement als Quelle ohnehin dokumentiert werden.
Verhindert doppeltes Anlegen von Kunden:
CREATE UNIQUE INDEX #KUNDE01
ON #KUNDE
(
NACHNAME
, VORNAME
, ORT
)
Ein solcher eindeutiger Schlüssel verhindert, dass doppelte Sätze entstehen können, egal welcher Schlüssel für das eigentliche Einfügen verwendet wird. Selbstredend muss dann die Anwendung den entsprechenden Fehler beim Schreiben abfangen, der, beim Versuch einen doppelten Satz einzufügen, ausgelöst wird.
Finden lassen sich bereits vorhandene, mehrfach abgespeicherte Kunden am einfachsten mit SQL. Zum Löschen ist allerdings in der Regel ein Programm nötig, das die von diesen Kunden abhängigen Sätze dann auf den einzigen verbleibenden Kunden umhängt, bevor Dubletten gelöscht werden können. Am sichersten legt man sich zuvor eine entsprechende Constraint für die abhängigen Tabellen an.
Findet doppelte Kunden:
select *
from KUNDE a, KUNDE b
where a.NACHNAME = b.NACHNAME
and a.ORT = b.ORT
and a.KUNDE_ID <> b.KUNDE_ID
Eine zweite Klasse von mehrfach abgespeicherten Sätzen lässt sich so allerdings nicht verhindern. Das sind dann Sätze, die unterschiedlich sind, aber den gleichen Kunden meinen. Solche Sätze können entstehen durch abweichende Schreibweisen des Namens oder des Ortes. Es reichen bereits Abweichungen in der Klein- und Großschreibung oder etwa zusätzliche Blanks, ganz zu schweigen von leichten orthografischen Fehlern. Einige dieser Dubletten lassen sich vermeiden, indem man beim Schreiben der Sätze die Großschreibung standardisiert bereinigt und überflüssige Blanks entfernt, bevor man versucht zu schreiben. Eine automatische Bereinigung solcher Sätze ist schwierig, da es oft nicht gelingt in einem allgemeinen Regelwerk festzulegen, was an Ähnlichkeiten ausreicht, um zwei Sätze als gleich anzusehen.
Mit SQL-Möglichkeiten kann man allerdings Kandidaten für solche Sätze finden; dazu ist die Funktion SOUNDEX hilfreich, die ab V5R1 zur Verfügung steht. Diese Funktion liefert einen phonetischen Wert für einen Alfawert, der eine Aussage darüber erlaubt, was sich ähnlich anhört. Diese Funktion ist allerdings nicht sehr scharf und liefert relativ viele ähnliche Werte; es empfiehlt sich also ausreichend viele Spalten zu berücksichtigen, damit die Auswahl scharf genug wird.
Findet Kandidaten für doppelte Sätze:
select *
from KUNDE a, KUNDE b
where SOUNDEX(a.NACHNAME) = SOUNDEX(b.NACHNAME)
and SOUNDEX(a.ORT) = SOUNDEX(b.ORT)
and SOUNDEX(a.STRASSE) = SOUNDEX(b.STRASSE)
and a.KUNDE_ID <> b.KUNDE_ID
Diese Funktion, die nicht nur auf in DB2/400 und der restlichen DB2-Familie zum Einsatz kommt, basiert auf dem so genannten Soundex-Algorithmus. Dieser Algorithmus geht auf zwei ältere amerikanische Patente aus den 20er Jahren zurück und wurde für Sortierungen bei Volkszählungen entwickelt.
Der Soundex-Wert besteht aus vier Zeichen, unabhängig davon wie lang das zu verschlüsselnde Wort ist. Der erste Buchstabe des Wortes wird unverändert als Großbuchstabe übernommen, alle weiteren Zeichen sind Ziffern. Zu den Hauptregeln gehört, dass doppelte Zeichen nur einfach übertragen und Vokale weggelassen werden. Ebenfalls übergangen werden nationale Sonderzeichen sowie h, w und y. Die überbleibenden Konsonanten werden in sechs Gruppen geteilt, wobei eher ähnliche Laute in dieselbe Gruppe eingeordnet werden. Mehrere Konsonanten aus derselben Gruppe hintereinander werden wie Doppelkonsonanten behandelt, also nur einer wird mitgenommen. Bei vier übertragenen Zeichen wird abgeschnitten, kürzere Soundex-Werte werden mit Nullen auf vier Stellen aufgefüllt.
Dieser Algorithmus liefert bei der Suche nach doppelten Werten relativ gute Ergebnisse. Hauptschwäche für deutsche Wörter und Namen ist die Behandlung des „ß“, das wie ein Vokal behandelt wird, aber besser als „s“ behandelt werden sollte.
Hat man Bedarf an einer exakteren Methode zur Ermittlung doppelter Sätze, bietet es sich an, eine eigene Modifikation eines auf Soundex aufbauenden Algorithmus zu definieren und als User Defined Function zu hinterlegen. Diese kann dann genauso benutzt werden wie der Soundex-Algorithmus in SQL.
Den Autor Dieter Bender erreichen Sie unter der e-Mail-Adresse: dieter.bender@midrangemagazin.de