Das ist relativ unkompliziert.
Erstelle dir einfach eine Procedure in der du die
Query mit den entsprechenden WHERE Paramatern neu öffnest. Die Procedure rufst du dann im onKeyPress deines EditFeldes bzw. im onCloseUp der Combobox auf.
Die Variante mit der DBLookupCombobox kannst du vergessen. Damit bekommst du nur eine Notlösungen hin.
Verwende statt dessen eine Combobox.
kleines Beispiel:
(Den Code habe ich hier schnell zusammengetippt. Habe grade keine
IDE zur Verfügung.)
Delphi-Quellcode:
procedure TForm1.RunQuery;
var SQL, Option_e, Option_c, SQLOperator:
String;
// Option_e = Bedingung des EditFeldes, Option_c = Bedingung der Combobox
begin
// Optionen parsen
// Edit
if trim(Edit1.text) <> '
'
then
Option_e = Edit1.text;
// Combobox Option vervollständigen (Feldname)
if Combobox1.text <> '
<alle>'
then
begin
Option_c = '
Vorname = ''
'+Combobox1.text+'
''
';
// Suchbegriff muss immer so aussehen ''Suchbegriff''
end;
// SELECT zusammenbauen
SQL='
SELECT * FROM MeineTabelle';
// Falls Optionen angegeben wurden, dann hinzufügen
if Length(Option_e + Option_c)> 0
then
begin
if (Length(Option_e) <> 0)
AND
(Length(Option_c) <> 0)
THEN
SQLOperator = '
AND';
SQL :=
SQL + '
' + Option_e + '
' + SQLOperator + '
' + Option_c;
// Query Öffen, ggf. Fehlermeldung ausgeben
try
AdoQuery1.close;
AdoQuery1.SQL.text:=
SQL;
AdoQuery1.open;
except
on e:
Exception do
Showmessage('
Bei der Ausführung der Query ist folgender Fehler aufgetreten:'+#13#10+
e.
message);
end;
end;
end;
Nachdem die
Query geöffnet wurde füllst du die Combobox wieder mit gültigen Werten:
im AdoQuery1.AfterOpen
Delphi-Quellcode:
Procedue TForm1.AdoQuery1.AfterOpen(Dataset:TDataset);
var Q:TAdoQuery;
S:
String;
begin
// Combobox für den Filter "Vorname" leeren
Combobox1.items.clear;
// die Option "<alle>" hinzufügen
Combobox1.items.add('
<alle>');
// jetzt alle Werte der Spalte z.B. "Vorname" in einer zweiten Abfrage noch einmal holen
// Diesesmal jedoch mit "DISTINCT" um doppelte Werte zu vermeiden und "ODERR BY" zum sortieren
// dynamische Query instanzieren, SQL zusammenbauen und Öffnen
try
Q:=TAdoAuery.create(self;
Q.Connection:=AdoQuery1.Connection;
// Den SQL String deiner AdoQuery ab dem Wort FROM in S einlesen
S:=COPY(AdoQuery1.sql.text,pos('
FROM'),length(AdoQuery1.sql.text);
// neuen SQL String fpr Q.SQL bauen
Q.SQL.text := '
SELECT DISTINCT VORNAME'+ '
' + S + '
' + '
ORDER BY VORNAME';
// Sollte jetzt z.B. so aussehen
// SELECT DISTINCT VORNAME FROM XYZ WHERE Name = ''Meier'' ORDER BY VORNAME
// Query öffnen und Combobox füllen
Q.open;
While not Q.eof
do
begin
Combobox.items.add(Q.FieldByName('
Vorname').AsString;
Q.next;
end;
finally
FreeAndNil(Q);
end;
// Jetzt sieht die Combobox in etwa so aus:
// <alle>
// Anton
// Berta
// Sigfried
end;
Ich hoffe es hilft etwas.
Wie gesagt, der Code ist hier live getippt und nicht getestet.
Kleine Fehler bitte ich zu entschuldigen ...
Schöne Grüße,
Jens