GARANTIR DESCONTO

Fórum executar sp em trigger #49982

22/03/2005

0

ola pessoal,


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

Tap_pedroso

Responder

Posts

22/03/2005

Faelcavalcanti

Cara. Parece que a partir da Trigger no momento em que ela está sendo disparada. Ela possui vários vínculos de registros para atualização, por isso mostra esta mensagem. Já no caso da procedure enviando os parâmetros manualmente você só terá um vínculo de registro.

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!!!


Responder

Gostei + 0

23/03/2005

Gandalf.nho

Coloque o código de sua trigger para darmos uma olhada


Responder

Gostei + 0

23/03/2005

Tap_pedroso

>>>>>trigger no cadastro de clientes TABCLIENTES em before update

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;


Responder

Gostei + 0

23/03/2005

Gandalf.nho

O problema é que vc montou uma consulta selecionável e na hora de chamá-la dentro da trigger você usa um SELECT simples que só deve ser usado se retornar apenas 1 linha. Ou vc usa FOR SELECT e traz todas as linhas ou usa FIRST 1 para limitar a apenas 1 linha de retorno.


Responder

Gostei + 0

23/03/2005

Tap_pedroso

certo, vc fala em eu dar um FOR SELECT ou um SELECT FIRST chamando a procedure SPCORTAVENC dentro da trigger?


Responder

Gostei + 0

23/03/2005

Gandalf.nho

certo, vc fala em eu dar um FOR SELECT ou um SELECT FIRST chamando a procedure SPCORTAVENC dentro da trigger?


Sim, pq do jeito que está agora irá dar a mensagem de erro se a SP retornar mais de um registro


Responder

Gostei + 0

23/03/2005

Faelcavalcanti

Aconselho a utilizar um [b:ff328448c8]FOR[/b:ff328448c8].

8)
Boa Sorte!!!


Responder

Gostei + 0

24/03/2005

Tap_pedroso

ok, mas me falem uma coisa como eu vou usar um[b:a2be63383d] for select do [/b:a2be63383d]nessa procedure sem colocar um [b:a2be63383d]into [/b:a2be63383d]para receber o retorno.eu tentei mas naum consegui compilar a trigger.

algum de vcs por favor pode me dar um exemplo? :?:


Responder

Gostei + 0

25/03/2005

Gandalf.nho

O INTO sempre é necessário para receber os valores dos campos


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar