Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2011, 12:50   #1
MrMorozko
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 115
Восклицание ADOQuery фильтр

Всем привет, почему то ругается на тип данных и раз на то пошло верно ли составлен запрос Спасибо_)
Код:
procedure TForm4.Button1Click(Sender: TObject);
var st2,st3,st4:string;
begin
Edit1.Text:=st3;
Edit2.Text:=st4;

st2:=ComboBox1.Text;
 if st2='Наименование' then begin osnovnaya.adoTable1.IndexName:='2';st2:='name'; end else
 if st2='Цена' then begin osnovnaya.adoTable1.IndexName:='3';st2:='price'; end else
  if st2='Гарантия' then begin osnovnaya.adoTable1.IndexName:='4'; st2:='guarantee'; end else
   if st2='Идентификатор' then begin osnovnaya.adoTable1.IndexName:='1'; st2:='iden'; end else

begin
 ADOQuery1.Active:=false;
   ADOQuery1.SQL.Clear;
   ADOQuery1.SQL.Add('SELECT *');
   ADOQuery1.SQL.Add('FROM tableA');
   Ругается сдесь>>>>>>ADOQuery1.SQL.add('WHERE '''+st2+''''' < '''''+st3+''''' and '''+st2+''''' > '''''+st4+''''' );
   ADOQuery1.Active:=true;
end;



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 21.04.2011 в 13:17.
MrMorozko вне форума Ответить с цитированием
Старый 21.04.2011, 13:19   #2
maLoy*508
Форумчанин
 
Аватар для maLoy*508
 
Регистрация: 28.03.2008
Сообщений: 672
По умолчанию

где то напутали с кавычками... проще использовать параметрический запрос....
попробуй-те так:
Цитата:
ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT *');
ADOQuery1.SQL.Add('FROM tableA');
ADOQuery1.SQL.add('WHERE (:st2_p < :st3_p) and (:st2_p > :st4_p) ' );

ADOQuery1.Parameter.ParamByName('st 2_p').value := st2;
ADOQuery1.Parameter.ParamByName('st 3_p').value := st3;
ADOQuery1.Parameter.ParamByName('st 4_p').value := st4;
ADOQuery1.Active:=true;
и еще у 'and' приоритет выше чем у '>' или '<', так что нужно брать в скобки(если мне конечно память не изменяет...)

Последний раз редактировалось maLoy*508; 21.04.2011 в 13:22.
maLoy*508 вне форума Ответить с цитированием
Старый 21.04.2011, 13:20   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) я бы начал с того, что проиницилизировал переменные st3 и st4
т.е. вместо:
Edit1.Text:=st3;
Edit2.Text:=st4;

написал:
Код:
st3 := Edit1.Text;
st4 := Edit2.Text;
2) разобрался, на каких типах данных выдаётся ошибка.
Дело в том, что в кавычки нужно брать только строковые константы.
А числовые - не надо.

ну и очень хорошо в подобных ситуациях помогает вывод текста запроса (ADOQuery1.SQL.Text куда-нибудь, где можно посмотреть: Memo, внешний файл, или даже банальный ShowMessage(ADOQuery1.SQL.Text);

ну и
Цитата:
Сообщение от maLoy*508
проще использовать параметрический запрос....
+1
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.04.2011, 13:42   #4
MrMorozko
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 115
По умолчанию

Спасибо, запрос проходит но не работает....Хмм...
MrMorozko вне форума Ответить с цитированием
Старый 21.04.2011, 21:02   #5
MrMorozko
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 115
По умолчанию

Просьба глянуть, запрос проходить но фильтрация не проходит...должна фильтровать от A до В, что интересно без указания переменных а при указанием точного поля и значения А и В тоже никакой реакции (типо WHERE (tableA.Идентификатор>'5') and (tableA.Идентификатор<'15')
Код:
var st2,st3,st4:string;
begin
st3:=Edit1.Text;
st4:=Edit2.Text;

st2:=ComboBox1.Text;
 if st2='Наименование' then begin st2:='name'; end else
 if st2='Цена' then begin st2:='price'; end else
  if st2='Гарантия' then begin st2:='guarantee'; end else
   if st2='Идентификатор' then begin st2:='iden'; end else

begin
ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT *');
ADOQuery1.SQL.Add('FROM tableA');
ADOQuery1.SQL.add('WHERE (:st2_p >:st3_p) and (:st2_p < :st4_p)');
ADOQuery1.Active:=true;
ADOQuery1.Parameters.ParamByName('st2_p').value := st2;
ADOQuery1.Parameters.ParamByName('st3_p').value := st3;
ADOQuery1.Parameters.ParamByName('st4_p').value := st4;
MrMorozko вне форума Ответить с цитированием
Старый 21.04.2011, 22:51   #6
MrMorozko
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 115
По умолчанию

Вот при таком раскладе
Код:
Osnovnaya.ADOQuery1.Active:=false;
Osnovnaya.ADOQuery1.SQL.Clear;
Osnovnaya.ADOQuery1.SQL.Add('SELECT *');
Osnovnaya.ADOQuery1.SQL.Add('FROM tableA');
Osnovnaya.ADOQuery1.SQL.add('WHERE ('+ComboBox1.Text+'='+Edit1.Text+') and ('+ComboBox1.Text+' <= '+Edit2.Text+') ' );
Osnovnaya.ADOQuery1.Active:=true;
Говорит что параметр данного поля не имеет значения по умолчанию
MrMorozko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фильтр ADOQuery+ComboBox+Edit vsa_210465 БД в Delphi 3 19.08.2010 18:09
ADoQuery Night_owl БД в Delphi 6 29.07.2010 12:48
AdoQuery Stanislav БД в Delphi 34 26.06.2009 22:09
ADOQuery Roof БД в Delphi 2 12.07.2008 18:08