TRIGGER Oracle
24/04/2020
0
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
Posts
26/04/2020
Emerson Nascimento
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;
27/04/2020
Gustavo Paula
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.
28/04/2020
Cesar Azeredo
28/04/2020
Emerson Nascimento
28/04/2020
Gustavo Paula
Fiz alguns ajustes pra me atender, mais ficou show de bola.
Grato.
28/04/2020
Cesar Azeredo
Clique aqui para fazer login e interagir na Comunidade :)