• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Фильтр Adoquery+combobox+edit

  • Автор темы vas
  • Дата начала
V

vas

Доброго времени суток. Столкнулся со следующим вопросом. 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;

Вот тут и начались проблемы,ничего не могу сделать.
Подскажите,пожалуйста, в чем я ошибся? Спасибо
 
V

V88

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

etc

А ктож вам виноват, что вы на квери полезли? пользуйте датасетом и коммандом.
 
D

DenProx

как я понял, здесь нужна фильтрация по нескольким условиям .... могу предложить такой вариант, может поможет:
Код:
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

etc

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)
, тогда нуловый параметр просто проигнорируется.

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!