Форум: "Базы";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Вниз
Как заставить ХП распознавать входящую переменную как часть услов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 5.463 c