Duvida sobre Trigger erro ao alterar dados de uma determinada tabela,
Olá senhores e senhoras, sou iniciante em mysql e em bancos de dados em geral, obvio que estou apanhando igual escravo desobediente, mas não desisto.
A duvida é o seguinte eu tenho duas tabelas (na verdade são 5 mas o foco são duas), as seguintes:
VENDA
-----------------------
IdVenda int não nulo e auto incremento [pk].
Cliente_Venda int [ esta aqui é a fk que relaciona esta tabela na tabela cliente]
Data date
Hora time
valorTotal numeric
Funcionario_venda [ fk que relaciona esta tabela com uma tabela funcionario]
==========================================================================
ITEMVENDA
-------------------
iditemvenda [PK][NN][AI]
venda_intemvenda [FK] que relaciona esta tabela a tabela venda
produto_itemvenda [FK] que relaciona esta tabela a tabela produto
QTDE float
valorunitario numeric
valordesconto numeric
valortotal numeric
===========================================================================
Até aqui beleza, eu criei uma procedure que insere o itemvenda, calculando o valor total mediante os parametros QTDE, valorunitario e desconto. Funcionando belezinha.
Criei uma TRIGGER que atualiza o campo da tabela venda valorTotal toda vez que um item é adicionado a itemvenda, conseguem entender?
EX: adicionei o produto de id 1 a venda de id 1, sendo 10 itens de 5 reais cada sem desconto, a procedure calcula o valor final e adiciona no campo valortotal[itemvenda], neste exemplo o valor adicionado seria de : 50 reias ao valortotal da tabela venda [Esta trigger que criei ta fazendo isto belezinha, altera que só o a felicidade]:
Aqui surge o problema: tenho que criar ou alterar esta trigger [não sei se uma mesma trigger pode ser disparada simultaneamente com insert, delete, update ], para que eu atualize o valor da tabela VENDA , ValorTotal, toda vez que eu adiicionar, remover ou excluir um item da tabela ITEMVENDA, Vou necessitar de outra PROCEDURE? ou da para fazer tuno na TRIGGER?
segue o código da trigger funcional e o não funcional.
CÓDIGO FUNCIONAL atualiza o valorTotal da tabela VENDA
Segue o Código para update
A duvida é o seguinte eu tenho duas tabelas (na verdade são 5 mas o foco são duas), as seguintes:
VENDA
-----------------------
IdVenda int não nulo e auto incremento [pk].
Cliente_Venda int [ esta aqui é a fk que relaciona esta tabela na tabela cliente]
Data date
Hora time
valorTotal numeric
Funcionario_venda [ fk que relaciona esta tabela com uma tabela funcionario]
==========================================================================
ITEMVENDA
-------------------
iditemvenda [PK][NN][AI]
venda_intemvenda [FK] que relaciona esta tabela a tabela venda
produto_itemvenda [FK] que relaciona esta tabela a tabela produto
QTDE float
valorunitario numeric
valordesconto numeric
valortotal numeric
===========================================================================
Até aqui beleza, eu criei uma procedure que insere o itemvenda, calculando o valor total mediante os parametros QTDE, valorunitario e desconto. Funcionando belezinha.
Criei uma TRIGGER que atualiza o campo da tabela venda valorTotal toda vez que um item é adicionado a itemvenda, conseguem entender?
EX: adicionei o produto de id 1 a venda de id 1, sendo 10 itens de 5 reais cada sem desconto, a procedure calcula o valor final e adiciona no campo valortotal[itemvenda], neste exemplo o valor adicionado seria de : 50 reias ao valortotal da tabela venda [Esta trigger que criei ta fazendo isto belezinha, altera que só o a felicidade]:
Aqui surge o problema: tenho que criar ou alterar esta trigger [não sei se uma mesma trigger pode ser disparada simultaneamente com insert, delete, update ], para que eu atualize o valor da tabela VENDA , ValorTotal, toda vez que eu adiicionar, remover ou excluir um item da tabela ITEMVENDA, Vou necessitar de outra PROCEDURE? ou da para fazer tuno na TRIGGER?
segue o código da trigger funcional e o não funcional.
CÓDIGO FUNCIONAL atualiza o valorTotal da tabela VENDA
DELIMITER // CREATE TRIGGER atualiza_valor_venda AFTER INSERT ON itemvenda FOR EACH ROW BEGIN UPDATE venda SET valortotal=(SELECT sum(valortotal) AS valortotal FROM itemvenda where itemvenda.venda_itemvenda = venda.idvenda); END //
Segue o Código para update
DELIMITER //
CREATE TRIGGER att_valor_update AFTER UPDATE ON itemvenda
FOR EACH ROW
BEGIN
declare valorT int;
declare diferenca numeric(15,2);
if new.qtde>old.qtde then
SET diferença = (new.qtde - old.qtde);
UPDATE venda SET venda.valortotal = (SELECT venda.valortotal from venda WHERE venda.idvenda = itemvenda.venda_itemvenda + (diferenca*itemvenda.valorunitario)) WHERE venda.idvenda = itemvenda.venda_itemvenda;
else
SET diferenca = (old.qtde - new.qtde);
UPDATE venda SET venda.valortotal = (SELECT venda.valortotal from venda WHERE venda.idvenda = itemvenda.venda_itemvenda - (diferenca*itemvenda.valorunitario)) WHERE venda.idvenda = itemvenda.venda_itemvenda ;
end if;
END
//
Marciel Miranda
Curtidas 0
Respostas
William
15/09/2013
Colega postei esse artigo aqui mesmo na devmedia, acredito ajude você:
[url]https://www.devmedia.com.br/implementando-controle-de-estoque-no-mysql-com-triggers-e-procedures/26352[/url]
Obs.: Infelizmente no MySQL ainda não podemos trabalhar com múltiplos eventos (INSERT, UPDATE E DELETE) na mesma trigger, então temos que criar uma para cada evento.
Qualquer dúvida estou a disposição...
[url]https://www.devmedia.com.br/implementando-controle-de-estoque-no-mysql-com-triggers-e-procedures/26352[/url]
Obs.: Infelizmente no MySQL ainda não podemos trabalhar com múltiplos eventos (INSERT, UPDATE E DELETE) na mesma trigger, então temos que criar uma para cada evento.
Qualquer dúvida estou a disposição...
GOSTEI 0
Felippe Tadeu
15/09/2013
Colega postei esse artigo aqui mesmo na devmedia, acredito ajude você:
[url]https://www.devmedia.com.br/implementando-controle-de-estoque-no-mysql-com-triggers-e-procedures/26352[/url]
Obs.: Infelizmente no MySQL ainda não podemos trabalhar com múltiplos eventos (INSERT, UPDATE E DELETE) na mesma trigger, então temos que criar uma para cada evento.
Qualquer dúvida estou a disposição...
[url]https://www.devmedia.com.br/implementando-controle-de-estoque-no-mysql-com-triggers-e-procedures/26352[/url]
Obs.: Infelizmente no MySQL ainda não podemos trabalhar com múltiplos eventos (INSERT, UPDATE E DELETE) na mesma trigger, então temos que criar uma para cada evento.
Qualquer dúvida estou a disposição...
William, então você quer dizer que dentro de uma trigger de update, por exemplo, eu não consigo fazer um insert em outra tabela ?
GOSTEI 0
William
15/09/2013
Não, o que ocorre é que você não pode manipular múltiplos eventos da mesma tabela a qual você está ligando a trigger.
Lembrando que você cria uma trigger ligada a um determinado evento de uma determinada tabela, ou seja, uma trigger para o evento INSERT tabela Vendas outra para evento UPDATE da tabela Vendas e outra para DELETE da tabela Vendas.
blz?
Lembrando que você cria uma trigger ligada a um determinado evento de uma determinada tabela, ou seja, uma trigger para o evento INSERT tabela Vendas outra para evento UPDATE da tabela Vendas e outra para DELETE da tabela Vendas.
blz?
GOSTEI 0
Felippe Tadeu
15/09/2013
Entendi, obrigado.
Tenham um bom dia
Tenham um bom dia
GOSTEI 0