![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
|||
|
|||
|
если я ничего не пишу в контролы, значит они пустые, значит запрос, должен вернуть всю таблицу, а он ничего не возвращаемый.
|
|
#17
|
||||
|
||||
|
пустое поле <> null
попробуй: Код:
if Trim(Num_S) = '' then
Parameters.ParamByName('Num_Start').Value := Null;
else
Parameters.ParamByName('Num_Start').Value := Num_S;Последний раз редактировалось Yurk@, 13.04.2013 в 20:50. |
|
#18
|
|||
|
|||
|
вот полный код
Код:
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 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;
Open;
end;
end;
в комботы ничего не пишу, сразу жму на выполнение запроса. Должны выйти все строки таблицы. |
|
#19
|
||||
|
||||
|
Цитата:
см. мой пост выше |
|
#20
|
|||
|
|||
|
Когда вводишь существующий диапазон значений, выдает пусто.
Код:
SQL.Add('WHERE BSO.Num BETWEEN iif(:Num_Start is null, Num, :Num_Start) and iif(:Num_End is null, Num, :Num_End)' );Последний раз редактировалось DOR, 14.04.2013 в 22:22. |
|
#21
|
|||
|
|||
|
Что в этом запросе не так, почему если ввести существующий диапазон, то выводит пусто?
Код:
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 iif(:Num_Start is null, Num, :Num_Start) and iif(:Num_End is null, Num, :Num_End)');
if (Trim(Num_S) = '') or (Trim(Num_E) = '') then
begin
Parameters.ParamByName('Num_Start').Value := Null;
Parameters.ParamByName('Num_End').Value := Null;
end
else
begin
Parameters.ParamByName('Num_Start').Value := Trim(Num_S);
Parameters.ParamByName('Num_End').Value := Trim(Num_E);
end;
Open;
end;
end; |
|
#22
|
||||
|
||||
|
А не проще было вместо всего этого:
Код:
SQL.Add('WHERE BSO.Num BETWEEN iif(:Num_Start is null, Num, :Num_Start) and iif(:Num_End is null, Num, :Num_End)');
if (Trim(Num_S) = '') or (Trim(Num_E) = '') then
begin
Parameters.ParamByName('Num_Start').Value := Null;
Parameters.ParamByName('Num_End').Value := Null;
end
else
begin
Parameters.ParamByName('Num_Start').Value := Trim(Num_S);
Parameters.ParamByName('Num_End').Value := Trim(Num_E);
end;
Open;Код:
if (Trim(Num_S) <> '') and (Trim(Num_E) <> '') then
SQL.Add('WHERE BSO.Num BETWEEN ''' + Trim(Num_S) + ''' and '''+ Trim(Num_E))+'''';
Open; |
|
#23
|
||||
|
||||
|
И к переменным Num_S,Num_E применять Trim лучше сразу при их инициализации.
|
|
#24
|
|||
|
|||
|
выдает ошибку "incompatible types"
|
|
#25
|
||||
|
||||
|
Цитата:
Код:
SQL.Add('WHERE BSO.Num BETWEEN ''' + Trim(Num_S) + ''' and '''+ Trim(Num_E))+''''; Код:
SQL.Add('WHERE BSO.Num BETWEEN ''' + Trim(Num_S) + ''' and '''+ Trim(Num_E)+''''); ps. И ещё в этих строках не должно быть символа апострофа. |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
DOR (17.04.2013)
| ||
|
#26
|
||||
|
||||
|
Ну на коленке писал, мог и обшибится в скобках.
![]() |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
DOR (17.04.2013)
| ||
|
#27
|
|||
|
|||
|
Здравствуйте, есть такой запрос:
Код:
select *
from post_plat
where post_plat.razneseno = :razneseno
if CheckBox1.Checked = true then
ParamByName('razneseno').AsString := '1'
else
ParamByName('razneseno') не учитывать, как будто where вообще нет.Последний раз редактировалось DOR, 22.10.2013 в 18:38. |
|
#28
|
||||
|
||||
|
Самое простое:
Код:
select *... where (condition1 = :param1) or (1=1) -- или 1=2, если нужно, чтоб только первое условие работало |
|
#29
|
|||
|
|||
|
Не понимаю как применить на свой пример. Перенесите пожалуйста на мой пример.
|
|
#30
|
||||
|
||||
|
Очевидно так:
Код:
select *
from post_plat
where (post_plat.razneseno = :razneseno) or (-1 = :razneseno)
if CheckBox1.Checked = true then
ParamByName('razneseno').AsInteger := 1
else
ParamByName('razneseno').AsInteger := -1-1 на тот случай, если 0 все же как-то учитывается |