Trigger para bloqueio de venda bloqueando também a compra

SQL

Big Data

Banco de Dados

Oracle PL SQL

25/02/2019

Boa tarde! Fiz uma Trigger para bloquear Unidades de medida não liberadas para venda do meu sistema, a regra funciona quando aplicada para sua função que é a venda, mas como trata-se da tabela de itens a mesma também é da compra, mas não quero que a trigger seja executada quando for do tipo de movimento "C" compra. Quando feita a primeira inserção o sistema aceita a regra de compra e valida a inserção, mas quando tento efetuar um update no item, trocá-lo para outra unidade o sistema ativa a trigger indevidamente. segue o código:
CREATE OR REPLACE TRIGGER "AD_TGFITE_IUP_REGRAS_UNIDLIB"
BEFORE INSERT OR UPDATE ON TESTE.TGFITE

FOR EACH ROW

/*Declarações-------------------------------------------------------*/
DECLARE
   P_GRUPO        INT;
   P_EXCECAO      VARCHAR2(2);
   P_PADRAO       VARCHAR2(2);
   P_USUEMP       INT;
   P_TOP          VARCHAR2(2);
   pragma AUTONOMOUS_TRANSACTION;
/*------------------------------------------------------------------*/
/*Início------------------------------------------------------------*/
BEGIN

/*Empresa do Usuário logado-----------------------------------------*/
    SELECT TSIUSU.CODEMP
           INTO P_USUEMP
           FROM TSIUSU
           WHERE TSIUSU.CODUSU = STP_GET_CODUSULOGADO();
/*------------------------------------------------------------------*/   
/*Grupo Usuario logado----------------------------------------------*/
   SELECT GRU.CODGRUPO
          INTO P_GRUPO
          FROM TSIGRU GRU, TSIUSU USU
          WHERE USU.CODGRUPO = GRU.CODGRUPO
          AND USU.CODUSU = STP_GET_CODUSULOGADO(); 
/*------------------------------------------------------------------*/
/*Ver se o produto é uma exceção------------------------------------*/
    SELECT PRO.AD_EXCECAO
           INTO P_EXCECAO
           FROM TGFPRO PRO
           WHERE PRO.CODPROD = :NEW.CODPROD;
/*------------------------------------------------------------------*/           
/*Ver se a Unidade Padrão está liberada para venda------------------*/
    SELECT PRO.CODVOL
           INTO P_PADRAO
           FROM TGFPRO PRO
           WHERE PRO.AD_MOBILIDADE = ''S''
           AND PRO.ATIVO = ''S''
           AND PRO.AD_PERMITEVENDA = ''N''
           AND  PRO.CODPROD = :NEW.CODPROD 
           AND PRO.CODVOL = :NEW.CODVOL;
/*------------------------------------------------------------------------------------------------*/
/*Verificar Tipo de Movimentação da TOP--------------------------------------------------*/
    SELECT CAB.TIPMOV
           INTO P_TOP
           FROM TGFCAB CAB, TGFITE ITE
           WHERE CAB.NUNOTA = ITE.NUNOTA
           AND ITE.NUNOTA = :NEW.NUNOTA;
        
/*-----------------------------------------------------------------------------------------------*/
/*Condições: se a variável for igual ao código da ite*/
IF P_PADRAO = :NEW.CODVOL AND P_EXCECAO = ''N'' AND P_TOP <> ''C''
OR P_PADRAO = :NEW.CODVOL AND P_GRUPO <> 11 AND P_TOP <> ''C''

   THEN
       RAISE_APPLICATION_ERROR(-20101,AD_FC_FORMATAHTML_BISPO(''Unidade Não Liberada para Venda!'',
                                                          ''Produto: ''||:NEW.CODPROD,
                                                       ''Unidade: ''||:NEW.CODVOL ));                                                      
END IF;
/*-------------------------------------------------------------------------------------------------*/
/*Excessões: caso não encontre dados, a variável receberá o indicado.------------------------------*/       
EXCEPTION
WHEN NO_DATA_FOUND THEN
  P_PADRAO :=''NA'';

/*--------------------------------------------------------------------------------------------------*/
END;
/*Fim---------------------------------------------*/
Maicon Scapatici

Maicon Scapatici

Curtidas 0
POSTAR