pixiAddressesFindDuplicates
Ermittelt wahrscheinliche Kundendubletten per unscharfem Adressabgleich in Blöcken von 2500 Adressen und speichert bewertete Kundenpaare in Addresses_Duplicates.
Batch-Job, der Kundendubletten durch Vergleich der Adressen erkennt. Es wird keine Ergebnismenge geliefert. Die Ergebnisse werden in die Tabelle Addresses_Duplicates geschrieben.
Zeitfenster
Die Prozedur arbeitet nur zwischen 21:00 und 06:59 Uhr Serverzeit. Liegt die aktuelle Stunde zwischen 7 und 20, wird eine Meldung ausgegeben und die Prozedur ohne weitere Aktion beendet. Einzige Ausnahme ist eine Session mit CONTEXT_INFO = 0x00999, die für Unit-Tests verwendet wird.
Ablauf
-
Legt die Hilfstabellen
tmp.Addresses_Processundtmp.Addresses_Simplean, falls sie noch nicht existieren. -
Bei
ReCreateAll= 1 werdenAddresses_Duplicates,tmp.Addresses_Simpleundtmp.Addresses_ProcessperTRUNCATEgeleert. Alle bisherigen Treffer werden gelöscht. -
Wählt bis zu 2500 Kunden-Hauptadressen (
Customers.AddrRef) als Kandidaten aus, neueste Adressnummer zuerst. Ein Kandidat muss alle folgenden Bedingungen erfüllen:- Er ist noch nicht in
tmp.Addresses_Simpleenthalten. - Seine Nummer liegt über der höchsten oder unter der niedrigsten bereits verarbeiteten Nummer.
- Der Kunde hat keinen Auftrag mit einem Auftragskopf-Attribut vom Typ 3 (archivierte Aufträge).
- Er ist noch nicht in
-
Entfernt Titel aus den Namen:
Frau,Herr,Prof.,Dipl.,Ing.,Mag.,med.,Dr.. Ist der Nachname leer, wird das FeldNameam ersten Leerzeichen in Vor- und Nachname aufgeteilt. -
Speichert eine vereinfachte Kopie jeder Adresse in
tmp.Addresses_Simple:- die ersten 3 Zeichen von
SOUNDEXfür Straße, Ort, Nachname, Vorname und CareOf (Firma); - die Quersumme der PLZ (
fCrossSum); - Adress-, Kunden- und Shop-ID.
- die ersten 3 Zeichen von
-
Markiert bis zu 2500 dieser Adressen in
tmp.Addresses_Processals verarbeitet, neueste zuerst. -
Vergleicht die neu verarbeiteten Adressen mit allen vereinfachten Adressen. Ein Paar gilt als Treffer, wenn alle folgenden Bedingungen erfüllt sind:
- anderer Kunde;
- gleicher Shop;
- gleicher Soundex-Code für Ort, Straße und CareOf;
- gleiche PLZ-Quersumme;
- gleiche Soundex-Codes für Vor- und Nachname, auch bei vertauschtem Vor- und Nachnamen.
Ein Kunde wird übersprungen, wenn er bereits als
CustRef1oderCustRef2inAddresses_Duplicatesvorkommt. -
Vergibt für jedes Paar eine Punktzahl (
MatchLevel). Sie ergibt sich als Summe dieser Teile:- Name: 40 vollständig, 30 vertauscht, 20 Soundex-Treffer, 10 schwacher Treffer oder abweichender Vorname;
- Straße: 20 vollständig, 10 teilweise, 5 schwach;
- Ort: 20 vollständig, 10 teilweise, 5 schwach;
- PLZ: 20 vollständig, 10 gleiche Quersumme;
- Firma (CareOf): 0 vollständig, -10 teilweise, -15 schwach.
MatchTextenthält die nicht vollständigen Treffer-Kennzeichen, z. B.STREET_PARTIAL_MATCH;, gekürzt auf 100 Zeichen. -
Fügt jedes neue Paar einmal ein.
CustRef1/AddrRef1ist der neu verarbeitete Kunde,CustRef2/AddrRef2der gefundene Kunde. Bereits vorhandene Paare werden in beiden Richtungen übersprungen. -
Enthält
tmp.Addresses_Simplenoch Adressen, die nicht intmp.Addresses_Processstehen, stellt die ProzedurEXEC pipiAddressesFindDuplicatesinExecQueriesein. So wird der Lauf im nächsten Block fortgesetzt.
Hinweise
- Keine Ergebnismenge: Der Aufruf liefert keine Zeilen. Informative Ausgaben erfolgen nur per
PRINT, z. B.RUN BEFORE 07:00 or AFTER 20:00tagsüber. Diese Meldungen erscheinen je nach Client alsSqlMessage. Ein Aufruf tagsüber wirkt daher erfolgreich, bewirkt aber nichts. - ReCreateAll tagsüber: Das Leeren bei
ReCreateAll= 1 erfolgt erst nach der Zeitprüfung. Tagsüber hat der Parameter keine Wirkung. - Fortsetzung: Der Folgelauf wird in
ExecQuerieseingestellt. Wie und wann diese Warteschlange ausgeführt wird, ist nicht Teil dieses Codes. Ein Kommentar nennt "1 Minute" sowie Läufe bis 7 Uhr. Die Blockgröße beträgt 2500 Adressen, obwohl ein Kommentar 100 erwähnt. - Permanente Hilfstabellen: Die Prozedur legt die permanenten Tabellen
tmp.Addresses_Simpleundtmp.Addresses_Processan und befüllt sie, um den Fortschritt zwischen den Läufen festzuhalten. - Keine Transaktion: Alle Lesezugriffe verwenden
NOLOCK, eine explizite Transaktion gibt es nicht. - Im Code erkennbare Fallstricke:
- Die Teilprüfung für Straße und Ort vergleicht eine Adresse mit sich selbst. Stimmen Straße oder Ort nicht exakt überein, ergibt sich daher immer
STREET_PARTIAL_MATCH;bzw.CITY_PARTIAL_MATCH;. Die_LOW-Varianten treten nie auf. - Die Paare werden je Summe der beiden Kunden-IDs (
s.CustRef + c.CustRef) nummeriert. Verschiedene Paare mit gleicher ID-Summe können daher entfallen, weil nur das erste übernommen wird. - Stimmen die Namen nur vertauscht per Soundex überein, aber nicht exakt vertauscht, bleibt die Namenskategorie leer.
MatchLevelundMatchTextwerden dann NULL.
- Die Teilprüfung für Straße und Ort vergleicht eine Adresse mit sich selbst. Stimmen Straße oder Ort nicht exakt überein, ergibt sich daher immer
- Laufzeit: Der Abgleich ist rechenintensiv. Ein Code-Kommentar warnt davor, die Blockgröße zu erhöhen.
Parameter
| Parameter | Typ | Standardwert | Beschreibung |
|---|---|---|---|
ReCreateAll
|
bit boolean |
0 |
Bei 1 werden alle vorhandenen Dublettentreffer und die Fortschrittstabellen gelöscht, und der Abgleich beginnt von vorn. Dies wirkt nur innerhalb des nächtlichen Zeitfensters. Erlaubte Werte
Beispiel: |
Antwort
Dieser Call liefert kein Result-Set.
Beispiele
POST https://apigateway.descartes.com/tms/pixi/
Content-Type: text/xml; charset=utf-8
Authorization: Basic BASE64(USERNAME:PASSWORD)
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://apigateway.descartes.com/tms/pixi/">
<SOAP-ENV:Body>
<ns1:pixiAddressesFindDuplicates>
<!-- <ReCreateAll>0</ReCreateAll> -->
</ns1:pixiAddressesFindDuplicates>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
curl -X POST 'https://apigateway.descartes.com/tms/pixi/' \
--user 'USERNAME:PASSWORD' \
--header 'Content-Type: text/xml; charset=utf-8' \
--data-binary @- <<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://apigateway.descartes.com/tms/pixi/">
<SOAP-ENV:Body>
<ns1:pixiAddressesFindDuplicates>
<!-- <ReCreateAll>0</ReCreateAll> -->
</ns1:pixiAddressesFindDuplicates>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
XML
<?php
$soapClient = new SoapClient(null, [
'login' => 'USERNAME',
'password' => 'PASSWORD',
'location' => 'https://apigateway.descartes.com/tms/pixi/',
'uri' => 'https://apigateway.descartes.com/tms/pixi/',
]);
$arguments = [
// 'ReCreateAll' => '0',
];
$soapArguments = [];
foreach ($arguments as $name => $value) {
$soapArguments[] = new SoapVar($value, XSD_STRING, '', '', $name);
}
$response = $soapClient->__soapCall('pixiAddressesFindDuplicates', $soapArguments);
Verwendete Tabellen
- SQL-Objekt:
- dbo.pipiAddressesFindDuplicates