|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Исключение параметра отбора в 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
|
||||
|
||||
Можно конечно и запрос собирать:
Код:
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
|
||||
|
||||
Цитата:
Другой вариант состоит в том, что вы используете в условии не равенство, а Like. Примерно так: Код:
ADOQuery1.SQL.Text := 'SELECT * FROM bso WHERE f_Der like :der'; ADOQuery1.Parameters.ParamByName('der').Value := Edit1.Text+'%'; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
DOR (10.04.2013)
|
#8
|
|||
|
|||
Всем большое спасибо за оказанную помощь, задание выполнено, все работает.
|
#9
|
|||
|
|||
Помогите пожалуйста победит 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. |