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

Вниз

Создание процедуры программно   Найти похожие ветки 

 
yuray   (2004-12-06 12:57) [0]

Уважаемые мастера! Как программно создать хранимую процедуру?
При использовании TQuery, ругается на строку типа "into :parametr".
Если создавать простенькую процедуру компонентом TQuery, например:
       create procedure myproc returns (a integer)
as
begin
  a=5;
end
тогда все работает.


 
ЮЮ ©   (2004-12-06 12:59) [1]

ParamCheck отключи


 
yuray   (2004-12-06 13:21) [2]

Сделал ParamCheck=false,
query1.ExecSQL.
Пишет General SQL error. Token unknown - line 20, char 6?
В 20 строке: into :parametr.
Этот запрос запускаю в IB Expert - все работает.


 
Zacho ©   (2004-12-06 13:25) [3]

Приведи полностью текст запроса.


 
yuray   (2004-12-06 13:33) [4]

CREATE PROCEDURE BALANC_PILG
RETURNS (
   PAYERCODE VARCHAR(9),
   N INTEGER,
   BORG DOUBLE PRECISION,
   COMPENS DOUBLE PRECISION,
   VAR_BORG DOUBLE PRECISION)
AS
DECLARE VARIABLE NARAH FLOAT;
DECLARE VARIABLE SYBSIDY FLOAT;
DECLARE VARIABLE OPL_PAYMENT FLOAT;
DECLARE VARIABLE OPL_RECEIPTS FLOAT;
DECLARE VARIABLE VAR_BILLNUM INTEGER;
DECLARE VARIABLE VAR_BILLPRIVPAY DOUBLE PRECISION;
DECLARE VARIABLE VAR_BILLTARIFFSTD DOUBLE PRECISION;
DECLARE VARIABLE VAR_BILLTARIFFPRIV DOUBLE PRECISION;
DECLARE VARIABLE VAR_BILLPRIVCONS INTEGER;
BEGIN
 FOR select payercode from payers
 into :payercode
 DO
 BEGIN
   select count(*) from bills
   where payercode=:payercode and billprivcons is not null and billprivcons<>0 and (billpayed<>billtopay or billpayed is null)
   into :n;
   if (:n>0) then
   begin
     /* ====================== Borg start ========================*/
     narah=0.00; sybsidy=0.00;
     select sum(billcalc+billtax),sum(billsubsidy)
     from bills a where payercode=:payercode
     into :narah, :sybsidy;
     /*------------------------------*/
     opl_payment=0.00;
     select sum(receiptpay) from payment
     where billnum is not null and payercode=:PAYERCODE
     into :opl_payment;
     /* --------------------------- */
     opl_receipts=0.00;
     select sum(receiptpay) from receipts
     where billnum is not null and payercode=:PAYERCODE
     into :opl_receipts;
     /* ---------------- */
     BORG=0.00; compens = 0.00;
     if (:narah is null) then narah=0.00;
     if (:sybsidy is null) then sybsidy=0.00;
     if (:opl_payment is null) then opl_payment=0.00;
     if (:opl_receipts is null) then opl_receipts=0.00;
     BORG=:narah-:sybsidy-:opl_payment-:opl_receipts;
     /* ====================== Borg end ========================*/
     if (:borg>0) then
     begin
       var_borg = :borg;
       for select billnum from bills
       where payercode=:payercode and billprivcons is not null and billprivcons<>0 and (billpayed<>billtopay or billpayed is null)
       order by billnum
       into :var_billnum
       do
       begin
         var_billprivpay=0.00;
         select billtariffstd, billtariffpriv, billprivcons, billprivpay from bills
         where payercode=:payercode and billnum=:var_billnum
         into :var_billtariffstd, :var_billtariffpriv, :var_billprivcons, :var_billprivpay;
         if ((:var_billtariffstd is not null) and (:var_billtariffpriv is not null)
         and (:var_billprivpay is not null)) then
         begin
           if (:var_billprivpay <= :var_borg) then
           begin
             compens = :compens + (:var_billtariffstd - :var_billtariffpriv)*:var_billprivcons;
             var_borg = :var_borg - :var_billprivpay;
           end /*else
           begin
             compens = :compens + (:var_billtariffstd - :var_billtariffpriv)*(:var_borg/:var_billtariffpriv);
             var_borg = :var_borg - :var_billprivpay;
           end */
         end
       end
   suspend;
   end
   end
 END
end


 
Johnmen ©   (2004-12-06 13:50) [5]

И где здесь :parametr ?


 
Zacho ©   (2004-12-06 14:14) [6]

Johnmen ©   (06.12.04 13:50) [5]

Вероятно, имеется в виду into :payercode

2 yuray
На первый взгляд, синтаксических ошибок в приведённом коде нет. Ты уверен, что запрос в TQuery и приведённый запрос абсолютно одинаковые ?
И ещё : вместо SELECT COUNT советую использовать EXIST


 
yuray   (2004-12-06 16:46) [7]

Запрос в TQuery и приведённый запрос абсолютно одинаковые(копирую через буфер). Более того, он успешно работает в IB Expert.
Я всегда создавал процедуры с помощью IB Experta либо скриптом и с такой проблемой не встречался. Вероятно, проблемы и нет как таковой. Но тогда где я ошибаюсь?


 
yuray   (2004-12-06 16:47) [8]

Запрос в TQuery и приведённый запрос абсолютно одинаковые(копирую через буфер). Более того, он успешно работает в IB Expert.
Я всегда создавал процедуры с помощью IB Experta либо скриптом и с такой проблемой не встречался. Вероятно, проблемы и нет как таковой. Но тогда где я ошибаюсь?
За EXIST спасибо.


 
Zacho ©   (2004-12-06 18:08) [9]

yuray   (06.12.04 16:47) [8]

Чёрт его знает, в чём там дело. Я уже плохо помню BDE, но вроде бы там есть что-то типа SQL Monitor ? Посмотри, какой запрос реально уходит на сервер.


 
yuray   (2004-12-07 12:29) [10]

Упростим задачу. Чтобы снять подозрения с самой процедуры, предлагаю создать программно такую универсальную процедуру
CREATE PROCEDURE PROCEDURES
RETURNS (
   NAME VARCHAR(25))
AS
BEGIN
 FOR select rdb$procedure_name from rdb$procedures
 into :name
 DO
 BEGIN
   suspend;
 END
end

Такая процедура будет работать в любой IB базе.
Когда пытаюсь ее создать с помощью TQuery, ругается на  into :name.
Как программно создать такую процедуру?


 
ЮЮ ©   (2004-12-07 13:08) [11]

> Если уж упрощать задачу, то хотябы взять компоненты с InterBase закладки, а не BDE :) В IBQuery достаточно отключить CheckParams, как и сказал в [1].


 
Zacho ©   (2004-12-07 13:10) [12]

Сейчас попробовал - SQL Monitor показал, что вместо :name BDE передаёт в запросе ?
Как с этим бороться - не знаю, давно уже не пользуюсь BDE.
Кардинальное решение - выкинь BDE и переходи на IBX, FIBPlus и т.д. и т.п.


 
ЮЮ ©   (2004-12-07 13:19) [13]

Хотя в хелпе о TQury.ParamCheck написано как раз то, что и должно быть :(


 
yuray   (2004-12-07 16:13) [14]

Кардинальное решение - это хорошо. Работает нормально когда отключил ParamCheck и ручками почистил Params (независимо от того, когда отключаешь ParamCheck, в Params IBQuery кидает все символы в запросе перед которыми стоит ":").

Всем спасибо.

PS. Это еще один камень в огород BDE.


 
Johnmen ©   (2004-12-07 16:36) [15]

>PS. Это еще один камень в огород BDE.

Не-а. Это ещё один камень в того, кто плохо изучил используемый инструмент.
И БДЕ здесь совершенно непричём...


 
yuray   (2004-12-07 16:52) [16]

Может с камнем я и зря... Но нельзя утверждать, что в "том огороде"
мало камней. Это уже другая тема, которая на этом форуме подымалась не раз.

Как это сделать с помощью TQuery?

Я думаю, есть много хороших программ написанных на D2, D3, которые переписывать из-за подобной проблемы нет смысла.


 
Johnmen ©   (2004-12-07 17:05) [17]

А нет никакой проблемы с TQuery в разрезе поставленного вопроса...


 
yuray   (2004-12-07 17:25) [18]

А где проблема? (Только не надо еще раз повторять, что проблема во мне. Я и так с этим полностью согласен.)
Еще раз излогаю вопрос:
1. Создаю пустой проект.
2. Кидаю на форму TDatabase и TQuery. Прописываю все необходимые параметры.
3. Проверяю коннект к базе. Проходит.
4. В TQuery ставлю ParamCheck=false.
5. В SQL TQuery кидаю
 CREATE PROCEDURE PROCEDURES
 RETURNS (
    NAME VARCHAR(25))
 AS
 BEGIN
   FOR select rdb$procedure_name from rdb$procedures
   into :name
   DO
   BEGIN
     suspend;
   END
 end
6. Делаю TQuery.Active=true  и возникает ошибка  
General SQL error. Token unknown - line 7, char 5 ?.
Перекинул все в IBQuery - работает.
Где ошибка???


 
yuray   (2004-12-07 17:25) [19]

А где проблема? (Только не надо еще раз повторять, что проблема во мне. Я и так с этим полностью согласен.)
Еще раз излогаю вопрос:
1. Создаю пустой проект.
2. Кидаю на форму TDatabase и TQuery. Прописываю все необходимые параметры.
3. Проверяю коннект к базе. Проходит.
4. В TQuery ставлю ParamCheck=false.
5. В SQL TQuery кидаю
 CREATE PROCEDURE PROCEDURES
 RETURNS (
    NAME VARCHAR(25))
 AS
 BEGIN
   FOR select rdb$procedure_name from rdb$procedures
   into :name
   DO
   BEGIN
     suspend;
   END
 end
6. Делаю TQuery.Active=true  и возникает ошибка  
General SQL error. Token unknown - line 7, char 5 ?.
Перекинул все в IBQuery - работает.
Где ошибка???


 
Johnmen ©   (2004-12-07 17:33) [20]

Это НЕ ПРОБЛЕМА. Просто ты забыл очистить коллекцию параметров. Если мы говорим о рантайме.
Но вот в дизайне такое поведение совершенно нормально, что и прописано в исходниках...:)))


 
yuray   (2004-12-07 17:45) [21]

Как очистить коллекцию параметров в рантайме?
Query.params.clear не проходит


 
Rule ©   (2004-12-07 17:46) [22]

чегото все так сложно, просто засунь свой запрос в IBScript да и все, там хоть саму базу создавай всеравно


 
Johnmen ©   (2004-12-07 17:56) [23]

>Query.params.clear не проходит

С чего ты взял ?


 
yuray   (2004-12-07 17:58) [24]

я добавил на форму кнопку

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 Query1.Params.Clear;
 Query1.ExecSQL
end;

Таже ошибка


 
yuray   (2004-12-07 18:01) [25]

Разумеется, кнопку давлю в рантайме


 
Johnmen ©   (2004-12-07 18:03) [26]

А где ParamCheck:=False ?


 
yuray   (2004-12-07 18:09) [27]

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 Query1.Params.Clear;
 Query1.ParamCheck:=False;
 Query1.ExecSQL
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 Query1.ParamCheck:=False;
 Query1.Params.Clear;
 Query1.ExecSQL
end;

Не проходит... Таже ошибка.


 
yuray   (2004-12-07 18:14) [28]

> Rule
Я не задаю вопрос "Как создать процедуру?" или "Как проще всего создать процедуру?"


 
Rule ©   (2004-12-07 19:29) [29]

yuray   (06.12.04 12:57)
Уважаемые мастера! Как программно создать хранимую процедуру?

вот так звучал вопрос и я вроде не него ответил , чем тебе не нравится ИБСкрипт


 
ЮЮ ©   (2004-12-08 06:47) [30]

Итак, анализ кода показал, что БДЕ исполняет не то, что записано в TQuery.SQL.Text, а то, что - в TQuery.Text, т.е. текст запроса после парсинга (cм.Неlp TQuery.Text)

Но это не баг, а фича. :)



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

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

Наверх




Память: 0.55 MB
Время: 0.051 c
14-1102886151
Piter
2004-12-13 00:15
2005.01.09
Посоветуйте насчет Wi-FI


14-1103731070
Almaz
2004-12-22 18:57
2005.01.09
Каталог оптовых цен на продукты питания в 2003 г.


3-1102542933
Vemer
2004-12-09 00:55
2005.01.09
Работа с External Tables..


4-1101073459
Tack
2004-11-22 00:44
2005.01.09
Получить состояния клавиш Ctrl, Alt, Shift


1-1103438626
Алексей Петухов
2004-12-19 09:43
2005.01.09
LoadFromClipboardFormat