Fórum TRIGGER Oracle #609236
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
Curtir tópico
+ 0Posts
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;
Gostei + 0
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.
Gostei + 0
28/04/2020
Cesar Azeredo
Gostei + 0
28/04/2020
Emerson Nascimento
Gostei + 0
28/04/2020
Gustavo Paula
Fiz alguns ajustes pra me atender, mais ficou show de bola.
Grato.
Gostei + 0
28/04/2020
Cesar Azeredo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)