Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Doppelte Kunden Verhindern (https://www.delphipraxis.net/174965-doppelte-kunden-verhindern.html)

joachimd 22. Mai 2013 10:17

AW: Doppelte Kunden Verhindern
 
Zitat:

Zitat von generic (Beitrag 1216031)
Schreibfehler können mit der Levenshtein-Distanz berücksichtigt werden

Ich würde da eher ein soundex vorziehen ... eine deutsche Implementierung gibt es als Kölner Phonetik, ADS SQL Implementierung hier: http://joachimduerr.blogspot.de/2012...netik-sql.html

franktron 22. Mai 2013 10:47

AW: Doppelte Kunden Verhindern
 
Zitat:

Zitat von DeddyH (Beitrag 1216018)
Wenn in einem 200-Parteien-Haus 2 "Thomas Schmidt"s wohnen, darf nur einer davon Kunde werden? Ich würde eine doppelte Eingabe nicht generell verhindern, sondern nur eine Warnung ausgeben, wenn es sich um einen mutmaßlichen Doppler handeln könnte. Die letzte Entscheidung hat dann der Anwender zu treffen.

Ich will ja auch nur eine Warnung einbauen.

DeddyH 22. Mai 2013 10:53

AW: Doppelte Kunden Verhindern
 
Dann schick doch einfach eine Abfrage der Art
SQL-Code:
SELECT
  COUNT(*)
FROM
  Kundentabelle
WHERE
  SOUNDEX(Name) = SOUNDEX(:NeuerName)
AND
  SOUNDEX(Vorname) = SOUNDEX(:NeuerVorname)
-- usw.
ab. Kommt eine Zahl > 0 heraus, dann warnen.

Namenloser 22. Mai 2013 12:08

AW: Doppelte Kunden Verhindern
 
Wobei ein Vorteil von SoundEx ja ist, dass man es nur einmal berechnen muss und danach beliebig oft vergleichen kann, im Gegensatz zu z.B. Levenshtein. Daher sollte man das imo auch ausnutzen, indem man den SoundEx-String als eigenes Feld in die Tabelle schreibt. Sonst muss für jeden neuen Datensatz die ganze Tabelle durchlaufen werden, was ineffizient wäre.

arnof 22. Mai 2013 12:49

AW: Doppelte Kunden Verhindern
 
mal ein Auszug aus meinem Quellcode:

Code:
   {$IFDEF ADO}
   oNummer:='[E-Mail]';
   {$ELSE}
   oNummer:='Adressen."E-Mail"';
   {$ENDIF}
   QU_Dublette.SQL.TEXT:='SELECT Adresse,Nummer,Suchbegriff,Firma1,Firma2,Vorname,Name,Strasse,Plz,Ort,Telefon,'+oNummer+' FROM Adressen';
   QU_Dublette.SQL.Add('WHERE Art='+IntToStr(TabControl1.TabIndex)+' AND ((Ort LIKE '#39+StrToSQL(TBL_Kunden.FieldByName('Ort').AsString,TBL_Kunden.SERVER_TYPE)+
                                  #39' AND Strasse LIKE '#39+StrToSQL(TBL_Kunden.FieldByName('Strasse').AsString,TBL_Kunden.SERVER_TYPE)+#39+')');
   if Trim(TBL_Kunden.FieldByName('E-Mail').AsString)<>'' then QU_Dublette.SQL.Add('OR ('+oNummer+' LIKE '#39+StrToSQL(TBL_Kunden.FieldByName('E-Mail').AsString,TBL_Kunden.SERVER_TYPE)+#39')');
   QU_Dublette.SQL.Add(')');
   if Trim(TBL_Kunden.FieldByName('Firma1').AsString+TBL_Kunden.FieldByName('Firma2').AsString+TBL_Kunden.FieldByName('Name').AsString)<>'' then begin
    QU_Dublette.SQL.Add('AND (');
    if Trim(TBL_Kunden.FieldByName('Firma1').AsString)<>'' then QU_Dublette.SQL.Add('Firma1 LIKE '#39+StrToSQL(Trim(TBL_Kunden.FieldByName('Firma1').AsString),TBL_Kunden.SERVER_TYPE)+#39+' OR ');
    if Trim(TBL_Kunden.FieldByName('Firma2').AsString)<>'' then QU_Dublette.SQL.Add('Firma2 LIKE '#39+StrToSQL(Trim(TBL_Kunden.FieldByName('Firma2').AsString),TBL_Kunden.SERVER_TYPE)+#39+' OR ');
    if Trim(TBL_Kunden.FieldByName('Name').AsString)<>'' then QU_Dublette.SQL.Add('Name LIKE '#39+StrToSQL(Trim(TBL_Kunden.FieldByName('Name').AsString),TBL_Kunden.SERVER_TYPE)+#39+' OR ');
    QU_Dublette.SQL.Add('1=2)');
   end;
   QU_Dublette.Open;
   if QU_Dublette.RecordCount>0 then begin
    // Doubletten gefunden
    // Kunden eine Auswahl anzeigen ....
STRToSQL -> Filtert bzw übersetzt ja nach SQL Server Sonderzeichen also ' ` usw. die sonst zu Fehlern führen, wenn Sie im Text vorkommen!

p80286 22. Mai 2013 13:34

AW: Doppelte Kunden Verhindern
 
Zitat:

Zitat von DeddyH (Beitrag 1216027)
Für Layer-8-Fehler kann ja keine Software etwas :stupid:

Und dann kommen die kleinen regionalen Unterschiede Grewenbrooch -> Grevenbroich Buur -> Boer -Bör usw.
Gerade gehört: Itter - Iter (beides gleich gesprochen!)
Und was macht man wenn es wirklich zwei "Klaus Bergmann" in "Essen" gibt?
Und auch beliebt ist Johannes Heesters = Hans Heesters = Johan M. Heesters = Johann Marius Heesters .....

Mehr als der Hinweis, am besten als Liste, "da gibt es Ähnlichkeiten", ist eigentlich nicht redlich.

Ist halt immer ein Layer8-Problem

Gruß
K-H

P.S.
Ich bin mit der Kölner Phonetik recht zufrieden. (Aber nur als Hinweis!)

sx2008 22. Mai 2013 13:52

AW: Doppelte Kunden Verhindern
 
SoundEx ist ein völlig veralteter Algorithmus der viele false-Positives generiert.
Der Zielraum von einem Buchstaben und 3 Ziffern ist einfach viel zu klein.
Schlieslich wurde Soundex für Kateikarten und nicht für Computer entwickelt.
Man sollte Soundex nicht mehr verwenden.

Soundex und Kölner Phonetik beruhen auf der Therorie, dass es vor allem beim Hören und Verstehen zu Fehlern kommt.
Dabei sind Buchstabendreher, fehlende oder überzählige Buchstaben mindestens ebenso häufig.

Wenn man vor dem Abspeichern eines neuen Kunden alle Kunden mit identischer Strase (+Hausnr), PLZ, Ort und Länderkennung anzeigt, dann hat der Benutzer schon eine sehr gute Chance Dupletten zu erkennen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz