Fórum executar sp em trigger #49982
22/03/2005
0
pq q eu naum consigo executar um procedure de dentro de uma trigger (before update) o fb da uma menssagem ´multiples rows´ qundo executa ela :?: . e fora da trigger ela funciona normal.
alguem aí tem uma boa resposta?
Tap_pedroso
Curtir tópico
+ 0Posts
22/03/2005
Faelcavalcanti
Certifique-se sobre o seus relacionamentos e suas depêndências. Não tenho certeza, mas já me dei mal com esse erro, quando fiz relacionamento de dependências, tipow, entidade/referência (Chave Estrageira) do tipo CASCADE.
Boa Sorte amigo!!!
Gostei + 0
23/03/2005
Gandalf.nho
Gostei + 0
23/03/2005
Tap_pedroso
AS
declare variable vLimite double precision;
DECLARE VARIABLE RETORNO INTEGER;
DECLARE VARIABLE NFATURA INTEGER;
DECLARE VARIABLE RN INTEGER;
DECLARE VARIABLE RNTEMP INTEGER;
DECLARE VARIABLE VALIDADE INTEGER;
DECLARE VARIABLE RN30D INTEGER;
DECLARE VARIABLE RNFM INTEGER;
DECLARE VARIABLE RNFU INTEGER;
DECLARE VARIABLE RN30DTEMP INTEGER;
DECLARE VARIABLE RNFMTEMP INTEGER;
DECLARE VARIABLE RNFUTEMP INTEGER;
DECLARE VARIABLE VRTARIFA DOUBLE PRECISION;
DECLARE VARIABLE SALDOATUAL DOUBLE PRECISION;
begin
IF (OLD.LIMITE <> NEW.LIMITE) THEN
BEGIN
vlimite = new.limite - old.limite;
UPDATE TABLIMITE TL
SET TL.LMTDISPONIVEL = TL.LMTDISPONIVEL + :vlimite
WHERE TL.NCONTA = OLD.NCONTA;
END
IF (OLD.DIAVENCIMENTO <> NEW.DIAVENCIMENTO) THEN
BEGIN
IF (NEW.DIAVENCIMENTO <> ´0´) THEN
BEGIN
SELECT * FROM SPCORTAVENC(OLD.NCONTA) INTO :RETORNO;
END
END
IF (OLD.FORMAPGTO <> NEW.FORMAPGTO) THEN
BEGIN
SELECT C.CODRN30D,C.CODRNFU,C.CODRNFM,C.CODRN30DTEMP,C.CODRNFUTEMP,C.CODRNFMTEMP
FROM TABCAMPANHA C WHERE C.CODIGO=OLD.CODCAMPANHA
INTO :RN30D,:RNFU,:RNFM,:RN30DTEMP,:RNFUTEMP,:RNFMTEMP;
IF (NEW.FORMAPGTO=1) THEN
BEGIN
IF (OLD.CODCAMPANHA IS NOT NULL) THEN
BEGIN
NEW.CODRN=:RNFM;
NEW.CODRNTEMP=:RNFMTEMP;
END
END
IF (NEW.FORMAPGTO=2) THEN
BEGIN
IF (OLD.CODCAMPANHA IS NOT NULL) THEN
BEGIN
NEW.CODRN=:RNFU;
NEW.CODRNTEMP=:RNFUTEMP;
END
END
IF (NEW.FORMAPGTO=3) THEN
BEGIN
IF (OLD.CODCAMPANHA IS NOT NULL) THEN
BEGIN
NEW.CODRN=:RN30D;
NEW.CODRNTEMP=:RN30DTEMP;
END
END
--****************************************************************************
IF (:VALIDADE > 0) THEN
BEGIN
SELECT RN.PERIODICO FROM REGRANEGOCIO RN WHERE RN.CODIGO=NEW.CODRN
INTO :VRTARIFA;
END
ELSE
BEGIN
SELECT RN.PERIODICO FROM REGRANEGOCIO RN WHERE RN.CODIGO=NEW.CODRNTEMP
INTO :VRTARIFA;
END
--****************************************************************************
IF ((OLD.FORMAPGTO=2 AND NEW.FORMAPGTO=1)OR(OLD.FORMAPGTO=1 AND NEW.FORMAPGTO=2)) THEN
BEGIN
FOR SELECT FT.NFATURA FROM TABFATURAS FT WHERE FT.NCONTA=OLD.NCONTA AND FT.FECHADA=´0´ INTO :NFATURA DO
BEGIN
UPDATE TABCOMPRAS C SET C.VALOR=:VRTARIFA
WHERE C.NFATURA=:NFATURA AND C.TPCOMP=´003053´;
END
END
IF ((OLD.FORMAPGTO=3 AND NEW.FORMAPGTO=2)OR(OLD.FORMAPGTO=3 AND NEW.FORMAPGTO=1)) THEN
BEGIN
UPDATE TABFATURAS FT SET FT.SALDOANT=0,FT.SALDOREMAN=0,FT.PGTOANT=0,
FT.PGTOMIN=FT.SALDOFATURA,FT.FECHADA=´1´ WHERE FT.NCONTA=OLD.NCONTA AND FT.FECHADA=´0´;
END
END
end
>>>>>>>>>>>>>>>>>store procedure SPCORTAVENC
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;
/* Stored procedures */
CREATE PROCEDURE ´SPCORTAVENC´
(
´NCONTA´ VARCHAR(7) CHARACTER SET WIN1252
)
RETURNS
(
´RETORNO´ INTEGER
)
AS
BEGIN EXIT; END ^
ALTER PROCEDURE ´SPCORTAVENC´
(
´NCONTA´ VARCHAR(7) CHARACTER SET WIN1252
)
RETURNS
(
´RETORNO´ INTEGER
)
AS
DECLARE VARIABLE DTATUAL DATE;
DECLARE VARIABLE CORTE INTEGER;
DECLARE VARIABLE NFATURA INTEGER;
DECLARE VARIABLE NUMCARTAO VARCHAR(16);
DECLARE VARIABLE VENCIMENTO DATE;
DECLARE VARIABLE HORA TIME;
DECLARE VARIABLE SALDOANT DOUBLE PRECISION;
DECLARE VARIABLE VRPG DOUBLE PRECISION;
DECLARE VARIABLE DTPG DATE;
DECLARE VARIABLE VENCANTERIOR DATE;
DECLARE VARIABLE DEBITO DOUBLE PRECISION;
DECLARE VARIABLE CREDITO DOUBLE PRECISION;
DECLARE VARIABLE PAGO VARCHAR(1);
DECLARE VARIABLE FECHADA VARCHAR(1);
DECLARE VARIABLE DTROT DATE;
DECLARE VARIABLE VRROT DOUBLE PRECISION;
DECLARE VARIABLE RN INTEGER;
DECLARE VARIABLE RNTEMP INTEGER;
DECLARE VARIABLE VALIDADE INTEGER;
DECLARE VARIABLE CARTENTR VARCHAR(1);
DECLARE VARIABLE TXADESAO DOUBLE PRECISION;
DECLARE VARIABLE TXADICIONAL DOUBLE PRECISION;
DECLARE VARIABLE PERIODICO DOUBLE PRECISION;
DECLARE VARIABLE TXREEMISSAO DOUBLE PRECISION;
DECLARE VARIABLE TXREADICIONAL DOUBLE PRECISION;
DECLARE VARIABLE TXROTATIVO DOUBLE PRECISION;
DECLARE VARIABLE TXPARCELADO DOUBLE PRECISION;
DECLARE VARIABLE TXATRASO DOUBLE PRECISION;
DECLARE VARIABLE MULTA DOUBLE PRECISION;
DECLARE VARIABLE TXPERIODO DOUBLE PRECISION;
DECLARE VARIABLE FV DOUBLE PRECISION;
DECLARE VARIABLE NDIAS INTEGER;
DECLARE VARIABLE SALDOATUAL DOUBLE PRECISION;
DECLARE VARIABLE NFATANTERIOR INTEGER;
DECLARE VARIABLE VRCOB DOUBLE PRECISION;
DECLARE VARIABLE PGMIN DOUBLE PRECISION;
DECLARE VARIABLE FORMAPG INTEGER;
--DECLARE VARIABLE NUMCONTA VARCHAR(7);
DECLARE VARIABLE VRJRSROT DOUBLE PRECISION;
DECLARE VARIABLE FTVRROT DOUBLE PRECISION;
DECLARE VARIABLE NOSSONUM VARCHAR(15);
DECLARE VARIABLE JUROSROT DOUBLE PRECISION;
DECLARE VARIABLE MULTAANT DOUBLE PRECISION;
DECLARE VARIABLE JUROSANT DOUBLE PRECISION;
DECLARE VARIABLE CALCMIN DOUBLE PRECISION;
DECLARE VARIABLE ABAT DOUBLE PRECISION;
BEGIN
SELECT CURRENT_TIME FROM RDB$DATABASE INTO :HORA;
SELECT CURRENT_DATE FROM RDB$DATABASE INTO :DTATUAL;
SELECT NDIAS FROM TABCORTE INTO :CORTE;
FOR SELECT FT.NFATURA,FT.NOSSONUM,FT.NTITULAR,FT.VENCIMENTO,FT.DEBITO,FT.CREDITO,FT.SALDOFATURA,JRSROT,VRROTATIVO
FROM TABFATURAS FT WHERE FT.NCONTA=:NCONTA AND FT.PAGO=´0´ AND FT.FECHADA=´0´
INTO :NFATURA,:NOSSONUM,:NUMCARTAO,:VENCIMENTO,:DEBITO,:CREDITO,:SALDOATUAL,:VRJRSROT,:FTVRROT DO
BEGIN
IF ((:SALDOATUAL=0)AND(:FTVRROT=0)AND(VRJRSROT=0)) THEN
BEGIN
SELECT SUM(VALORPG),SUM(ABAT) FROM TABPAGTO WHERE NOSSONUM=:NOSSONUM
INTO :VRPG,:ABAT;
IF (:ABAT IS NULL) THEN
BEGIN
ABAT=0;
END
SELECT UDF_ROUNDDEC((:VRPG + :ABAT),2) FROM RDB$DATABASE INTO :VRPG;
IF (:VRPG >= :DEBITO) THEN
BEGIN
UPDATE TABFATURAS FT SET FT.PAGO=´1´,FT.VRPAGO=:VRPG,FT.DATAPGTO=:DTATUAL WHERE FT.NOSSONUM=:NOSSONUM;
END
END
VRROT=0;
DTROT=NULL;
IF (:VRJRSROT IS NULL) THEN
BEGIN
VRJRSROT=0;
END
IF (:FTVRROT IS NULL) THEN
BEGIN
FTVRROT=0;
END
FOR SELECT CLI.CODRN,CLI.CODRNTEMP,CLI.VALIDADERN,CLI.CARTENTR,CLI.FORMAPGTO
FROM TABCLIENTES CLI WHERE CLI.NCONTA=:NCONTA
INTO :RN,:RNTEMP,:VALIDADE,:CARTENTR,:FORMAPG DO SUSPEND;
IF (:VALIDADE > 0) THEN
BEGIN
SELECT * FROM SPTAXAS2(:RNTEMP) INTO :TXADESAO,:TXADICIONAL,:PERIODICO,
:TXREEMISSAO,:TXREADICIONAL,:TXROTATIVO,:TXPARCELADO,:TXATRASO,:MULTA,:TXPERIODO;
--UPDATE TABCLIENTES SET VALIDADERN=VALIDADERN - 1 WHERE NCONTA=:NCONTA;
SUSPEND;
END
ELSE
BEGIN
SELECT * FROM SPTAXAS2(:RN) INTO :TXADESAO,:TXADICIONAL,:PERIODICO,
:TXREEMISSAO,:TXREADICIONAL,:TXROTATIVO,:TXPARCELADO,:TXATRASO,:MULTA,:TXPERIODO;
SUSPEND;
END
/********************************fatura anterior*****************************/
JUROSROT=0;
NFATANTERIOR=0;
SALDOANT=0;
VRPG=0;
DTPG=NULL;
VENCANTERIOR=NULL;
DEBITO=0;
CREDITO=0;
PAGO=´0´;
FECHADA=´0´;
PGMIN=0;
CALCMIN=0;
NOSSONUM=NULL;
SUSPEND;
FOR SELECT FIRST 1 FT.NFATURA,FT.NOSSONUM,FT.SALDOFATURA,/*FT.VRPAGO,*/FT.DATAPGTO,FT.VENCIMENTO,
FT.DEBITO,FT.CREDITO,FT.PAGO,FT.FECHADA
FROM TABFATURAS FT WHERE FT.NCONTA=:NCONTA AND FT.DATAPROC < :DTATUAL
ORDER BY FT.VENCIMENTO DESC INTO :NFATANTERIOR,:NOSSONUM,:SALDOANT,/*:VRPG,*/:DTPG,:VENCANTERIOR,
:DEBITO,:CREDITO,:PAGO,:FECHADA DO SUSPEND;
/********************************fatura anterior****************************/
/********************************calcula rotativo***************************/
SELECT FIRST 1 PG.DATAPG/*,PG.MULTA,PG.JRSATRASO*/ FROM TABPAGTO PG WHERE PG.NOSSONUM=:NOSSONUM ORDER BY
PG.DATAPG DESC INTO :DTROT/*,:MULTAANT,:JUROSANT*/;
SELECT SUM(VALORPG),SUM(MULTA),SUM(JRSATRASO) FROM TABPAGTO WHERE NOSSONUM=:NOSSONUM
INTO :VRPG,:MULTAANT,:JUROSANT;
IF (:MULTAANT IS NULL) THEN
BEGIN
MULTAANT=0;
END
IF (:JUROSANT IS NULL) THEN
BEGIN
JUROSANT=0;
END
SELECT UDF_ROUNDDEC((:VRPG-:MULTAANT-:JUROSANT),2) FROM RDB$DATABASE INTO :VRPG;
FV=0;
IF (:FTVRROT > 0) THEN
BEGIN
SELECT udf_DaysBetween(:DTROT,:VENCIMENTO) FROM RDB$DATABASE INTO :NDIAS;
SELECT udf_RoundDec((:TXROTATIVO / 30),6) FROM RDB$DATABASE INTO :TXROTATIVO;
SELECT udf_RoundDec((:TXROTATIVO * :NDIAS),6) FROM RDB$DATABASE INTO :TXROTATIVO;
--SELECT udf_RoundDec(:FTVRROT+((:FTVRROT*:TXROTATIVO)/100),2) FROM RDB$DATABASE INTO :FV;
SELECT udf_RoundDec(((:FTVRROT * :TXROTATIVO)/100),2) FROM RDB$DATABASE INTO :FV;
SELECT udf_RoundDec(:FV,2) FROM RDB$DATABASE INTO :FV;
--UPDATE TABFATURAS F SET F.JRSROT=F.JRSROT + :FV,
--F.SALDOFATURA=UDF_ROUNDDEC(F.SALDOFATURA + :FTVRROT + :FV + :VRJRSROT) WHERE F.NFATURA=:NFATURA;
/***********************INSERE VR JRS ROTATIVO**********************/
INSERT INTO TABCOMPRAS(NOPERACAO,DATA,HORA,VALOR,NCARD,ADICIONAL,TPCOMP,
NPARC,TIPO,NFATURA,NEXTRATO,DESCR,NPOS,CODLOJA,COMUNICACAO,COB,NDOC,NCONTA)VALUES
(GEN_ID(NUMOP,1),:DTATUAL,:HORA,UDF_ROUNDDEC(:FV+:VRJRSROT,2),:NUMCARTAO,:NUMCARTAO,´003054´,´01/01´,
´D´,:NFATURA,NULL,´ENCARGOS-ROTATIVO´,´00000000´,´999999999999997´,´0´,´0´,NULL,:NCONTA);
SUSPEND;
/***********************INSERE VR JRS ROTATIVO**********************/
SELECT UDF_ROUNDDEC(:FV+:VRJRSROT,2) FROM RDB$DATABASE INTO :JUROSROT;
SELECT udf_RoundDec(:FTVRROT + :JUROSROT,2) FROM RDB$DATABASE INTO :FV;
/* UPDATE TABVRROTATIVO SET VALOR=0, DATA=:DTATUAL, VRSJRS=0
WHERE NCARTAO=:NUMCARTAO;*/
END
/********************************calcula rotativo***************************/
/********************************fatura unica*******************************/
IF ((:FORMAPG=2)OR(:FORMAPG=1)) THEN
BEGIN
IF ((:NFATANTERIOR IS NULL) OR (:NFATANTERIOR=0)) THEN
BEGIN
SALDOANT=0;
VRPG=0;
SUSPEND;
END
/***********************CALCULA PGTO MINIMO*************************/
VRCOB=0;
PGMIN=0;
SELECT SUM(CP.VALOR)AS VRCOB FROM TABCOMPRAS CP WHERE CP.NFATURA=:NFATURA AND
CP.COB=´1´ INTO :VRCOB;
IF (:VRCOB IS NULL) THEN
BEGIN
VRCOB=0;
END
SELECT udf_RoundDec(:FV+:SALDOATUAL,2) FROM RDB$DATABASE INTO :FV;
SELECT udf_RoundDec(:FV-:VRCOB,2) FROM RDB$DATABASE INTO :CALCMIN;
--SELECT udf_RoundDec(((:FV * 50)/100),2) FROM RDB$DATABASE INTO :PGMIN;
SELECT udf_RoundDec(((:CALCMIN * 50)/100),2) FROM RDB$DATABASE INTO :PGMIN;
SELECT udf_RoundDec(:PGMIN+:VRCOB,2) FROM RDB$DATABASE INTO :PGMIN;
--IF (UDF_ROUNDDEC(:FV+:VRCOB,2) >= 20) THEN
IF (UDF_ROUNDDEC(:FV,2) >= 20) THEN
BEGIN
IF ((:PGMIN) < 20) THEN
BEGIN
--SELECT udf_RoundDec(((:FV * 40)/100)+:VRCOB,2) FROM RDB$DATABASE INTO :PGMIN;
PGMIN=20;
END
END
ELSE
BEGIN
--SELECT udf_RoundDec(:FV+:VRCOB,2)FROM RDB$DATABASE INTO :PGMIN;
--PGMIN=udf_RoundDec(:FV+:VRCOB,2);
PGMIN=udf_RoundDec(:FV,2);
END
/***********************CALCULA PGTO MINIMO*************************/
/*************************FINALIZA FATURA***************************/
UPDATE TABFATURAS FT SET FT.SALDOANT=:DEBITO/*:SALDOANT*/,FT.SALDOREMAN=:DEBITO/*:SALDOANT*/-:VRPG,
FT.PGTOANT=:VRPG,FT.SALDOFATURA=udf_RoundDec(:FV,2),FT.DEBITO=udf_rounddec((FT.DEBITO+:VRJRSROT+:FTVRROT),2),FT.PGTOMIN=:PGMIN,FT.FECHADA=´1´,FT.JRSROT=:JUROSROT WHERE
FT.NFATURA=:NFATURA;
/*************************FINALIZA FATURA***************************/
/********************************fatura mensal*******************************/
--END
--END
END
ELSE IF (:FORMAPG=3) THEN
BEGIN
IF ((:NFATANTERIOR IS NULL) OR (:NFATANTERIOR=0)) THEN
BEGIN
SALDOANT=0;
VRPG=0;
SUSPEND;
END
/*************************FINALIZA FATURA***************************/
UPDATE TABFATURAS FT SET FT.SALDOANT=0/*:SALDOANT*/,FT.SALDOREMAN=0,
FT.PGTOANT=0/*:VRPG*/, FT.PGTOMIN=:SALDOATUAL,FT.FECHADA=´1´ WHERE
FT.NFATURA=:NFATURA;
/*************************FINALIZA FATURA***************************/
/********************************fatura 3030*******************************/
--END
END
SUSPEND;
END
RETORNO=0;
SUSPEND;
end
^
SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;
Gostei + 0
23/03/2005
Gandalf.nho
Gostei + 0
23/03/2005
Tap_pedroso
Gostei + 0
23/03/2005
Gandalf.nho
Sim, pq do jeito que está agora irá dar a mensagem de erro se a SP retornar mais de um registro
Gostei + 0
23/03/2005
Faelcavalcanti
8)
Boa Sorte!!!
Gostei + 0
24/03/2005
Tap_pedroso
algum de vcs por favor pode me dar um exemplo? :?:
Gostei + 0
25/03/2005
Gandalf.nho
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)