![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание процедуры программно [D6, IB6.x]
yuray © (2004-12-06 12:57:00)Уважаемые мастера! Как программно создать хранимую процедуру?
При использовании TQuery, ругается на строку типа "into :parametr".
Если создавать простенькую процедуру компонентом TQuery, например:
create procedure myproc returns (a integer)
as
begin
a=5;
end
тогда все работает.
yuray (2004-12-07 12:29:00) [21]Упростим задачу. Чтобы снять подозрения с самой процедуры, предлагаю создать программно такую универсальную процедуру
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.
Как программно создать такую процедуру?
Zacho (2004-12-06 18:08:00) [22]yuray (06.12.04 16:47) [8]
Чёрт его знает, в чём там дело. Я уже плохо помню BDE, но вроде бы там есть что-то типа SQL Monitor ? Посмотри, какой запрос реальноуходит на сервер.
yuray (2004-12-06 16:47:00) [23]Запрос в TQuery и приведённый запрос абсолютно одинаковые(копирую через буфер). Более того, он успешно работает в IB Expert.
Я всегда создавал процедуры с помощью IB Experta либо скриптом и с такой проблемой не встречался. Вероятно, проблемы и нет как таковой. Но тогда где я ошибаюсь?
За EXIST спасибо.
yuray (2004-12-06 16:46:00) [24]Запрос в TQuery и приведённый запрос абсолютно одинаковые(копирую через буфер). Более того, он успешно работает в IB Expert.
Я всегда создавал процедуры с помощью IB Experta либо скриптом и с такой проблемой не встречался. Вероятно, проблемы и нет как таковой. Но тогда где я ошибаюсь?
Zacho (2004-12-06 14:14:00) [25]Johnmen © (06.12.04 13:50) [5]
Вероятно, имеется в виду into :payercode
2 yuray
На первый взгляд, синтаксических ошибок в приведённом коде нет. Ты уверен, что запрос в TQuery и приведённый запрос абсолютно одинаковые ?
И ещё : вместо SELECT COUNT советую использовать EXIST
Johnmen (2004-12-06 13:50:00) [26]И где здесь :parametr ?
yuray (2004-12-06 13:33:00) [27]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
Zacho (2004-12-06 13:25:00) [28]Приведи полностью текст запроса.
yuray (2004-12-06 13:21:00) [29]Сделал ParamCheck=false,
query1.ExecSQL.
Пишет General SQL error. Token unknown - line 20, char 6?
В 20 строке: into :parametr.
Этот запрос запускаю в IB Expert - все работает.
ЮЮ (2004-12-06 12:59:00) [30]ParamCheck отключи