Autor Beitrag
commin
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 17

WinXP
Delphi 5
BeitragVerfasst: Sa 02.02.08 14:00 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 04.02.08 22:18 
Titel: Re: nach meheren Schlagworten suchen
user profile icondummzeuch hat folgendes geschrieben:

ausblenden 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:

ausblenden 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;

_________________
Na denn, dann. Bis dann, denn.
Hendrik
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
(Feld1='bla'OR (FELD2='bla'OR (FELD3='bla')					
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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.