Форум: "Базы";
Текущий архив: 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