Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Trigger


Pirambu!

Pergunta

Eu Criei uma Procedure para controlar o Estoque de Produto de uma Tabela, como eu faço para criar uma Trigger para as tabelas de EntradaEstoque e VendaProdutos?

na tabela Produto tem os seguintes campos:

ProdutoID,Produto,ValorUnit,QuantEntrada,QuantSaida,SaldoEstoque

Procedure 1

Create Procedure EntradaProduto()
Begin
Update Tproduto set QuantEntrada = (Select sum(Quantentrada) from TEntradaEstoque where ProdutoID = ProdutoID);
Update TProduto Set SaldoEstoque = QuantEntrada - QuantSaida;
end
Procedure 2
Create Procedure EntradaProduto()
Begin
Update Tproduto set QuantSaida = (Select sum(QuantSaida) from TVendaProduto where ProdutoID = ProdutoID);
Update TProduto Set SaldoEstoque = QuantEntrada - QuantSaida;
end

Quero criar uma trigger para quando as tabelas TEntradaEstoque e TVendaProduto tivessem alguma alteração (adicionado, alterado ou deletado) atualize meu estoque,

Alguém sabe com eu faço isso

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0
Oi Denis Courcy, eu sei como fazer no SqlServe mas no Mysql é totalmente diferente, você pode me explicar porque Before e não After? e no caso de alteração Update como a Triiger e acionada?

Before: a trigger é acionada antes do evento ser executado. Exemplo: Se estou fazendo um log de update para uma tabela específica, então devo usar o before, pois me interessa guardar os valores antes que sejam modificados.

Veja o exemplo: Em uma tabela de nome 'tempo', que contem o atributo 'dia', existe um registro com valor 10 para este atributo. Se executo

UPDATE tempo
SET dia = 25;

Quando atrigger for acionada como BEFORE UDATE o valor NEW.dia será 25 e o valor de OLD.dia será 10

No caso de DELETE não há NEW.dia. Apenas OLD.dia.

After: A trigger é executada após o evento ser executado. Ou seja, os valores de NEW.dia e OLD.dia serão iguais.

Uma trigger é criada desta forma:(Resolvido) É possível: dois campos timestamp com default current_time

Link para o comentário
Compartilhar em outros sites

  • 0

Denis valeu pela explicação, então eu vou te que criar tres trigger para cada tabela:

Before insert
begin
...
end;
before Update
begin
...
end;
before Delete
begin
...
end;

neste caso eu não preciso da procedure posso acionar a atualização direto pela Trigger é isso?

Link para o comentário
Compartilhar em outros sites

  • 0
Denis valeu pela explicação, então eu vou te que criar tres trigger para cada tabela:

...

neste caso eu não preciso da procedure posso acionar a atualização direto pela Trigger é isso?

Pode ser. Você também pode chamar a procedure dentro da trigger. A vantagem será, dependendo do que você for fazer, um único lugar para a manutenção da ação a ser executada.

Link para o comentário
Compartilhar em outros sites

  • 0

Denis, eu coloquei uma trigger de Before inserto na tabela de entrada esta funcionando sem problema mas a de UpDate e delete não esta funcionando.

todas estão chamando uma Procedure "Call Proc_Estoque"

CREATE DEFINER='root'@'localhost' TRIGGER `dados`.`Tg_delete` BEFORE DELETE ON `dados`.`entradaitem`
  FOR EACH ROW Call QSaldo();

Estou usando o Front-Mysql.

você tem ideia do porque não esta funcionando?

Link para o comentário
Compartilhar em outros sites

  • 0
Denis, eu coloquei uma trigger de Before inserto na tabela de entrada esta funcionando sem problema mas a de UpDate e delete não esta funcionando.

todas estão chamando uma Procedure "Call Proc_Estoque"

CREATE DEFINER='root'@'localhost' TRIGGER `dados`.`Tg_delete` BEFORE DELETE ON `dados`.`entradaitem`
  FOR EACH ROW Call QSaldo();

Estou usando o Front-Mysql.

você tem ideia do porque não esta funcionando?

Não tem a haver com a ação que está sendo executada?

Creio que você deverá passar os valores old.<atributos> como parâmetros para que a procedure saiba o que tem que fazer, pois acho que a procedure não está mais encontrando o registro que está para ser deletado.

Link para o comentário
Compartilhar em outros sites

  • 0

Denis, quanto a Update e Delete já resolvir, mas tenho outra dúvida olha esse código abaixo:

CREATE DEFINER=`root`@`localhost` PROCEDURE `QSaldo`()
BEGIN
  UpDate Item I set I.QEntrada = (Select Sum(QEntrada) From EntradaItem E where ItemID = I.ItemID);  
  Update Item I1 Set I1.QSaida = (Select Sum(QSaida) From SaidaItem where ItemID = I1.ItemID);    
  Update Item Set QSaldo = QEntrada - Qsaida;
END;

estou pegando a a somatória da tabela entradaItem e SaidaItem, mas esta dando erro quando o Item é novo e não deu Saida então não tem valor para SaidaItem. para Tabela EntradaItem usando Before para Insert e e after para Update e Delete, você tem ideia como eu posso resolver isso?

Link para o comentário
Compartilhar em outros sites

  • 0
Denis, quanto a Update e Delete já resolvir, mas tenho outra dúvida olha esse código abaixo:

...

estou pegando a a somatória da tabela entradaItem e SaidaItem, mas esta dando erro quando o Item é novo e não deu Saida então não tem valor para SaidaItem. para Tabela EntradaItem usando Before para Insert e e after para Update e Delete, você tem ideia como eu posso resolver isso?

Neste caso, use AFTER INSERT para a trigger, porque os valores já estarão gravados e a procedure vai conseguir "enxergar" os dados.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...