Фильтр Adoquery+combobox+edit

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

  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 Гость

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

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