Postman-Collection
Customers Schreiben

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

  1. Legt die Hilfstabellen tmp.Addresses_Process und tmp.Addresses_Simple an, falls sie noch nicht existieren.

  2. Bei ReCreateAll = 1 werden Addresses_Duplicates, tmp.Addresses_Simple und tmp.Addresses_Process per TRUNCATE geleert. Alle bisherigen Treffer werden gelöscht.

  3. 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_Simple enthalten.
    • 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).
  4. Entfernt Titel aus den Namen: Frau, Herr, Prof., Dipl., Ing., Mag., med., Dr.. Ist der Nachname leer, wird das Feld Name am ersten Leerzeichen in Vor- und Nachname aufgeteilt.

  5. Speichert eine vereinfachte Kopie jeder Adresse in tmp.Addresses_Simple:

    • die ersten 3 Zeichen von SOUNDEX für Straße, Ort, Nachname, Vorname und CareOf (Firma);
    • die Quersumme der PLZ (fCrossSum);
    • Adress-, Kunden- und Shop-ID.
  6. Markiert bis zu 2500 dieser Adressen in tmp.Addresses_Process als verarbeitet, neueste zuerst.

  7. 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 CustRef1 oder CustRef2 in Addresses_Duplicates vorkommt.

  8. 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.

    MatchText enthält die nicht vollständigen Treffer-Kennzeichen, z. B. STREET_PARTIAL_MATCH;, gekürzt auf 100 Zeichen.

  9. Fügt jedes neue Paar einmal ein. CustRef1/AddrRef1 ist der neu verarbeitete Kunde, CustRef2/AddrRef2 der gefundene Kunde. Bereits vorhandene Paare werden in beiden Richtungen übersprungen.

  10. Enthält tmp.Addresses_Simple noch Adressen, die nicht in tmp.Addresses_Process stehen, stellt die Prozedur EXEC pipiAddressesFindDuplicates in ExecQueries ein. 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:00 tagsüber. Diese Meldungen erscheinen je nach Client als SqlMessage. 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 ExecQueries eingestellt. 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_Simple und tmp.Addresses_Process an 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. MatchLevel und MatchText werden dann NULL.
  • 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

  • 0 – Inkrementell mit dem nächsten Block unverarbeiteter Adressen fortfahren.
  • 1 – Addresses_Duplicates und die Hilfstabellen leeren und neu beginnen.

Beispiel: 0

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>

Verwendete Tabellen

Customers · Lesen Addresses · Lesen OrderHeader · Lesen OrderHeaderAttribute · Lesen Addresses_Duplicates · Schreiben Addresses_Simple · Schreiben Addresses_Process · Schreiben ExecQueries · Schreiben
SQL-Objekt:
dbo.pipiAddressesFindDuplicates
Prozedur zuletzt geändert am 2026-10-05
Dokumentation von claude-opus-5-5 am 2026-10-30 geschrieben