![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заставить ХП распознавать входящую переменную как часть услов [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'