Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.04.2013, 22:54
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию Исключение параметра отбора в SQL

Добрый вечер подскажите пожалуйста, как исключить параметр отбора в SQL? Например вот запрос
Код:
      With ADOQuery1 do
        begin
          Close;
          SQL.Clear;
          Parameters.Clear;
          SQL.Add('SELECT * FROM bso WHERE f_Der = iif(Edit1.text = '',то данное условие отбора не использовать,:DER)');
          Parameters.ParamByName('DER').Value := Edit1.Text;
          Open;
        end;

т.е. если Edit1 пустой, то WHERE в запросе не использовать.
Ответить с цитированием
  #2  
Старый 09.04.2013, 23:24
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Можно конечно и запрос собирать:
Код:
SQL.Text := 'SELECT * FROM bso ';
if Edit1.text <> '' 
then begin
       SQL.Text := SQL.Text + 'WHERE f_Der =:Der'
       Parameters.ParamByName('DER').Value := Edit1.Text; 
       end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 10.04.2013, 07:45
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Вариант. "Можно конечно и запрос собирать:" означает что есть и альтернатива? Where будет несколько условий отбора, и все они связаны с компонентами.
Ответить с цитированием
  #4  
Старый 10.04.2013, 09:14
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

тогда сколько компонентов, столько и if в программе. сам SQL не знает что такое компоненты.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 10.04.2013, 09:19
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

А если информацию из компонентов записывать во временную таблицу и проверять значения в полях таблицы, так тоже не получиться? Просто предпологается 4 параметра и вариаций If получается много.
Ответить с цитированием
  #6  
Старый 10.04.2013, 09:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

правильней условие составить нужное:

Код:
var
  whr: String;

  procedure AddParam(fld: String; val: String; e: TEdit);
  begin
    if e.Text='' then Exit;
    if whr='' then whr:=fld+' = :'+val else whr:=whr+' and '+fld+' = :'+val;
  end;

begin
  whr:='';
  AddParam('f1', 'p1', Edit1);
  AddParam('f2', 'p2', Edit2);
  AddParam('f3', 'p3', Edit3);
  AddParam('f4', 'p4', Edit4);
  Edit5.Text:=whr;
end;

http://zalil.ru/34425633
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
DOR (10.04.2013)
  #7  
Старый 10.04.2013, 10:13
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Код:
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'SELECT * FROM bso WHERE f_Der = IIF(:der IS NULL, f_Der, :der)';
ADOQuery1.Parameters.ParamByName('der').Value := Edit1.Text;
ADOQuery1.Open;
не?
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз

Последний раз редактировалось Yurk@, 10.04.2013 в 10:51.
Ответить с цитированием
Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение:
DOR (10.04.2013)
  #8  
Старый 10.04.2013, 11:53
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от DOR
Вариант. "Можно конечно и запрос собирать:" означает что есть и альтернатива? Where будет несколько условий отбора, и все они связаны с компонентами.
Верно уловили подтекст. Есть еще пара вариантов, и один вы уже озвучили. Создается временная таблица, куда пишутся ваши значения, затем уже через inner join двух таблиц получаем результат.
Другой вариант состоит в том, что вы используете в условии не равенство, а Like. Примерно так:
Код:
ADOQuery1.SQL.Text := 'SELECT * FROM bso WHERE f_Der like :der';
ADOQuery1.Parameters.ParamByName('der').Value := Edit1.Text+'%';
И получается, что если параметр пуст, то выберется все, а если что-то есть в параметре, то сработает ограничение.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
DOR (10.04.2013)
  #9  
Старый 10.04.2013, 13:56
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Всем большое спасибо за оказанную помощь, задание выполнено, все работает.
Ответить с цитированием
  #10  
Старый 13.04.2013, 12:48
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Помогите пожалуйста победит between в запросе, я что то пишу не так, только не могу понять что.
Код:
procedure Tf_BSO_Otchet.bt_SQLClick(Sender: TObject);
var
  Num_S, Num_E: string;
begin
  if Length(tb_S_Ser.Text) = 1 then
    begin
      Num_S := tb_S_Ser.Text + '/'  + tb_S_Num.Text;
      Num_E := tb_E_Ser.Text + '/'  + tb_E_Num.Text;
    end
  else
    begin
      Num_S := tb_S_Ser.Text + tb_S_Num.Text;
      Num_E := tb_E_Ser.Text + tb_E_Num.Text;
    end;

  With Q_Otchet do
    begin
      Close;
      SQL.Clear;
      Parameters.Clear;
      SQL.Add('SELECT BSO.ID, Vid_Blanka.Name_Vid_Blanka, BSO.Num, Status_BSO.Name_Status, Kontragent.Sokr_Name, BSO.D_Per');
      SQL.Add('FROM Status_BSO RIGHT JOIN (Kontragent RIGHT JOIN (Vid_Blanka RIGHT JOIN BSO ON Vid_Blanka.ID = BSO.f_Vid_Blanka) ON Kontragent.ID = BSO.f_Der) ON Status_BSO.ID = BSO.f_Status_BSO');

      SQL.Add('WHERE BSO.Num BETWEEN Like :Num_Start and Like :Num_End' );

      Parameters.ParamByName('Num_Start').Value := Num_S + '%';
      Parameters.ParamByName('Num_End').Value := Num_E + '%';
      Open;
    end;
end;

Последний раз редактировалось DOR, 13.04.2013 в 12:52.
Ответить с цитированием
  #11  
Старый 13.04.2013, 13:41
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

BETWEEN и LIKE неприменимы в одной паре
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #12  
Старый 13.04.2013, 13:55
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Пытался по вашему примеру
Код:
SQL.Add('WHERE BSO.Num BETWEEN iif(:Num_Start is null, Num, :Num_Start) and iif(:Num_End is null, Num, :Num_End)' );
 
Parameters.ParamByName('Num_Start').Value := Num_S;
Parameters.ParamByName('Num_End').Value := Num_E;
но тоже не выходит.
Ответить с цитированием
  #13  
Старый 13.04.2013, 16:55
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Цитата:
но тоже не выходит.
что именно не выходит?
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #14  
Старый 13.04.2013, 20:02
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

не возвращает ни одной строки.
Ответить с цитированием
  #15  
Старый 13.04.2013, 20:24
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

а если ничего не возвращает - значит нет данных которые подходят под это условие.
показывай чем равны пеерменные Num_S и Num_E, а также строку которая теоретически должна найтись
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter