Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Claudio Borges

At End of Table

Recommended Posts

Boa tarde pessoal,

 

Estou com o seguinte problema, criei essa trigger para incluir um registro em uma tabela secundaria que tem como FK o registro da primaria, ja tentei executar a trigger em BEFORE e AFTER mas em ambos os casos o insert executado ocorre o "At end of table" pois o registro da primaria ainda não foi gravado.

 

Alguma sugestão para esse erro...

 

 

 

CREATE OR REPLACE TRIGGER TRG_INC_TGFCAB_COG

AFTER INSERT

ON TGFCAB

REFERENCING NEW AS NEW OLD AS OLD

FOR EACH ROW

DECLARE

 

PRAGMA AUTONOMOUS_TRANSACTION;

 

ERROMSG VARCHAR2(255);

ERROR EXCEPTION;

V_M3 FLOAT;

P_QTDNEG NUMBER;

P_CODPROD NUMBER;

P_PESOLIQ FLOAT;

P_PESOBRUTO FLOAT;

P_PESOLIQTOT FLOAT;

P_PESOBRUTOTOT FLOAT;

P_NUNOTA INT;

P_TEMPROD INT;

P_SEQ INT;

P_DHTIPVENDA DATE;

 

CURSOR C1 IS SELECT *

FROM TGFITE

WHERE NUNOTA = P_NUNOTA

AND USOPROD = 'M'

AND CODPROD = 10056;

 

BEGIN

P_TEMPROD := 0;

P_SEQ := 1;

 

IF INSERTING THEN

IF :NEW.CODTIPOPER = 36 THEN

 

COMMIT;

BEGIN

SELECT NUNOTA INTO P_NUNOTA

FROM TGFCAB CAB

WHERE NUMNOTA = NVL(TO_NUMBER(SUBSTR(:NEW.OBSERVACAO,17,10)),0)

AND CODEMP = 3

AND CODTIPOPER = 9;

EXCEPTION

WHEN NO_DATA_FOUND THEN

P_TEMPROD := 0;

END;

 

BEGIN

SELECT DISTINCT 1 INTO P_TEMPROD FROM TGFITE WHERE NUNOTA = P_NUNOTA AND USOPROD = 'M';

EXCEPTION

WHEN NO_DATA_FOUND THEN

P_TEMPROD := 0;

END;

IF P_TEMPROD = 1 THEN

 

FOR R1 IN C1

LOOP

 

 

BEGIN

INSERT INTO TGFITE (NUTAB,NUNOTA,SEQUENCIA,CODEMP,CODPROD,CODLOCALORIG,CONTROLE,USOPROD,CODCFO,QTDNEG,QTDENTREGUE,QTDCONFERIDA,VLRUNIT,VLRTOT,

VLRCUS,BASEIPI,VLRIPI,ALIQIPI,BASEICMS,ALIQICMS,VLRDESC,BASESUBSTIT,VLRSUBST,PENDENTE,CODVOL,CODTRIB,ATUALESTOQUE,OBSERVACAO,

RESERVA,STATUSNOTA,CODEXEC,CODVEND,FATURAR,CODOBSPADRAO,VLRREPRED,VLRDESCBONIF,PERCDESC,M3,ALIQICMSRED,CODPARCEXEC,CODUSU,DTALTER,

CUSTO,BASESUBSTSEMRED,SOLCOMPRA,ATUALESTTERC,TERCEIROS,CSTIPI,QTDWMS)

VALUES

(R1.NUTAB,:NEW.NUNOTA,R1.SEQUENCIA,R1.CODEMP,R1.CODPROD,R1.CODLOCALORIG,R1.CONTROLE,R1.USOPROD,R1.CODCFO,R1.QTDNEG,R1.QTDENTREGUE,R1.QTDCONFERIDA,0,0,

R1.VLRCUS,R1.BASEIPI,R1.VLRIPI,R1.ALIQIPI,R1.BASEICMS,R1.ALIQICMS,R1.VLRDESC,R1.BASESUBSTIT,R1.VLRSUBST,R1.PENDENTE,R1.CODVOL,R1.CODTRIB,0,R1.OBSERVACAO,

R1.RESERVA,R1.STATUSNOTA,R1.CODEXEC,R1.CODVEND,R1.FATURAR,R1.CODOBSPADRAO,R1.VLRREPRED,R1.VLRDESCBONIF,R1.PERCDESC,R1.M3,R1.ALIQICMSRED,R1.CODPARCEXEC,R1.CODUSU,R1.DTALTER,

R1.CUSTO,R1.BASESUBSTSEMRED,R1.SOLCOMPRA,R1.ATUALESTTERC,R1.TERCEIROS,R1.CSTIPI,R1.QTDWMS);

EXCEPTION

WHEN NO_DATA_FOUND THEN

RAISE_APPLICATION_ERROR(-20001, 'não encontrado');

WHEN OTHERS THEN

RAISE_APPLICATION_ERROR(-20001, 'erro: '||SQLERRM);

END;

/*

INSERT INTO TGFVAR (NUNOTA, SEQUENCIA, NUNOTAORIG, SEQUENCIAORIG, QTDATENDIDA, CUSATEND, ORDEMPROD,

STATUSNOTA, FIXACAO)

VALUES

(:NEW.NUNOTA, P_SEQ, R1.NUNOTA, R1.SEQUENCIA, R1.QTDNEG, NULL, NULL, 'A', NULL);

*/

P_SEQ := P_SEQ +1;

 

END LOOP;

COMMIT;

END IF;

 

END IF;

END IF;

 

 

 

EXCEPTION

WHEN ERROR THEN

RAISE_APPLICATION_ERROR(-20101, ERROMSG);

 

END TRG_INC_TGFCAB_COG;

/

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

At end of table - Tive este erro uma vez no Delphi, era de fato erro na Trigger.

 

Executou a operação da trigger direto no Oracle ?

 

Pq o Select na própriua tabela da trigger ?

 

Isto pode dar erro de mutating table, na trigger já se tem o ponteiro (:new.,:old) do registro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.