Delphi-PRAXiS

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)

franktron 22. Mai 2013 09:18

Datenbank: MySQL • Version: 5.5 • Zugriff über: UNIDAC

Doppelte Kunden Verhindern
 
Wie kann ich am besten per SQL verhindern das ein Kunde Doppelt eingegeben wird.

Also die Felder die ich habe sind Anrede Vorname Nachname Strasse Land PLZ Ort.

Ich möchte am liebsten auch Schreibfehler berücksichtigen weis aber nicht wie

DeddyH 22. Mai 2013 09:22

AW: Doppelte Kunden Verhindern
 
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.

Klaus01 22. Mai 2013 09:24

AW: Doppelte Kunden Verhindern
 
Hallo,

kannst Du die Tabelle nicht unique deklarieren?
Dann sorgt das DBMS dafür das keine Daten doppelt eingefügt werden.

Wenn Du das nicht möchtest, könntest Du vorher mit einem SQL Statement abfragen
ob die Daten schon vorhanden sind.

Grüße
Klaus

baumina 22. Mai 2013 09:37

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.

Wenn die Datenbank keine Unterscheidung (z.B. KdNr) hat, dann brauchet sie auch keine 2 Thomas Schmidt's :lol:

mkinzler 22. Mai 2013 09:43

AW: Doppelte Kunden Verhindern
 
Das wäre dann aber ein sehr grober Designfehler.

baumina 22. Mai 2013 09:47

AW: Doppelte Kunden Verhindern
 
Sollte sich für dieses Problem eine coole Lösung ergeben, wäre mein Chef sicherlich auch gleich Feuer und Flamme dafür.

Ich wunder mich dass mich die Mitarbeiter eines Möbelhauses, bei dem ich öfters einkaufe, jedesmal neu in der Datenbank anlegen, obwohl ich mindestens schon 20mal drin stehe...Die armen Datenpfleger.:stupid:

grl 22. Mai 2013 09:50

AW: Doppelte Kunden Verhindern
 
Ich lasse den User nur über eine (phonetische) Suche ins Neuanlage-Formular. Dann kann der User selbst entscheiden ob der das Suchergebnis nimmt oder ob er wirklich einen neuen Kunden anlegt.

Suchen kann er dabei auch nach Namensteilen - wenn er "M Muster" ins Suchfeld eingibt kommt Max Mustermann genauso wie Martin Muster oder Martina Mussder....

Luggi

DeddyH 22. Mai 2013 09:51

AW: Doppelte Kunden Verhindern
 
Zitat:

Zitat von baumina (Beitrag 1216024)
Ich wunder mich dass mich die Mitarbeiter eines Möbelhauses, bei dem ich öfters einkaufe, jedesmal neu in der Datenbank anlegen, obwohl ich mindestens schon 20mal drin stehe...Die armen Datenpfleger.:stupid:

Für Layer-8-Fehler kann ja keine Software etwas :stupid:

stahli 22. Mai 2013 09:52

AW: Doppelte Kunden Verhindern
 
Ich sehe das wie DeddyH.
Ein Hinweis ist nützlich bzw. für bestehende Datenbestände auch eine generierte Liste durch jeder-mit-jedem-Vergleich.

Wenn Dich unscharfe Suche interessiert, dann kannst Du hier mal schauen:
http://www.delphipraxis.net/101160-s...s-gesucht.html
http://www.delphipraxis.net/154811-v...rozentual.html

Wie man eine "Ähnlichkeit" genau ermittelt und bewertet hängt vom Anwendungszweck ab.
Wir haben bei uns Adressen noch auf "c/o" untersucht und den Bereich davor und danach extra bewertet.
Mit dem Ergebnis sind wir sehr zufrieden, wobei es natürlich immer auch klare falsch-positive Treffer gibt.

In eine StoreProcedure haben wir das noch nicht gegossen, ist also eine reine Delphifunktion.

generic 22. Mai 2013 10:07

AW: Doppelte Kunden Verhindern
 
Zitat:

Zitat von franktron (Beitrag 1216017)
Ich möchte am liebsten auch Schreibfehler berücksichtigen weis aber nicht wie

Schreibfehler können mit der Levenshtein-Distanz berücksichtigt werden.

https://www.google.de/search?q=leven...oq=levensteins

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 22:48 Uhr.

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