Entwickler-Ecke

Datenbanken - DBASE Datenbank durchsuchen mit TQuery in einem DBGRID


Arne Danikowski - Di 11.09.07 14:45
Titel: DBASE Datenbank durchsuchen mit TQuery in einem DBGRID
Hallo erst einmal,

ich möchte folgendes realisieren:

Eine Datenbank (DBASE)soll über ein TForm1.Edit1Change durchsucht werden und das Ergebnis in einer DBGRID angezeigt werden. Dabei soll die bei dem ersten Eingegebnen Buchstaben die Suche beginnen (z.B. der Buchstabe A, dann sollen alle Ergebnisse angezeigt werden, die mit A beginnen) wird nun ein weiterer Buchstabe angegeben (z.B. Ad) sollen automatisch alle Ergebnisse die mit Ad beginnen im DBGRID angezeigt werden.
Über eine Checkbox soll die Spalte gewählt werden, die durchsucht werden soll.

folgendes habe ich gemacht.

Eine Session deklariert (z.B. jp)
Eine Table1 angelegt und mit der Dtaenbank und der Session jp verbunden
Einen DataSource1 angelegt und mit der Table verbunden
Eine query1 angelegt und mit DataSource1 und der Table1 sowie der Session verbunden
Eine DataSource2 angelegt und mit query1 verbunden
Eine DBGRID1 erstellt und mit DataSource2 verbunden.
Eine SQL abfrage erstellt für den ersten Programmstart und direkt ins Query1 unter SQL geseichert
(SELECT * FROM jp ODER BY name)

Das funktioniert auch soweit

Hier nun der Quelltext für TForm1.Edit1Change:

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:
26:
procedure TForm1.Edit1Change(Sender: TObject);
var suche:string;
begin
suche := Edit1.text + '%';
if
RadioButton1.Checked = true
then
begin
query1.Close;
query1.SQL.Clear;
query1.SQL.Add('select * from jp.dbf "'+suche+'"');
query1.Active:=true
end
else
if
RadioButton2.Checked = true
then
begin
query1.Close;
query1.SQL.Clear;
query1.SQL.Add('select * from jp ORDER BY NAME "'+suche+'"' );
query1.Active:=true
end
else
ShowMessage('Bitte einen Filter wählen');
end;


Das ganze ist noch ein Bastelgerüst, funktioniert auch nicht :) Warum? :)

ich habe das auch schon mal mit diesem Ausdruck versucht:

Delphi-Quelltext
1:
query1.SQL.Add('select name from jp.dbf WHERE name LIKE "'+suche+'"');                    


dann gibt es jedoch Felher, nicht beim Kompelieren, erst wenn ich versuche einen Buchstaben in das eingabefeld einzugeben.
SQL Fehler.

Kann da jemand einen Newbie helfen?

mfg


Critter - Mi 12.09.07 13:26

Hallo,

ich bin mir nicht sicher, Nutzt DBase Doppelte oder Einfache Anführungszeichen?

Du könntest ja mal query1.SQL.Add('select name from jp WHERE name LIKE ' + QuotedStr(suche));

Ansonsten, bekommst du eine Fehlermeldung?

critter


D. Annies - Mi 12.09.07 20:31

Hi, Arne, versuch mal folgendes in der Art: (adaptiert auf deinen Code)


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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
procedure TForm1.Edit13Change(Sender: TObject);
var kette, ts : string[20];
    gef       : boolean;
    leng      : integer;
    qxy       : TQuery;
begin
  kette := edit13.text; leng := length(edit13.text)+1; kette := AnsiLowercase(kette);
  if leng > 1 then
  begin
    qxy := NIL;
    if checkbox1.checked then qxy := QBuchstamm
    // QBuecher.sql.text := format('select * from "%s"', [TbBuecher.tablename]);
    else
    if checkbox5.checked then qxy := QLektueren
    else
    if checkbox4.checked then qxy := QBuecher
    else
    if checkbox8.checked then qxy := QLk;

    Qxy.first; gef := false;
    repeat
      ts := Qxy.fields[0].asstring;
      delete(ts, leng, length(Qxy.fields[0].asstring));
      ts := AnsiLowercase(ts);
      if kette = ts then gef := true else  Qxy.next;
    until gef or Qxy.eof;
    if gef then
    begin
      tit := Qxy.fields[0].asstring;
      Qxy.locate(Qxy.Fields[0].FieldName, tit, []);
    end;
    if Qxy.eof then
    begin
      showmessage(Qxy.Fields[0].FieldName + ' nicht vorhanden!');
      edit13.Text := ''; button11.setfocus;
    end;
  end;
end;