![]() |
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 |
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.
|
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 |
AW: Doppelte Kunden Verhindern
Zitat:
|
AW: Doppelte Kunden Verhindern
Das wäre dann aber ein sehr grober Designfehler.
|
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: |
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 |
AW: Doppelte Kunden Verhindern
Zitat:
|
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: ![]() ![]() 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. |
AW: Doppelte Kunden Verhindern
Zitat:
![]() |
AW: Doppelte Kunden Verhindern
Zitat:
![]() |
AW: Doppelte Kunden Verhindern
Zitat:
|
AW: Doppelte Kunden Verhindern
Dann schick doch einfach eine Abfrage der Art
SQL-Code:
ab. Kommt eine Zahl > 0 heraus, dann warnen.
SELECT
COUNT(*) FROM Kundentabelle WHERE SOUNDEX(Name) = SOUNDEX(:NeuerName) AND SOUNDEX(Vorname) = SOUNDEX(:NeuerVorname) -- usw. |
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.
|
AW: Doppelte Kunden Verhindern
mal ein Auszug aus meinem Quellcode:
Code:
STRToSQL -> Filtert bzw übersetzt ja nach SQL Server Sonderzeichen also ' ` usw. die sonst zu Fehlern führen, wenn Sie im Text vorkommen!
{$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 .... |
AW: Doppelte Kunden Verhindern
Zitat:
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!) |
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