Entwickler-Ecke
Datenbanken - nach mehreren Schlagworten suchen
commin - Sa 02.02.08 14:00
Titel: nach mehreren Schlagworten suchen
Hallo,
ich habe folgendes Problem:
Ich möchte eine Datenbank nach mehreren Schlagwörtern duchsuchen (Suchfunktion) - zur Zeit klappt das mit folgenden Text für einen Suchbegriff:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| for i:= i+1 to form1.table1.RecordCount do begin smemo:=dbmemo1.text; stitel:=dbedit1.text; sbtitel:=dbedit2.text; sautor:=dbedit3.text; sregion:=dbedit4.text; szeit:=dbedit5.text;
if POS(LowerCase(stichw), LowerCase(smemo)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(stitel)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(sbtitel)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(sautor)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(sregion)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(szeit)) <> 0 then ok:=true; if ok=true then sucherg.showmodal; if endsuch='true' then exit; ok:=false; form1.table1.next; gauge1.progress:=i; sucherg.gauge1.progress:=i; end; |
Aber ich stehe ein wenig vor einem Rätsel wie ich dass auf meherere Anwenden kann....
Danke
Norman
Moderiert von
Christian S.: I- durch Delphi-Tags ersetzt
dummzeuch - Sa 02.02.08 16:34
Titel: Re: nach meheren Schlagworten suchen
commin hat folgendes geschrieben: |
Hallo,
ich habe folgendes Problem:
Ich möchte eine Datenbank nach mehreren Schlagwörtern duchsuchen (Suchfunktion) - zur Zeit klappt das mit folgenden Text für einen Suchbegriff:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| for i:= i+1 to form1.table1.RecordCount do begin smemo:=dbmemo1.text; stitel:=dbedit1.text; sbtitel:=dbedit2.text; sautor:=dbedit3.text; sregion:=dbedit4.text; szeit:=dbedit5.text;
if POS(LowerCase(stichw), LowerCase(smemo)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(stitel)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(sbtitel)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(sautor)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(sregion)) <> 0 then ok:=true; if POS(LowerCase(stichw), LowerCase(szeit)) <> 0 then ok:=true; if ok=true then sucherg.showmodal; if endsuch='true' then exit; ok:=false; form1.table1.next; gauge1.progress:=i; sucherg.gauge1.progress:=i; end; |
Aber ich stehe ein wenig vor einem Rätsel wie ich dass auf meherere Anwenden kann....
|
Du bist Dir schon bewusst, dass das da oben bei grossen Tabellen ziemlich langsam wird?
Zu Deiner Frage: Ich wuerde erstmal den Code zum ueberpruefen, ob das Stichwort im aktuellen Datensatz steht, in eine Funktion auslagern. Wenn das passiert ist, rufst Du die Funktion einfach zweimal auf:
Quelltext
1: 2: 3: 4:
| if SucheNach('hallo') then goto gefunden; if SucheNach('trallala') then goto gefunden; |
(Die Gotos solltest Du nicht ernst nehmen, sie dienen nur der Verdeutlichung, sind aber kein guter Programmierstil.)
twm
Hendrik - Mo 04.02.08 21:34
Was hälst du denn davon, das ganze mit der Filterfunktion zu machen? Dein Code würde ewig brauchen...
dummzeuch - Mo 04.02.08 22:08
Hendrik hat folgendes geschrieben: |
| Was hälst du denn davon, das ganze mit der Filterfunktion zu machen? Dein Code würde ewig brauchen... |
Das Problem ist, dass er beliebige Worte in beliebigen Feldern finden will. Das geht effizient eigentlich nur mit einem Volltext-Index.
twm
alzaimar - Mo 04.02.08 22:18
Titel: Re: nach meheren Schlagworten suchen
dummzeuch hat folgendes geschrieben: |
Quelltext 1: 2: 3: 4:
| if SucheNach('hallo') then goto gefunden; if SucheNach('trallala') then goto gefunden; |
(Die Gotos solltest Du nicht ernst nehmen, sie dienen nur der Verdeutlichung, sind aber kein guter Programmierstil.) |
@dummzeuch: Ich muss Dir wiedersprechen: Es ist sogar (hier) ein ganz guter Programmierstil. Gotos sollte man nicht per se verteufeln. Hier sind sie klar, kommentiert und verständlich.
Noch besser wäre jedoch eine Funktion und die Verwendung von Exit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Function MyFilter (Const aLine : String) : Boolean; Begin Result := False; If SucheNach('hallo') Then Exit; If SucheNach('Foobar') Then Exit; ... Result := True; End; |
Hendrik - Mo 04.02.08 23:36
Vielleicht habe ich dein Anliegen immer noch nicht richtig verstanden, aber du kannst mit einem Filter auch beliebig viele Felder ansprechen und durchsuchen:
Delphi-Quelltext
1:
| (Feld1='bla') OR (FELD2='bla') OR (FELD3='bla') |
jasocul - Di 05.02.08 10:19
Man benutze TQuery und lerne SQL.
Damit kann man sich den ganzen Kasperkram im Programm sparen und lässt den Server arbeiten. Eine schöner Volltext-Index kann da sicher noch einiges an Performance bringen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!