Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-1101985857
DelphiN!
2004-12-02 14:10
2005.02.13
Получить IP адрес клиента, подключившегося к TidMappedPortTCP


14-1106244642
netnetnetnet
2005-01-20 21:10
2005.02.13
Физика


14-1106554532
Prohodil Mimo
2005-01-24 11:15
2005.02.13
Где достать инфу по работе с кассовыми аппаратами?


14-1106542876
Kerk
2005-01-24 08:01
2005.02.13
Филармония.


3-1105456574
AlexXn
2005-01-11 18:16
2005.02.13
Midas+SocketServer ПРОБЛЕМЫ!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский