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 //suchen

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;
//messagedlg(inttostr(i),mtinformation, [mbok],0);
if ok=true then sucherg.showmodal;
if endsuch='true' then exit;
ok:=false;
form1.table1.next;
gauge1.progress:=i;
sucherg.gauge1.progress:=i;
//messagedlg('warte*',mtinformation, [mbok],0);
end;


Aber ich stehe ein wenig vor einem Rätsel wie ich dass auf meherere Anwenden kann....

Danke

Norman

Moderiert von user profile iconChristian S.: I- durch Delphi-Tags ersetzt


dummzeuch - Sa 02.02.08 16:34
Titel: Re: nach meheren Schlagworten suchen
user profile iconcommin 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 //suchen
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;
//messagedlg(inttostr(i),mtinformation, [mbok],0);
if ok=true then sucherg.showmodal;
if endsuch='true' then exit;
ok:=false;
form1.table1.next;
gauge1.progress:=i;
sucherg.gauge1.progress:=i;
//messagedlg('warte*',mtinformation, [mbok],0);
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

user profile iconHendrik 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
user profile icondummzeuch 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.