![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый вечер подскажите пожалуйста, как исключить параметр отбора в 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
|
||||
|
||||
|
Можно конечно и запрос собирать:
Код:
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
|
|||
|
|||
|
Вариант. "Можно конечно и запрос собирать:" означает что есть и альтернатива? Where будет несколько условий отбора, и все они связаны с компонентами.
|
|
#4
|
||||
|
||||
|
тогда сколько компонентов, столько и if в программе. сам SQL не знает что такое компоненты.
|
|
#5
|
|||
|
|||
|
А если информацию из компонентов записывать во временную таблицу и проверять значения в полях таблицы, так тоже не получиться? Просто предпологается 4 параметра и вариаций If получается много.
|
|
#6
|
||||
|
||||
|
правильней условие составить нужное:
Код:
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
|
||||
|
||||
|
Код:
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;Последний раз редактировалось Yurk@, 10.04.2013 в 10:51. |
| Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение: | ||
DOR (10.04.2013)
| ||
|
#8
|
||||
|
||||
|
Цитата:
Другой вариант состоит в том, что вы используете в условии не равенство, а 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
|
|||
|
|||
|
Помогите пожалуйста победит 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
|
||||
|
||||
|
BETWEEN и LIKE неприменимы в одной паре
|
|
#12
|
|||
|
|||
|
Пытался по вашему примеру
Код:
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
|
||||
|
||||
|
Цитата:
|
|
#14
|
|||
|
|||
|
не возвращает ни одной строки.
|
|
#15
|
||||
|
||||
|
а если ничего не возвращает - значит нет данных которые подходят под это условие.
показывай чем равны пеерменные Num_S и Num_E, а также строку которая теоретически должна найтись |