Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > запрос с кучей условий


Автор: delphi_ 25.12.2006, 21:52
есть запрос,берущий условия запроса из кучи edit.text`ов

Код

ADOQuery5.SQL.text:='SELECT * from  Радиодетали where Пасп_Номер='+edit1.text+
  ' and Код_Наименование='+Edit2.text+
  ' and Код_Страны_Произв='+Edit3.text+
  ' and Код_Фирмы_Произв='+Edit4.text+
  ' and Макс_Темп='+Edit5.text+
  ' and Мин_Темп='+edit6.text+
  ' and Макс_Напр='+edit7.text+
  ' and Мин_Напр='+edit8.text+
  ' and Тип_Напряжения='+edit9.text+
  ' and Напряжение='+edit10.text+
  ' and Электроемкость='+edit11.text+
  ' and Сопротивление='+edit12.text;
 ADOQuery5.Open;


Проблема заключаеться в том,что если какое либо поле не заполнить-то аксесс ругаеться на отсутсвие одного  из параметров поиска..
Пробовал сделать так-

Код

if trim(edit1.text) = emptystr then переменная='';


тогда он тоже ругаеться...звездочка там тоже не катит,ибо он тогда будит искать звездочки в таблице

и так-
Код

if trim(edit5.text) <> emptystr then
ADOQuery5.SQL.Add('Макс_Темп=' + edit6.text + ' and ')
else ADOQuery5.SQL.Add('');

тогда он просто каждый раз делает текст запроса ЗАНОВО...


Вопрос-что же сделать с запрос или кодом,чтобы он игнорировал не заполненные эдиты?










Автор: ТоляМБА 26.12.2006, 06:15
Цитата(delphi_ @  25.12.2006,  21:52 Найти цитируемый пост)
else ADOQuery5.SQL.Add('');
 Вот это убери - зачем пустые строки плодить?
Цитата(delphi_ @  25.12.2006,  21:52 Найти цитируемый пост)
ADOQuery5.SQL.Add('Макс_Темп=' + edit6.text + ' and ')
 Если это будет последней строкой, то "and" просто сгенерирует ошибку. Пиши так:
Цитата(delphi_ @  25.12.2006,  21:52 Найти цитируемый пост)
ADOQuery5.SQL.Add(' and Мин_Темп='+edit6.text);

Тут можно посоветовать чтобы много строчек не писать - проходит циклом все Edit компоненты и передавать через массив в запрос. ИМХО.

Автор: kobra 26.12.2006, 08:14
Код

ADOQuery5.SQL.text:='SELECT * from  Радиодетали where 1=1'
if trim(edit5.text) <> emptystr then
  ADOQuery5.SQL.Add('and Макс_Темп=' + edit6.text)
...


Автор: Akella 26.12.2006, 08:29
тебе нужно логически самому строить условия, например

Код

Condition :string;
begin

Condition := #13#10+'where ';
if edit1.text <> '' then Condition := Condition + #13#10+'and pole1 = '+edit1.text;
if edit2.text <> '' then Condition := Condition + #13#10+'and pole2 = '+edit2.text;
...

ну в таком стиле....
и ещё нужно определять нужно ли вообще where

Автор: delphi_ 26.12.2006, 12:44
гм
Код

Condition := #13#10+'SELECT FROM Радиодетали WHERE ';
if edit1.text <> '' then Condition := Condition + #13#10+'Пасп_Номер = '+edit1.text;
if edit2.text <> '' then Condition := Condition + #13#10+'and Код_Наименование = '+edit2.text;
if edit3.text <> '' then Condition := Condition + #13#10+'and Код_Страны_Произв = '+edit3.text;
if edit4.text <> '' then Condition := Condition + #13#10+'and Код_Фирмы_Произв = '+edit4.text;
if edit5.text <> '' then Condition := Condition + #13#10+'and Макс_Темп = '+edit5.text;
if edit6.text <> '' then Condition := Condition + #13#10+'and Мин_Темп = '+edit6.text;
if edit7.text <> '' then Condition := Condition + #13#10+'and Макс_Напр = '+edit7.text;
if edit8.text <> '' then Condition := Condition + #13#10+'and Мин_Напр = '+edit8.text;
if edit9.text <> '' then Condition := Condition + #13#10+'and Тип_Напряжения = '+edit9.text;
if edit10.text <> '' then Condition := Condition + #13#10+'and Напряжение = '+edit10.text;
if edit11.text <> '' then Condition := Condition + #13#10+'and Электроемкость = '+edit11.text;
if edit12.text <> '' then Condition := Condition + #13#10+'and Сопротивление = '+edit12.text;

Ошибка синтаксиса в предложении WHERE..

Автор: Vas 26.12.2006, 13:12
Если Edit1.Text='' то после WHERE у тебя будет идти слово AND естественно синтаксис будет неправильным.

Автор: Akella 26.12.2006, 16:32
Цитата(delphi_ @  26.12.2006,  12:44 Найти цитируемый пост)
Ошибка синтаксиса в предложении WHERE..

я тебе просто показал пример, принцип так сказать, а дальше сам работай головой

Автор: kobra 26.12.2006, 21:46
Цитата(kobra @  26.12.2006,  08:14 Найти цитируемый пост)
where 1=1
вот это и спасает от лишнего and

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)