28. Oktober 2009 10:16
28. Oktober 2009 10:18
28. Oktober 2009 10:29
28. Oktober 2009 14:22
Was soll das denn leisten? Soll das erkennen, dass Meier so ähnlich wie Maja klingt? Oder Meyer und Maier finden?
28. Oktober 2009 14:36
tba hat geschrieben:schau dir mal die Kontaktsuche im Standard an.
die macht sowas in der Art.
(ich weiss aber nicht, ob auch schon in der Version 3.7)
28. Oktober 2009 14:41
bin mir da relativ sicher, dass das die Standard suche nicht macht!
28. Oktober 2009 14:51
martinst hat geschrieben:bin mir da relativ sicher, dass das die Standard suche nicht macht!
Da liegst Du aber falsch.
Genau das macht diese Funktion.
Meier findet Meyer, Mayer, Maier etc.
Gruss
- Code:
Soundex(Text : Text[1024]) Result : Text[10]
KölnerPhonetik(Text : Text[1024]) Result : Text[1024]
28. Oktober 2009 14:52
martinst hat geschrieben:Genau das.
28. Oktober 2009 15:04
28. Oktober 2009 15:31
28. Oktober 2009 15:35
navytom hat geschrieben:Ansonsten schaue ich auch mal gerne in die Kontaktsuche. Ab welcher Version? Ich geh mal von 4.0 aus.
28. Oktober 2009 16:24
martinst hat geschrieben:Das ist kein SQL-Feature oder sonst was ähnliches.
Die Kontaktsuche in NAV findet NATIV und SQL die Namen phonetisch.
meier findet meier,meyer,maier,mayer etc.
CASE DuplSearchStringSetup.Field OF
DuplSearchStringSetup.Field::Name:
DuplContSearchString."Search String" :=
ComposeIndexString(Cont.Name,DuplSearchStringSetup."Part of Field",DuplSearchStringSetup.Length);
ComposeIndexString(InString : Text[260];Part : 'First,Last';ChrToCopy : Integer) : Text[260]
InString := DELCHR(InString,'=',' +"&/,.;:-_(){}#!£$\');
IF STRLEN(InString) < ChrToCopy THEN
ChrToCopy := STRLEN(InString);
IF ChrToCopy > 0 THEN
IF Part = Part::First THEN
InString := COPYSTR(InString,1,ChrToCopy)
ELSE
InString := COPYSTR(InString,STRLEN(InString)-ChrToCopy+1,ChrToCopy);
EXIT(UPPERCASE(InString));
DuplContSearchString2.SETCURRENTKEY(Field,"Part of Field","Search String");
DuplContSearchString2.SETRANGE(Field,DuplContSearchString.Field);
DuplContSearchString2.SETRANGE("Part of Field",DuplContSearchString."Part of Field");
DuplContSearchString2.SETRANGE("Search String",DuplContSearchString."Search String");
DuplContSearchString2.SETFILTER("Contact Company No.",'<>%1',DuplContSearchString."Contact Company No.");
28. Oktober 2009 16:38
28. Oktober 2009 16:40
Ich habe das Gefühl, hier wird gerade die Dubletten-Prüfung mit der Kontakt-Suche verwechselt.
28. Oktober 2009 16:54
29. Oktober 2009 18:12
McClane hat geschrieben:Ein Algorithmus, der auch weg gelassene oder Buchstabendreher findet und somit die Unterschiedlichkeit zweier Wörter bewerten kann, ist der von Levenshtein (http://www.levenshtein.de/). Ist recht leicht in Nav umzusetzen, braucht aber länger als die Standard-Dublettensuche. Dafür liefert er nach meiner Erfahrung bessere Ergebnisse.
LevenshteinDistance(SourceText : Text[50];TargetText : Text[50]) : Integer
// > TL6.00:09 >>>
// Based on http://de.wikipedia.org/wiki/Levenshtein-Distanz#Algorithmus
FOR I := 0 TO STRLEN(SourceText) DO
Distance[I+1,1] := I;
FOR J := 0 TO STRLEN(TargetText) DO
Distance[1,J+1] := J;
FOR I := 1 TO STRLEN(SourceText) DO
FOR J := 1 TO STRLEN(TargetText) DO BEGIN
IF SourceText[I] = TargetText[J] THEN
Cost := 0
ELSE
Cost := 1;
Distance[I+1,J+1] := Min(Distance[I,J+1] + 1,Min(Distance[I+1,J] + 1,Distance[I,J] + Cost));
END;
EXIT(Distance[STRLEN(SourceText) + 1,STRLEN(TargetText) + 1]);
// < TL6.00:09 <<<
DamerauLevenshteinDistance(SourceText : Text[50];TargetText : Text[50]) : Integer
// > TL6.00:09 >>>
// Based on http://de.wikipedia.org/wiki/Levenshtein-Distanz#Damerau-Levenshtein-Distanz
FOR I := 0 TO STRLEN(SourceText) DO
Distance[I+1,1] := I;
FOR J := 0 TO STRLEN(TargetText) DO
Distance[1,J+1] := J;
FOR I := 1 TO STRLEN(SourceText) DO
FOR J := 1 TO STRLEN(TargetText) DO BEGIN
IF SourceText[I] = TargetText[J] THEN
Cost := 0
ELSE
Cost := 1;
Distance[I+1,J+1] := Min(Distance[I,J+1] + 1,Min(Distance[I+1,J] + 1,Distance[I,J] + Cost));
IF (I > 1) AND (J > 1) THEN
IF (SourceText[I] = TargetText[J-1]) AND (SourceText[I-1] = TargetText[J]) THEN
Distance[I+1,J+1] := Min(Distance[I+1,J+1],Distance[I-1,J-1] + Cost);
END;
EXIT(Distance[STRLEN(SourceText) + 1,STRLEN(TargetText) + 1]);
// < TL6.00:09 <<<
Min(Int1 : Integer;Int2 : Integer) : Integer
// > TL6.00:09 >>>
IF Int1 < Int2 THEN
EXIT(Int1)
ELSE
EXIT(Int2);
// < TL6.00:09 <<<
29. Oktober 2009 18:18
29. Oktober 2009 18:20
McClane hat geschrieben:Sieht irgendwie aus wie meiner .. los sag: wo steht die Kamera?
29. Oktober 2009 18:22
29. Oktober 2009 18:23
29. Oktober 2009 18:23
mikka hat geschrieben:Wie du hast den schon?
Und nicht gepostet
29. Oktober 2009 19:18
Überrascht mich nicht, denn ich habe den Code 1:1 übernommen und an die C/AL-Konventionen angepasst.McClane hat geschrieben:Sieht irgendwie aus wie meiner
Glaubst du wirklich, das kleine Loch in der Wand stammt von einem ehemaligen Nagel?McClane hat geschrieben: .. los sag: wo steht die Kamera?
3. August 2010 11:00
Beispielsweise ist die Levenshtein-Distanz zwischen „Tier“ zu „Tor“ 2. Eine mögliche Folge von 2 Operationen ist:
1.Tier
2.Toer (Ersetze i durch o)
3.Tor (Lösche e)
3. August 2010 11:08
3. August 2010 11:39
McClane hat geschrieben:Und was machst du bei Worten wie Soest? Das wäre nicht gleich Söst. AEG ist nicht ÄG.
McClane hat geschrieben:Außerdem ist es dir doch überlassen, ab wann du von einer Dublette ausgehst. Das kann immer ein fester Wert sein, genauso aber eine Abweichung in Abhängigkeit der Länge der Wörter.