Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: bikerboy am 18.12.06 - 17:54:18

Titel: Problem
Beitrag von: bikerboy am 18.12.06 - 17:54:18
Also ich weiss nicht unter was für ein Topic das hier fällt, deswegen entschuldige ich mich schon mal für den Header.

Also ich möchte ein Suche auf eine Datenbank ausführen. Alles kein Problem im eigentlichen Sinne, ABER der Suchbegriff soll mit meiner Version von Soundex umgeschlüsselt werden. Das heisst der Schlüssel nach dem ich mit dem Search auf die zu durchsuchende DB gehe ist mein Abstrahierter Suchbegriff. Die Db in der ich suchen möchte ist die DocHouse-Adress-DB , in der darf ich aber nichts verändern. Also keine extra VIEW einbauen oder neue Felder in die Dokumente schreiben.
Desweiteren darf ich nicht !!! in eine Dritte DB kopieren, weil das zu Laufzeitlastig ist. Auch darf ich die Daten nicht einfach in die Ausgangs-DB in einen Ordner kopieren.

Meine Frage ist wie  kann ich die Daten in DocHouse mit meiner Soundex version verschlüsseln, damit mein Search die richtigen Daten findet. Ich hatte schon folgende Einfälle, die aber alle nicht die Kriterien erfüllt haben , dass mein Chef sagt, so wirds gemacht.


Also ich dachte zuerst an eine Subform die man einfach einbauen könnte. die hätte dann einfach die benötigten Felder umgeschlüsselt

Dann dachte ich an die Dritte DB, was aber auch zu langsam geworden wäre.

Meine letzte Idee basierte auf eine programmierten View. Die per Script eine View nach meinen Kriterien erfüllt, also was in der ersten , zweiten , dirtten Spalte steht, aber das geht , wenn ich mich recht informiert habe nur mit Templates die dann wieder in der DocHouse-DB eingebettet werden müsste, was ja auch gegen die Auflage verstösst, das DocHouse unangetastet bleiben muss.

Meine Frage ist nun kann eine View auch ohne Template so erstellen wie man möchte ? oder habt ihr ne Idee wie man es umsetzten könnte.

Bitte Bedenkt immer, dass die Datenmengen die durchsucht werden sollen so bei 50.000 Dokumenten liegt, also fällt es aus, dass jedes einzelene Dokument untersucht wird, dann hätte ich ja die Lösung.

Ich hoffe ich habe mich verständlich ausgedrückt. Und wenn ich mich Recht entsinne gibt es nen @Notes-award , wäre doch ne Idee das als Aufgabe zu nehmen.

Danke schon mal im Voraus
Titel: Re: Problem
Beitrag von: Tode am 18.12.06 - 18:40:59
also ich verstehe das Problem bei der Sache nicht so ganz...

so finde ich zum Beispiel in der Mail- Datenbank alle Dokumente, deren Subject wie "test" klingt:

   Dim ses As New NotesSession
   Dim db As NotesDatabase
   Dim dc As NotesDocumentCollection   
   Dim doc As NotesDocument
   
   Dim qry As String
   
   qry = |@Soundex( Subject ) = @Soundex( "test" )|
   
   Set db = ses.CurrentDatabase
   Set dc = db.Search( qry , Nothing , 0 )

Also wo ist das Problem !?

Gruß
Tode
Titel: Adaptierte Soundex-Suche ohne Änderung an DB implementieren (war: Problem)
Beitrag von: m3 am 18.12.06 - 18:42:41
1., und das gilt ganz besonders für Azubis, "Verwende aussagekräftige, genaue Betreffzeilen (http://www.lugbz.org/documents/smart-questions_de.html#bespecific)" (http://buecherfreaks.knienieder.com/phpBB2/images/smiles/lies.gif) (http://buecherfreaks.knienieder.com/phpBB2/images/smiles/lehrer.gif)  :-P
Stell Dir vor, jeder würde seine Frage mit "Problem" oder "Frage" titulieren. Brrrrrr.  :o

2) Mit "meine Version von Soundex" meinst Du diese (http://atnotes.de/index.php?topic=33955.0)?
Der Link wäre nett gewesen, nicht jeder kennt alle Postings des letzten Jahres auswendig.  ;)

3) Einschränkungen
Zitat
keine extra VIEW einbauen oder neue Felder in die Dokumente schreiben. Desweiteren darf ich nicht !!! in eine Dritte DB kopieren, weil das zu Laufzeitlastig ist.
Da wirds schwierig.  :-\

4) Meine Frage ist nun kann eine View auch ohne Template so erstellen wie man möchte ?
Du könntest vor jeder Suche mit DXL die View erstellen und nachher wieder wegschmeissen. Aber ob das mittelfristig bei 50.000 Dokumenten sehr performant ist, wage ich zu bezweifeln. ;D

IMHO (gscheitere Köpfe mögen mich bitte eines Besseren belehren) wirst Du ohne Modifikationen in der zu durchsuchenden DB nicht auskommen.  :-:
Titel: Re: Adaptierte Soundex-Suche ohne Änderung an DB implementieren (war:Problem)
Beitrag von: m3 am 18.12.06 - 18:49:21
   qry = |@Soundex( Subject ) = @Soundex( "test" )|
   Set dc = db.Search( qry , Nothing , 0 )
Führt er @Soundex( Subject ) für jedes Dokument in der DB aus, wenn er sucht? Das kann ich mir nicht ganz vorstellen.

Ich hätte es eher so verstanden, wie es auch Duffbert beschreibt (http://hostit1.connectria.com/twduff/home.nsf/d6plinks/TDUF-5VT5GE).
Wenn ich ein Multivalue-Field mit einem Namen habe, so kann ein Value der Soundex-Wert sein. Und wenn ich dann nach @Soundex(Name) suche, findet er diesen.
Titel: Re: Problem
Beitrag von: Tode am 18.12.06 - 19:11:57
der DB.Search funktioniert im Prinzip exakt wie eine Ansichts- Selektionsformel, führt also die Formel für jedes Dokument aus. Welcher Task dabei die Aufgabe übernimmt, kann ich nicht sagen. Aber ich habe das schon (in Ähnlicher weise, allerdings nicht mit Soundex) auf Datenbanken mit 300.000 Dokumenten durchgeführt und hatte in akzeptablen Wartezeiten das Ergebnis vorliegen.

Das genannte Beispiel habe ich bei mir in der Mail- Datenbank in Verbindung mit "putInFolder" getestet, und das Ergebnis schien mir in Ordnung zu sein.

Gruß
Tode
Titel: Re: Adaptierte Soundex-Suche ohne Änderung an DB implementieren (war:Problem)
Beitrag von: m3 am 18.12.06 - 19:20:54
Ah, OK. Zum Ausprobieren hatte ich jetzt keine Zeit. Aber ich glaubs Dir mal. ;)

Ich fürchte nur, das wird dem Fahrradlbua nicht helfen, da er a) vermutlich eine GUI-Lösung bauen will/muss und b) SEINE Soundex-Funktion nicht als @-Formel zur Verfügung steht.
Titel: Re: Problem
Beitrag von: bikerboy am 05.01.07 - 13:50:10
@m3
der Fahrradlbua ist wieder da! (Was auch immer das heissen soll)

Natürlich steht meine Soundex-Variante nicht als @Function zur Verfügung. ich kann ja schlecht bei lotus nOtes anrufen und sagen hier hab was neues , bitte nennt es @Roundex ..... also brauche ich Script.
Titel: Re: Problem
Beitrag von: tks am 05.01.07 - 14:09:39
Fahrradlbua = Fahrrad-Junge = bikerboy
Titel: Re: Problem
Beitrag von: bikerboy am 08.01.07 - 17:01:50
Also meine Version von @Soundex sieht folgendermaßen aus ( Wie gesagt, nichts innovatives aber trotzdem mag ich es ) :

Code
Function Roundex (Byval searchValue As String) As String
	searchValue = Ucase(searchValue)
	char = Left$(searchValue, 1)
	If (Asc(char) < Asc("A")) Or (Asc(char) > Asc("Z")) Then
		Roundex = "00000"
		Exit Function
	End If
	newString = char
	For i = 2 To Len(searchValue)
		char = Mid$(searchValue, i, 1)
		
		Select Case char
		Case "A", "E"
			char2 = Mid$(searchValue, (i+1), 1)
			Select Case char2	
			Case "I","Y"
				convChar = "7"
			Case Else
				convChar = ""
			End Select
		Case "H", "I", "O", "U", "W", "Y"
			convChar = ""
		Case "'"
			convChar = ""
		Case "B", "F", "P", "V"
			convChar = "1"
		Case "C", "G", "J", "K", "Q", "S", "X", "Z"
			convChar = "2"
		Case "D", "T"
			convChar = "3"
		Case "L"
			convChar = "4"
		Case "M", "N"
			convChar = "5"
		Case "R"
			convChar = "6"
		Case Else
			Exit For
		End Select
		If Not (Right$(newString, 1) = convChar) Then
			newString = newString & convChar
			
		End If
		
		If (Len(newString) = 5) Then
			Exit For
		End If
	Next
	
	newString = Left$(newString & "00000", 5)
	Roundex = newString
End Function

Naja diese Umwandlung muss nun auf den Suchbegriff angewendet werden. Und halt auf jedes zu untersuchende Feld , bzw jeden Eintrag des Indexes.
Also ich hoffe ihr könnt mir weiter helfen. Ich will langsam fertig werden. Es macht depressiv wenn man hier sitzt und man kommt nicht von der Stelle
Titel: Re: Problem
Beitrag von: Tode am 09.01.07 - 10:27:00
also Deine Funktion lässt sich in einer Zeile Formel- Sprache zusammenfassen... und damit in ein DB.Search einbauen. Zugegeben: Die Formel wird etwas "unförmig", aber funktionieren sollte es trotzdem:

Hier erst mal die Formel, wie sie generell aussehen müsste:

searchVal := "ABC";
list := @Explode( "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" ; "~" );
repList2 := validList + validList;
repList3 := repList2 + validList;
repList4 := repList3 + validList;

inter1 := @ReplaceSubstring( searchVal ; @Word( list ; "|" ; 1 ) ; @Word( list ; "|" ; 2 ) );
inter2 := @Explode( inter1 ; validList );
inter3 := @ReplaceSubstring( inter1 ; inter2 ; "~" );
inter4 := @Left( inter3 ; "~" );

inter5 := @ReplaceSubstring( inter4 ; repList4 : repList3 : repList2 ; validList : validList : validList );
inter6 := @Left( inter5 + "00000" ; 5 );

inter6

Jetzt muss man das nur noch "zusammenfassen" in einer Zeile, dann kann man das über db.Search( ... ) in jedes Script einbauen.

Das zusammenfassen kann ich grade nicht machen, muss los, aber zumindest hast Du jetzt mal einen Ansatzpunkt...

Gruß
Tode
Titel: Re: Problem
Beitrag von: bikerboy am 09.01.07 - 14:33:40
 ??? puh ???

bin gerade ein bisschen überfordert. ICh glaube ich muss doch einmal auf deine Zusammenfassung warten. Ich erkenne zwar dass die Formel das selbe ausgibt wie mein Script , aber wie ich das nun implementieren kann ist mir ein Rätsel. In der Zwischenzeit werde ich die Hilfe befragen vielleicht schaffe ich es ja auch noch selber.

Ich bedanke mich erstmal für die Schützenhilfe.
Titel: Re: Problem
Beitrag von: bikerboy am 10.01.07 - 15:15:04
So habe es ehrlich versucht , aber bin gescheitert.

@Tode :

kannst du mir bitte deine Lösung geben, wenn du Zeit hast natürlich.
Wäre total nett.

Danke schon mal
Titel: Re: Problem
Beitrag von: Tode am 10.01.07 - 16:49:10
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 ) & {"}
Titel: Re: Problem
Beitrag von: bikerboy am 10.01.07 - 17:38:47
Danke Danke für die Mühe die du dir gemacht hast.

Beim Lesen ist aber aufgefallen, dass du eine Kleinigkeit vergessen hast. Mein ersten Wert ist immer der erste Buchstabe des Wortes. Also wird aus Eiersalat = E6000 , werde mich morgen dann noch dran machen die Sache umzusetzen. Also hast du den Rest des Abends frei  ;) (Sorry meine Art von Humor, Ich bin dir wirklich dankbar für die Hilfe)

Schönen Abend noch
Titel: Re: Problem
Beitrag von: bikerboy am 11.01.07 - 08:59:20
Einen wunderschönen guten Morgen Deutschland.

So habe das ganze mal implementiert aber er findet leider immer nichts. Also irgendwo hinkt es.

Ich glaube die Welt (, oder ich) sind noch nicht bereit für meine Funktion, ich werde die einfache Soundex-Version verwenden und mich dann im späteren Verlauf meiner Ausbildung nochmal mit dem Problem rumärgern.

Ich möchte mich an dieser Stelle noch einmal bei allen Bedanken, die mich so tatkräftigt unterstützt haben. ( Special greats to Tode )
Titel: Re: Problem
Beitrag von: eknori am 11.01.07 - 09:02:32
Da du ja noch in der Ausbildung bist, hier meine 2 Cent zu deiner Ausbildung:

In der modernen Gesellschaft redet man nicht mehr von "Problemen"; vielmehr ist hierfür die Begrifflichkeit "Herausforderung" gebräuchlich.

Du wirst dich also zu einem späteren Zeitpunk erneut der Herausforderung "Soundex" stellen und nicht lapidar "mit dem Problem rumärgern" ...

Titel: Re: Problem
Beitrag von: Glombi am 11.01.07 - 09:15:02
Ich habe bis jetzt nicht verstanden, warum Soundex nicht verwendet werden soll.

Immerhin verwenden es doch die Amis, um Passagierdaten abzugleichen. Dann kann es wohl so schlecht nicht sein  ;)
Kleiner Scherz, ich meine, die Funktion ist standardisiert.

Andreas
Titel: Re: Problem
Beitrag von: Tode am 15.01.07 - 11:24:36
also wenn das nicht klappt, dann hast Du was falsch gemacht.. bei mir hat die gepostete Funktion das ergebnis zurückgeliefert, was ich erwartet hatte.
Vielleicht postest Du kurz Deinen "Ergebnis- Code" dann finden wir sicher Deinen Fehler... (ich habe jetzt ein persönliches Interesse an dem Fall: wenn ich schon so viel Zeit da rein stecke, dann will ich das Problem auch gelöst wissen und nicht 1 Meter vor dem Ziel aufgeben...

Tode
Titel: Re: Problem
Beitrag von: bikerboy am 15.01.07 - 17:13:45
@Tode die Funktio an sich funzt auch, wandelt schön alles um. aber eine Frage hätte ich da noch.

Ich habe ja Rondex folgendermassen defeniert :

Code
Function Roundex (Byval searchValue As String) As String

wenn ich in einer Suche , folgendermaßen diesen Code hineinschreibe, was passiert ? :

Code
If Roundex(Cstr(docCol.GetItemValue(searchField)(0))) = Roundex(Cstr(docSearch.GetItemValue(searchField)(0))) Then


Wird nun der searchValue 2x verglichen oder über gebe ich ihm wirklich die 2 verschiedenen Items ?
Titel: Re: Problem
Beitrag von: bikerboy am 15.01.07 - 17:16:16
Und noch was . im moment schmeisst er mir in der Zeile einen Fehler mit der Meldung "Illegal Use function call"

Code
	If (Asc(char) < Asc("A")) Or (Asc(char) > Asc("Z")) Then


WARUM ZUM TEUFEL ?????
Titel: Re: Problem
Beitrag von: Tode am 15.01.07 - 17:54:17
code...code...code...
Du strukturierst Deine Anfragen nicht sauber, und ohne zugrundeliegenden Code ist es damit UNMÖGLICH Deine Frage zu beantworten.

Frage 1: Woher sollen wir wissen, wo der Fehler herkommt, wenn wir weden den Kontext haben, noch die info, was "char" sein soll...

Frage 2: Dein Vergleich passt überhaupt nicht in den Context des ganzen Posts... dieser Vergleich findet ja vollkommen ausserhalb meine "RoundexSearch"- Funktion statt...

Die Antwort lautet aber: Er vergleicht den Roundex des Inhalts des Feldes mit dem Namen searchField aus dem docCol mit dem Roundex des gleichnamigen Feldes im docSearch.

trotz allem würde man eine solche Monsterzeile niemals schreiben (alleine wegen der Lesbarkeit).

sauber (und auch wesentlich leichter zu debuggen) wäre es, die einzelnen zwischenergebnisse in Variablen zu schreiben.

Also so:

Dim valCol as String, valSearch as String
Dim roundexCol as String, roundexSearch as String

valCol = Cstr( docCol.GetItemValue( searchField )( 0 ) )
roundexCol = Roundex( valCol )
valSearch = Cstr( docSearch.GetItemValue( searchField )( 0 ) )
roundexSearch = Roundex( valSearch )
If roundexCol = roundexSearch then


Sach mal: Hast Du denn niemanden in Deiner Firma, der sich um Dich kümmert, damit sich solche "Q&D"- Programmierstile gar nicht erst einschleichen ? Wenn man das erst mal "verinnerlicht" hat, kriegt man das nur ganz schwer wieder weg...Ich weiss das, ich spreche aus Erfahrung...

Tode

colVal
Titel: Re: Problem
Beitrag von: bikerboy am 15.01.07 - 18:03:52
Zu meiner Firma :

Ich will nicht immer mit dem Problem zu meinem Chef rennen der wäre nämlich mein Ansprechpartner  und zu meinem Stil. Du magst ja recht haben mit der Übersichtlichkeit, aber mir wurde hier eingebleut, dass ich nicht unnötig Variablen Deklarieren soll, sondern lieber die  Dinge direkt ansprechen. Das spart  irgendwann mal Speicher wenn ich wirklich wichtige und grosse Projekte realisiere. Und ganz ehrlich so schlimm finde ich die Zeile nicht.

Zu meinem Code :

Ich dachte du hättest den Roundex-Code , char ist doch der jeweilige Buchstabe des Stringes. Meine Frage hat sich aber schon geklärt. Er übergibt das richtige! Was ich ihm übergeben heisst nur innerhalb der Funktion searchValue