1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

    Скрыть объявление

Фильтр Adoquery+combobox+edit

Тема в разделе "Delphi - Базы данных", создана пользователем vas, 19 авг 2010.

Наш партнер Genesis Hackspace
  1. vas

    vas Гость

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

    Код (Delphi):
    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, чтобы внести в него кроме города еще менеджера и т.п. и уже производить фильтрацию по другим критериям.

    Код (Delphi):
    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;
    Вот тут и начались проблемы,ничего не могу сделать.
    Подскажите,пожалуйста, в чем я ошибся? Спасибо
     
  2. V88

    V88 Well-Known Member

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

    etc Гость

    И та тоже писать не надо. Надо изучит что такое параметры и функцию Format. проблем станет меньше.
     
  4. LISS

    LISS Гость

    Коряво работает с параметрами ADOQuery, через раз, день нормально, день проект перелопачиваешь, а ничего не трогал.
     
  5. etc

    etc Гость

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

    DenProx Гость

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

    etc Гость

    DenProx Никогда не пишите SQL.Add, это не читаемо и криво, проще и красивее писать так:
    Код (Delphi):
    ADOQuery1.SQL.Text := Format('SELECT * FROM tblOrderBy WHERE Stend_ID LIKE %s AND Block_ID LIKE %s', QuotedStr(Edit1.Text + '%'), QuotedStr(Edit2.Text + '%'));
    Ну а если всетаки в предикате условия может быть переменное число условий, то либо ифать, либо прибегнуть к хитрости
    Код (Text):
    where (:P1 is null OR [Pole1]=:P1) AND (:P2 is null OR [Pole2]=:P2)
    , тогда нуловый параметр просто проигнорируется.

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

    DenProx Гость

    учту на будущее))
     
Загрузка...

Поделиться этой страницей