TRIGGER Oracle

24/04/2020

0

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.
Gustavo Paula

Gustavo Paula

Responder

Posts

26/04/2020

Emerson Nascimento

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

28/04/2020

Emerson Nascimento

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

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar