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

Delphi Sources



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

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

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

пустое поле <> null

попробуй:
Код:
if Trim(Num_S) = '' then
  Parameters.ParamByName('Num_Start').Value := Null;
else 
  Parameters.ParamByName('Num_Start').Value := Num_S;
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз

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

вот полный код
Код:
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  
Старый 13.04.2013, 21:20
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Цитата:
в комботы ничего не пишу, сразу жму на выполнение запроса. Должны выйти все строки таблицы.
нет, не должны ...
см. мой пост выше
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #20  
Старый 14.04.2013, 09:04
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)' );
Если ИСТИНА, то работает, ИНАЧЕ не работает.

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

Что в этом запросе не так, почему если ввести существующий диапазон, то выводит пусто?
Код:
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  
Старый 17.04.2013, 09:36
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А не проще было вместо всего этого:
Код:
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  
Старый 17.04.2013, 09:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

И к переменным Num_S,Num_E применять Trim лучше сразу при их инициализации.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #24  
Старый 17.04.2013, 12:41
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

выдает ошибку "incompatible types"
Ответить с цитированием
  #25  
Старый 17.04.2013, 12:53
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от DOR
выдает ошибку "incompatible types"
Просто скобка не в том месте здесь:
Код:
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  
Старый 17.04.2013, 13:17
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну на коленке писал, мог и обшибится в скобках.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
DOR (17.04.2013)
  #27  
Старый 22.10.2013, 18:31
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Здравствуйте, есть такой запрос:
Код:
select *
from post_plat
where post_plat.razneseno = :razneseno

if CheckBox1.Checked = true then
ParamByName('razneseno').AsString := '1'
else
ParamByName('razneseno') не учитывать, как будто where вообще нет.
Как при определенных условиях исключить параметр запроса? СУБД Firebird. Спасибо.

Последний раз редактировалось DOR, 22.10.2013 в 18:38.
Ответить с цитированием
  #28  
Старый 22.10.2013, 19:22
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Самое простое:
Код:
select *... where (condition1 = :param1) or (1=1) -- или 1=2, если нужно, чтоб только первое условие работало
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


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

Не понимаю как применить на свой пример. Перенесите пожалуйста на мой пример.
Ответить с цитированием
  #30  
Старый 22.10.2013, 21:19
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Очевидно так:
Код:
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 все же как-то учитывается
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter