Du willst also wirklich von mir einen Moloch von Formel, zusammengepatscht in eine einzige Zeile Code, nachdem Du nicht mal die aufgedröselte Version der Formel verstanden hast ?
Ich finde es ja toll, dass Du so in meine Programmierkenntnisse vertraust, aber diese Formel habe ich mal eben im Subject- Feld meiner Mail zusammengetippt....
Sie mag in vielen Fällen tatsächlich das gleiche Ergebnis liefern wie Dein Script, aber zu 100% nicht in allen - wenn auch die Fälle, in denen sie es nicht tut, ziemlich selten sein sollten, und diese sich durch leichte Modifikation des Scripts noch weiter verringern lassen...
So eine Formel einzusetzen, OHNE sie verstanden zu haben, ist Quatsch und führt unweigerlich zu Problemen.
Trotz allem werde ich -weil ich so ein riesen Fan der Formel- Sprache bin- Dir die Formel mal ein wenig zu erklären versuchen...
und schon wärst Du kräftig auf den Hosenboden gefallen... beim Kommentieren habe ich noch einige Fehler entdeckt...
REM { searchval ist mein Input....};
searchVal := "ABC";
REM { list ist die Liste aller Buchstaben inklusive der Zahlen, die sie ersetzen: AI|7 heisst: ersetze AI durch 7};
REM {Durch die Dokumentierung habe ich schon den ersten Fehler entdeckt: sind im String schon vorher Zahlen drin, geht das schief... in der Korrekten Version müssen also zuerst die Zahlen durch ein Sonderzeichen ersetzt werden, bevor die Buchstaben in Zahlen übersetzt werden};
list := @Explode( "1|-~2|-~3|-~4|-~5|-~6|-~7|-~8|-~9|-~0|-~AI|7~AY|7~EI|7~EY|7~A|~E|~H|~I|~O|~U|~W|~Y|~'|~B|1~F|1~P|1~V|1~C|2~G|2~J|2~K|2~Q|2~S|2~X|2~Z|2~D|3~T|3~L|4~M|5~N|5~R|6" ; "~" );
REM { validList sind alle gültigen Zahlen. Alles was nicht diese Zahlen sind, wird später durch ein Sonderzeichen ersetzt};
validList := @Explode( "1~2~3~4~5~6~7" ; "~" );
validString := @Implode( validList ; "" );
REM {Die repLists braucht man, um dieses if:
If Not (Right$(newString, 1) = convChar) Then
newString = newString & convChar
End If
nachzuprogrammieren. Sie enthalten z.B. : 11 , 111 , 1111. };
repList2 := validList + validList;
repList3 := repList2 + validList;
repList4 := repList3 + validList;
repList5 := repList4 + validList;
repList6 := repList5 + validList;
REM {Jetzt ersetzen wir in unserem (in Grossbuchstaben umgewandelten) SearchString die Zahlen durch - und die Buchstaben durch die entsprechenden Zahlen};
REM { aus Eier3salat# wird : 76-243# (7=ei,6=r,-=3,2=s,4=l,3=t,#=#) };
inter1 := @ReplaceSubstring( @Uppercase( searchVal ) ; @Word( list ; "|" ; 1 ) ; @Word( list ; "|" ; 2 ) );
REM {Dieser Explode liefert uns eine Liste aller UNGÜLTIGEN Zeichen im String inter1 };
REM { Ergebnis: "-" : "#" (also eine Liste bestehend aus - und #) };
inter2 := @Unique( @Explode( inter1 ; validString ) );
REM { Jetzt ersetzen wir alle diese Zeichen im inter1 durch ein einziges, nämlich die Tilde };
REM { Ergebnis: 76~243~ };
inter3 := @ReplaceSubstring( inter1 ; inter2 ; "~" );
REM { Nun holen wir uns alle gültigen Zeichen bis zum ersten ungültigen (alle ungültigen Zeichen wurden durch ~ ersetzt) };
REM { Das + "~" steht hier für den Fall, dass ein Wort kein Sonderzeichen enthält und nur aus gültigen Buchstaben besteht };
REM { Ergebnis: 76 };
inter4 := @Left( inter3 + "~" ; "~" );
REM { Jetzt müssen wir die doppelten und dreifachen Werte rausfiltern. };
REM { Zuerst wird auf 6 gleiche aufeinanderfolgende Zeichen überprüft (repList6 ) und diese werden durch 1 Zeichen ersetzt, dann prüfen wir 5 gleiche aufeinanderfolgende Zeichen (repList5), dann 4, usw. };
REM {sollten jetzt allerdings 7 gleiche Zahlen aufeinanderfolgen, dann geht das schief. Das könnte man durch ein erstellen von repList7 und einbinden in diese Zeile erweitern auf 7 und so weiter... ich habe mit Deinem Algorythmus keine Erfahrung und weiss nicht, wie viele gleiche Zeichen maximal aufeinander folgen können....Das ist die Krux dieser Formel. Eine FOR- Schleife könnte das Problem lösen, lässt sich aber nicht in db.Search verwenden (das steigt aus, wenn die Formel zu komplex wird)};
REM { Aus 7776331112222 würde also 76312 };
inter5 := @ReplaceSubstring( inter4 ; repList6 : repList5 : repList4 : repList3 : repList2 ; validList : validList : validList : validList : validList );
REM { Jetzt müssen wir von diesem String nur noch die ersten 5 Zeichen nehmen und mit nullen auffüllen. Fertig. };
inter6 := @Left( inter5 + "00000" ; 5 );
ERGEBNIS: Eier3Salat# = 76000
Und jetzt hast Du mich doch tatsächlich bei der Neugier gepackt... Diese Funktion könnte ich eigentlich Teuer verkaufen, ich hoffe, Du weisst das zu schätzen. Hier also Deine "Roundex"- Funktion um eine Datenbank zu durchsuchen nach Deinem eigenen Roundex.
Parameter:
searchField : FeldName des Feldes in dem gesucht werden soll, string
searchVal : Wert, nach dem gesucht werden soll (also 35200 für Dankeschön )
Rückgabewert: Alle Dokumente in der Datenbank, die im angegebenen Feld den von dir gewünschten Roundex- Wert enthalten...
Function RoundexSearch( searchField As String , searchString As String ) As NotesDocumentCollection
Dim ses As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim qry As String
Set db = ses.CurrentDatabase
qry = { x := } & searchField & {;
list := @Explode( "1|-~2|-~3|-~4|-~5|-~6|-~7|-~8|-~9|-~0|-~AI|7~AY|7~EI|7~EY|7~A|~E|~H|~I|~O|~U|~W|~Y|~'|~B|1~F|1~P|1~V|1~C|2~G|2~J|2~K|2~Q|2~S|2~X|2~Z|2~D|3~T|3~L|4~M|5~N|5~R|6" ; "~" );
validList := @Explode( "1~2~3~4~5~6~7" ; "~" );
validString := @Implode( validList ; "" );
repList2 := validList + validList;
repList3 := repList2 + validList;
repList4 := repList3 + validList;
repList5 := repList4 + validList;
repList6 := repList5 + validList;
inter1 := @ReplaceSubstring( @UpperCase( x ) ; @Word( list ; "|" ; 1 ) ; @Word( list ; "|" ; 2 ) );
inter2 := @Explode( inter1 ; validString );
inter3 := @ReplaceSubstring( inter1 ; inter2 ; "~" );
inter4 := @Left( inter3 + "~" ; "~" );
inter5 := @ReplaceSubstring( inter4 ; repList6 : repList5 : repList4 : repList3 : repList2 ; validList : validList : validList : validList : validList );
inter6 := @Left( inter5 + "00000" ; 5 );
inter6="} & searchString & {"}
Set RoundexSearch = db.Search( qry , Nothing , 0 )
End Function
Natürlich wie immer ohne jegliche Fehlerbehandlung und ohne Gewähr.
Ausserdem musst Du für Deine Zwecke noch db variabel gestalten, weil bei Dir CurrentDatabase <> SearchDatabase
Wie performant das ganze in grossen DBs läuft weiss ich nicht...
Gruß
Tode
Edit: Um gleich Deine eigene Roundex mit einzubauen müsste das ganze dann so aussehen:
searchString = Tatsächlich gesuchter String (also z.B. Dankeschön) und dann eine Zeile ersetzen:
inter6="} & Roundex( searchString ) & {"}