estoque mysql

MySQL

21/05/2015

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?
Nei

Nei

Curtidas 0

Melhor post

Marcos P

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
GOSTEI 1

Mais Respostas

Marcos P

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 :

:
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

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

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 ?
GOSTEI 0
Nei

Nei

21/05/2015

marcos desculpa sou novato, como faço uma procedure depois chamo na trigger?
GOSTEI 0
Marisiana Battistella

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.
GOSTEI 0
Nei

Nei

21/05/2015

mais como chamar uma procedure ou uma function pelo delphi
GOSTEI 0
Marcos P

Marcos P

21/05/2015

Qual a versão do seu Delphi e qual componente de acesso aos dados você utiliza ?
GOSTEI 0
Nei

Nei

21/05/2015

delphi xe7 e uso o firedac
GOSTEI 0
Marisiana Battistella

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...
GOSTEI 0
Marcos P

Marcos P

21/05/2015

GOSTEI 0
Marisiana Battistella

Marisiana Battistella

21/05/2015

Nei Junior, depois informe se conseguiu fazer, ou se continua com dúvida...
GOSTEI 0
Maycon

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?
GOSTEI 0
Maycon

Maycon

21/05/2015

Se resolver avisa
GOSTEI 0
Nei

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

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.
GOSTEI 0
POSTAR