TRIGGER Oracle

24/04/2020

6

Boa tarde meus amigos, se alguem puder me ajudar com pelo menos uma ideia ficarei muito grato!
No meu banco de dados tenho uma tabela dos itens da nota fiscal e nessa tabela tem uma coluna que define o local de onde o produto está saindo(deposito,loja...)
Se o usuário não define o local do produto, esse campo vem com o código 0, o que me causa um problema.
Para resolver este problema, pensei que uma trigger pra que antes dos dados serem inseridos caso haja algum local de estoque = 0 a trigger busca-se o codigo do local padrão que fica em outra tabela, que é a tabela de produtos.
Se vocês puderem me ajudar a montar a estrutura dessa trigger vai ser ótimo pois vou resolver um problema e de cara ainda vou ganhar aprendizado.
caso alguém não tenha entendido oque quero fazer podem perguntar.
Responder

Posts

você pode alterar o modo de gravação no sistema?
o ideal seria colocar uma proteção na digitação do item da nota fical, de modo a negar a inclusão do item caso seja informado um local inválido/indevido. na verdade ao digitar o produto, o sistema já deveria sugerir a movimentação no local padrão do produto e, obviamente, permitir que seja trocado por um outro existente/válido.

de qualquer modo, se o conteúdo já está indicado na tabela e você não vai utilizá-lo, sugiro trocá-lo antes de manipular o estoque. assim você mantém a integridade dos dados caso seja - e provavelmente será - necessário rastrear a movimentação do produto.
CREATE OR REPLACE TRIGGER NFS_ITEM_TriggerBefore
BEFORE INSERT
   ON NFS_ITEM
   FOR EACH ROW
DECLARE
   v_local NUMBER; // não sei o tipo, assumi numérico
   nfs_item_local0 EXCEPTION;
BEGIN
   -- Procura pelo local padrão no cadastro de produtos
   SELECT prd_local INTO v_local FROM PRODUTO WHERE prd_codigo = :new.nfs_item_produto;

   -- Altera o local no item da nota, caso o conteúdo atual seja 0
   IF (:new.nfs_item_local = 0) THEN
      :new.nfs_item_local = v_local;

   -- Se mesmo depois de tratar o cadastro de produtos o conteúdo do local
   -- ainda é 0, lavanta uma exceção e não permite gravar o registro
   IF (:new.nfs_item_local = 0) THEN
      RAISE nfs_item_local0;

   -- Manipula o estoque do produto
   UPDATE ESTOQUE SET est_saldo = est_saldo - :new.nfs_item_quant
   WHERE est_produto = :new.nfs_item_produto AND est_local = :new.nfs_item_local;
EXCEPTION
   WHEN nfs_item_local0 THEN
      DBMS_OUTPUT.PUT_LINE('Local 0 não é aceito. Indique um local válido');
END;


Responder

27/04/2020

Gustavo Paula

Emerson, Bom dia.
Primeiramente Muito Obrigado pela ajuda.
Na verdade já existe uma proteção na aplicação quanto a locais de estoque, e funciona muito bem quando o sistema principal está sendo usado.
Porém com um outro sistema que esta integrado não está funcionando muito bem, já pedi a empresa desenvolvedora que ajuste porém não me dão a solução, então vou realizar os teste aqui na trigger, ajusta-la conforme as minhas tabelas... Pra que tenha solução ate um retorno dos desenvolvedores.
Você me ajudou muito!
Nunca mais esqueço a logica agora kkkk.
Responder

28/04/2020

Cesar Azeredo

Se criar a trigger na inserção de dados dos itens da nota alterando informações nestes mesmos itens vai gerar erro pq gera um loop. Funcionaria se o trigger for criado no cabeçalho da nota verificando os itens!
Responder
Cezar Azeredo, sua afirmação só é verdadeira se a alteração fosse feita por UPDATE, o que não é o caso apresentado acima.
Responder

28/04/2020

Gustavo Paula

Boa tarde, no caso Cesar o cabecalho da nota e a tabela de itens e ligada por uma PK , ainda estou validando a trigger mais os teste que fiz ate agora está tudo funcionando, assim que colocar no modo produção eu dou um feedback sobre o funcionamento mais até o momento está me atendendo.
Fiz alguns ajustes pra me atender, mais ficou show de bola.
Grato.
Responder

28/04/2020

Cesar Azeredo

Cezar Azeredo, sua afirmação só é verdadeira se a alteração fosse feita por UPDATE, o que não é o caso apresentado acima.
Verdade, não tinha verificado que esta usando before insert no trigger.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar