Фильтр Adoquery+combobox+edit

  • Автор темы vas
  • Дата начала
V
#1
Доброго времени суток. Столкнулся со следующим вопросом. Delphi7,Access. На форме есть ADOQuery, Edit,Label. Делаю фильтрацию:

Код:
procedure TForm1.Label1Click(Sender:TObject);
begin
//выборка по городу
Query1.Active:=false;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT *');
Query1.SQL.Add('FROM Contragents');
Query1.SQL.Add('WHERE Gorod LIKE '''+Edit1.Text+'''');
Query1.Active:=true;
end;
Все ОК.
Появилась необходимость добавления ComboBox, чтобы внести в него кроме города еще менеджера и т.п. и уже производить фильтрацию по другим критериям.

Код:
procedure TForm1.Label1Click(Sender:TObject);
begin
//выборка по городу
Query1.Active:=false;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT *');
Query1.SQL.Add('FROM Contragents');
Query1.SQL.Add('WHERE ''+ComboBox1.Text+'' LIKE '''+Edit1.Text+'''');
Query1.Active:=true;
end;
Вот тут и начались проблемы,ничего не могу сделать.
Подскажите,пожалуйста, в чем я ошибся? Спасибо
 

V88

Well-known member
22.10.2008
51
0
#2
А что находиться в ComboBoxe? ... имена полей из таблицы Contragents или что?
Если так, то надо писать не
Код:
Query1.SQL.Add('WHERE ''+ComboBox1.Text+'' LIKE '''+Edit1.Text+'''');
, а
Код:
Query1.SQL.Add('WHERE '+ComboBox1.Text+' LIKE '''+Edit1.Text+'''');
И вообще лучше проверь правильность соответствия имен полей таблицы с записями в ComboBoxe.
 
E
#5
А ктож вам виноват, что вы на квери полезли? пользуйте датасетом и коммандом.
 
D

DenProx

#6
как я понял, здесь нужна фильтрация по нескольким условиям .... могу предложить такой вариант, может поможет:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT *');
ADOQuery1.SQL.Add('FROM tblOrderBy');
if (Length(Edit1.Text) > 0) or
(Length(Edit2.Text) > 0) then
begin
ADOQuery1.SQL.Add('WHERE Stend_ID LIKE' + #39 + Edit1.Text + '%' + #39 +' AND ');
ADOQuery1.SQL.Add(' Block_ID LIKE' + #39 + Edit2.Text + '%' + #39);
ADOQuery1.Active := True;
end
else
begin
ADOQuery1.Active := True;
ADOQuery1.First;
end;
end;
 
E
#7
DenProx Никогда не пишите SQL.Add, это не читаемо и криво, проще и красивее писать так:
Код:
ADOQuery1.SQL.Text := Format('SELECT * FROM tblOrderBy WHERE Stend_ID LIKE %s AND Block_ID LIKE %s', QuotedStr(Edit1.Text + '%'), QuotedStr(Edit2.Text + '%'));
Ну а если всетаки в предикате условия может быть переменное число условий, то либо ифать, либо прибегнуть к хитрости
Код:
where (:P1 is null OR [Pole1]=:P1) AND (:P2 is null OR [Pole2]=:P2)
, тогда нуловый параметр просто проигнорируется.

И ваще пользовать надо параметры, как единственно правильный подход.