Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заставить ХП распознавать входящую переменную как часть услов [D7, IB6.x]


jiny ©   (2005-01-13 09:38:00) 

Проблема такая,
Есть ХП, куда входят переменные ID_firm Integer,id_kl Integer, id_date varchar(60)
Вот Код ХП (сама процедура без заголовка):

 /* Procedure Text */
 For select num_TOV,name_tov,ost_tek,ost_tek
 from tovar t,seria s
 where s.num_tov=t.num_tov and s.num_firm=:id_firm
 and s.num_ser=(select max(num_ser)
 from seria s2 where s2.num_tov=t.num_tov)
 into
 :tmp_num_tov,:tmp_nametov,:TMP_RASHOD,:TMP_RASHOD
 do
 begin
   
   select sum(kol) from fr1_1,fr1_2 where fr1_2.id=fr1_1.id
   and  fr1_1.flag=1 and fr1_2.id_tov=:TMP_NUM_TOV
   into :tmp_Rashod;

/*Вот здесь проблема : хотелось бы :ID_period вставлять вроде этого :

   select sum(kol) from fr1_1,fr1_2 where fr1_2.id=fr1_1.id
   and  fr1_1.flag=1 and fr1_2.id_tov=:TMP_NUM_TOV and :id_period
   into :tmp_Rashod;

 suspend;
 end



Но server выдает ошибку Parsing error, соответственно как строку он его видит, а мне хотелось бы чтобы он видел ее как часть блока WHERE

Как заставить ХП распознавать входящую переменную как часть кода ?


Deniz   (2005-01-13 14:13:00) [1]

>Виталий Панасенко   (13.01.05 13:08) [14]
Да есть такая штука(execute statement), но в данном случае можно обойтись ЮЮ ©   (13.01.05 11:54) [13]


Виталий Панасенко   (2005-01-13 13:08:00) [2]

В FireBird 1.5 можно конструировать выражения и затем их исполнять...Этот то, что тебе нужно


ЮЮ   (2005-01-13 11:54:00) [3]

можно
"AND ((:DateFrom = 0) OR (DATA_SD BETWEEN :DateFrom AND :DateTo))"
тогда при нулевом значении параметра DateFrom DATA_SD вообще не будет проверяться


ЮЮ   (2005-01-13 11:48:00) [4]

в Интербайзе тоже есть, но тогда надо тело запроса формировать как строку, а ты то пытаешься использовать именно запрос! Но это - дыра в безопасности.


jiny   (2005-01-13 11:46:00) [5]

>А ты на что? по месяцу и году не можешь вычислить первый и
>последний цень этого месяца?

>dateFrom := EncodeDate(year, month, 1);
>dateTo := dateFrom + DaysInTheMonth(year, month) - 1;

А как быть если за весь период : вычислить max & min и кинуть в ХП ?


jiny   (2005-01-13 11:43:00) [6]

ясно, но спасибо за содействие, просто в Foxe и кажется в Lispe есть такая процедура/функция которая позволяет запускать код, записанный в строке, т.е. интерпретировать его и проигрывать


ЮЮ   (2005-01-13 11:40:00) [7]

>нет, представьте, что пользователю надо просто за месяц вывести не будет же он каждый раз вводить с 01.01.2005 по 31.01.2005 - это неудобно.

А ты на что? по месяцу и году не можешь вычислить первый и последний цень этого месяца?

dateFrom := EncodeDate(year, month, 1);
dateTo := dateFrom + DaysInTheMonth(year, month) - 1;


jiny   (2005-01-13 11:29:00) [8]

Просто тех.неточность, вот как все должно выглядеть :

select sum(kol) from fr1_1,fr1_2 where fr1_2.id=fr1_1.id
  and  fr1_1.flag=1 and fr1_2.id_tov=:TMP_NUM_TOV :id_period
  into :tmp_Rashod;

где :id_period может быть чем угодно

2 ЮЮ
>а чем BETWEEN :DateFrom AND :DateTo не универсален?
нет, представьте, что пользователю надо просто за месяц вывести не будет же он каждый раз вводить с 01.01.2005 по 31.01.2005 - это неудобно.
Выход я нашел : запускаю запрос (по 3-м условиям) внутри ХП в зависимости от значений входных параметров, но хотелось бы что-то поизящней


ЮЮ   (2005-01-13 11:17:00) [9]

>за весь период , где просто ничего нет : ''

а 'AND' в запросе уже есть :)

а чем BETWEEN :DateFrom AND :DateTo не универсален?


jiny   (2005-01-13 11:07:00) [10]

Жаль, просто я хотел сделать процедуру более универсальной, чтобы можно было передавать туда :
за период (between (... and ...)
за месяц extract(month from data_sd)=.. and extract(year from data_sd)=..
за год extract(year from data_sd)=..
за весь период , где просто ничего нет : ''


ЮЮ   (2005-01-13 10:15:00) [11]

:ID_period, насколько я понял, это просто текстовый параметр, который может содержать что угодно, хоть '(DATA_SD IS NULL)', а может и вообще всякую чушь, т.е. по сути не является параметром запроса, т.к. состав запроса должен быть явно определен и не может быть изменен в ран-тайм.  
 Вместо "and :id_period" используй "AND (DATA_SD BETWEEN :DateFrom AND :DateTo)"


Виталий Панасенко   (2005-01-13 09:55:00) [12]

Хотя.. если ID_PERIOD это и есть год, то
(:ID_PERIOD=EXTRACT(YEAR from DATA_SD)) будет достаточно


Виталий Панасенко   (2005-01-13 09:54:00) [13]

а зачем апострофы ?..
(:ID_PERIOD=EXTRACT(YEAR from DATA_SD) AND EXTRACT(YEAR from DATA_SD)=2005)
так не катит ?


jiny   (2005-01-13 09:45:00) [14]

т.е. :ID_period=' extract(year from data_sd)=2005 '


jiny   (2005-01-13 09:44:00) [15]

где :ID_period=' and extract(year from data_sd)=2005'


Наверх

Титульная страница Поиск, карта сайта Написать письмо