Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

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

 
jiny   (2005-01-13 09:38) [0]

Проблема такая,
Есть ХП, куда входят переменные 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

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


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

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


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

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


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

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


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

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


 
ЮЮ ©   (2005-01-13 10:15) [5]

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


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

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


 
ЮЮ ©   (2005-01-13 11:17) [7]

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

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

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


 
jiny   (2005-01-13 11:29) [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:40) [9]

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

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

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


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

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


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

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

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

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


 
ЮЮ ©   (2005-01-13 11:48) [12]

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


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

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


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

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


 
Deniz   (2005-01-13 14:13) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
6-1101735729
Knight
2004-11-29 16:42
2005.02.13
Что такое со стримом?


14-1106208532
YurikGL
2005-01-20 11:08
2005.02.13
Куда идти молодому специалисту.


1-1106898918
Vn
2005-01-28 10:55
2005.02.13
Формулы в OLEVariant переменных


3-1105336148
Sens
2005-01-10 08:49
2005.02.13
Помогите сделать запрос с двойной связью


3-1105714432
beton
2005-01-14 17:53
2005.02.13
Файл MDE