Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.035 c
14-1103715054
Vaitek
2004-12-22 14:30
2005.01.09
Анимация трехмерной модели.


11-1084877331
mdw
2004-05-18 14:48
2005.01.09
Обновились компоненты mdvXXX


3-1102588332
Garry_c
2004-12-09 13:32
2005.01.09
Как изменить (или переопределить) параметры у запроса DBE


14-1103455952
Cerberus
2004-12-19 14:32
2005.01.09
Самарцам


14-1103370738
Hypercube
2004-12-18 14:52
2005.01.09
Перевод C++ > Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский