estoque mysql
fiz essa trigger para dar baixa no estoque, segue o codigo:
DELIMITER //
CREATE
DEFINER = 'root'@'localhost'
TRIGGER teste.tr_ddddd
AFTER insert
ON teste.item
FOR EACH ROW
BEGIN
update prod set prod.estoque = prod.estoque - new.qtd
where prod.prodid = new.idprod;
end //
DELIMITER;
queria saber como faço uma verificação se a new.qtd vendida é maior que a do prod.estoque, se fosse dar uma mensagem. alguem pode me ajudar?
DELIMITER //
CREATE
DEFINER = 'root'@'localhost'
TRIGGER teste.tr_ddddd
AFTER insert
ON teste.item
FOR EACH ROW
BEGIN
update prod set prod.estoque = prod.estoque - new.qtd
where prod.prodid = new.idprod;
end //
DELIMITER;
queria saber como faço uma verificação se a new.qtd vendida é maior que a do prod.estoque, se fosse dar uma mensagem. alguem pode me ajudar?
Nei
Curtidas 0
Melhor post
Marcos P
21/05/2015
Não faz sentido você chamar uma procedure de dentro de uma trigger, considerando que a procedure gera output e o MySql não suporta esse tipo de construção...
Aliás, esse foi exatamente o erro que você obteve : not allowed to return a result set from trigger
Trigger não se aplica a esse tipo básico de comando ( um update, no seu caso ).
Triggeres são estruturas orientadas a funções mais específicas, como geração de logs ou atualizações em cascata em múltiplas tabelas.
Na verdade, triggeres são complicadas de administrar e depurar no ambiente, pois sua principal característica é ser invisível quando você executa uma operação qualquer na tabela. Muitas vezes nem lembramos que elas existem !
Construa a procedure com a mesma lógica da trigger e execute-a direto, através do comando "Call", no console do MySql ou na sua aplicação.
Dê uma olhada na documentação do MySql :
Criando uma Stored Procedure
Executando uma Stored Procedure
Aliás, esse foi exatamente o erro que você obteve : not allowed to return a result set from trigger
Trigger não se aplica a esse tipo básico de comando ( um update, no seu caso ).
Triggeres são estruturas orientadas a funções mais específicas, como geração de logs ou atualizações em cascata em múltiplas tabelas.
Na verdade, triggeres são complicadas de administrar e depurar no ambiente, pois sua principal característica é ser invisível quando você executa uma operação qualquer na tabela. Muitas vezes nem lembramos que elas existem !
Construa a procedure com a mesma lógica da trigger e execute-a direto, através do comando "Call", no console do MySql ou na sua aplicação.
Dê uma olhada na documentação do MySql :
Criando uma Stored Procedure
Executando uma Stored Procedure
GOSTEI 1
Mais Respostas
Marcos P
21/05/2015
Mensagem e trigger são duas coisas que não combinam, por que o conceito de trigger é orientado a execução de comandos sem nenhum tipo de interação com o usuário / aplicação.
Inclusive, muitos gerenciadores de banco retornam erro quando você tenta gerar qualquer tipo de "output" dentro de uma trigger.
Se isso fosse uma procedure, o que você poderia fazer é usar o comando [url:descricao=IF (MySql)]https://dev.mysql.com/doc/refman/5.0/en/if.html[/url], implementando um tratamento condicional no seu código.
Algo como :
Dê uma estudada nesses comandos e evolua sua lógica a partir dessa ideia.
Inclusive, muitos gerenciadores de banco retornam erro quando você tenta gerar qualquer tipo de "output" dentro de uma trigger.
Se isso fosse uma procedure, o que você poderia fazer é usar o comando [url:descricao=IF (MySql)]https://dev.mysql.com/doc/refman/5.0/en/if.html[/url], implementando um tratamento condicional no seu código.
Algo como :
: IF EXISTS (select * from prod where prod.estoque <= new.qtd and prod.prodid = new.idprod ) THEN update prod set prod.estoque = prod.estoque - new.qtd where prod.prodid = new.idprod; ELSE select 'Nova quantidade, menor que o estoque !' as Mensagem; END IF;
Dê uma estudada nesses comandos e evolua sua lógica a partir dessa ideia.
GOSTEI 0
Nei
21/05/2015
bom dia marcos p, tentei criei a procedure e quando chamo ela na trigger da um erro : not allowed to return a result set from trigger
GOSTEI 0
Marcos P
21/05/2015
O MySql não suporta output em trigger. Como, provavelmente, sua procedure retorna algo... problemas !
Porque você não transforma essa trigger em uma procedure ou function ?
Porque você não transforma essa trigger em uma procedure ou function ?
GOSTEI 0
Nei
21/05/2015
marcos desculpa sou novato, como faço uma procedure depois chamo na trigger?
GOSTEI 0
Marisiana Battistella
21/05/2015
Complementando o que Marcos disse, sempre que puder evitar de utilizar trigger na aplicação, evite.
Quando se utiliza procedures e functions é mais fácil de controlar o que será executado em cada momento e, também, a performance de cada código executado.
Quando se utiliza procedures e functions é mais fácil de controlar o que será executado em cada momento e, também, a performance de cada código executado.
GOSTEI 0
Nei
21/05/2015
mais como chamar uma procedure ou uma function pelo delphi
GOSTEI 0
Marcos P
21/05/2015
Qual a versão do seu Delphi e qual componente de acesso aos dados você utiliza ?
GOSTEI 0
Nei
21/05/2015
delphi xe7 e uso o firedac
GOSTEI 0
Marisiana Battistella
21/05/2015
Você terá que utilizar um DataSet ou uma Query.. não lembro qual é..
Você irá chamar da mesma forma que você executa um SQL para retornar os dados...
Você irá chamar da mesma forma que você executa um SQL para retornar os dados...
GOSTEI 0
Marcos P
21/05/2015
https://www.devmedia.com.br/curso/curso-completo-de-delphi-com-firedac/410
https://www.devmedia.com.br/stored-procedures-e-iappserver-curso-de-multicamadas-com-delphi-e-datasnap-72/31231
http://stackoverflow.com/questions/29004499/using-firedac-to-run-sql-stored-procedure
http://docwiki.embarcadero.com/RADStudio/XE6/en/Executing_Stored_Procedures_%28FireDAC%29
https://www.devmedia.com.br/stored-procedures-e-iappserver-curso-de-multicamadas-com-delphi-e-datasnap-72/31231
http://stackoverflow.com/questions/29004499/using-firedac-to-run-sql-stored-procedure
http://docwiki.embarcadero.com/RADStudio/XE6/en/Executing_Stored_Procedures_%28FireDAC%29
GOSTEI 1
Marisiana Battistella
21/05/2015
Nei Junior, depois informe se conseguiu fazer, ou se continua com dúvida...
GOSTEI 0
Maycon
21/05/2015
Nei Junior Dias Queiroz
quantas tabelas você tem ?
você tem que ter 4 tabelas ok?
Estoque, Produtos, Entrada e Saida de Produtos certo
Você terá que ter 6 Trigger e uma Procedure
Upei no site o código que eu uso da uma olhada da pra fazer o controle de estoque completo e simples :D
Motivo de upar lá é porque aqui o forum é sensivel a caracteres _
http://www.4shared.com/file/EGyEw4vXba/CONTROLE_DE_ESTOQUE_COM_TRIGGE.html?
quantas tabelas você tem ?
você tem que ter 4 tabelas ok?
Estoque, Produtos, Entrada e Saida de Produtos certo
Você terá que ter 6 Trigger e uma Procedure
Upei no site o código que eu uso da uma olhada da pra fazer o controle de estoque completo e simples :D
Motivo de upar lá é porque aqui o forum é sensivel a caracteres _
http://www.4shared.com/file/EGyEw4vXba/CONTROLE_DE_ESTOQUE_COM_TRIGGE.html?
GOSTEI 0
Maycon
21/05/2015
Se resolver avisa
GOSTEI 0
Nei
21/05/2015
A ptocedure funciona certinho, quando vou insert deletar etc, a questão é chamar ela pelo delphi quando for insrrir novo item, entendeu?
GOSTEI 0
Maycon
21/05/2015
Coloque no seu Programa em Delphi forms de Entrada,Saida,Cadastro de Produto ok
Você primeiro Cadastra um Produto depois você faz a entrada e a saida a procedure não precisa sem imprementada no programa, mais sim no BD a unica coisa que tem a fazer é setar as suas tabelas no programa.
FORMS
[img]http://arquivo.devmedia.com.br/forum/imagem/431723-20150531-190330.jpg[/img]
Tente fazer isso.
Você primeiro Cadastra um Produto depois você faz a entrada e a saida a procedure não precisa sem imprementada no programa, mais sim no BD a unica coisa que tem a fazer é setar as suas tabelas no programa.
FORMS
[img]http://arquivo.devmedia.com.br/forum/imagem/431723-20150531-190330.jpg[/img]
Tente fazer isso.
GOSTEI 0