delphi mysql controle de estoque

MySQL

Delphi

23/05/2015

boa noite, criei uma procedure no mysql para dar baixa no estoque e conferir se existe estoque para dar baixa queria saber como invoco isso no delphi, se alguem puder me ajudar
segue o codigo:
CREATE DEFINER = 'root'@'localhost'
PROCEDURE estoque.procedure_estoque(in prod int, qtd int, idprod int )
BEGIN
IF EXISTS (select * from prod where prod.estoque < qtd and prod.prodid = idprod ) THEN
update prod set prod.estoque = prod.estoque - qtd
where prod.prodid = idprod;
else
select 'Nova quantidade, menor que o estoque !' as Mensagem;
end if;
END

quando chamo no delphi ele baixa o estoque, porem quando a quantidade é maior ele lança o item mais nao baixa nada no estoque
Nei

Nei

Curtidas 0

Respostas

Dorivan Sousa

Dorivan Sousa

23/05/2015

F EXISTS (select * from prod where prod.estoque < qtd and prod.prodid = idprod ) THEN


voce ta verificando se existe o produto e se o estoque é maior que a quantidade que voce ta vendendo...

else
select 'Nova quantidade, menor que o estoque !' as Mensagem;
end if;

aqui voce retorna uma mensagem quando o estoque é menor, voce ta tratando essa mensgem no programa, depois de executar a procedure voce ta lendo o retorno dela para avisar o usuario que o item tem o estoque inusificente?
GOSTEI 0
Nei

Nei

23/05/2015

Bom dia dorivan, assim realmemte funcionou, vc sabe como chamar esse procedimento.no delphi?
GOSTEI 0
Dorivan Sousa

Dorivan Sousa

23/05/2015

voce ta usando que componente para acessar o banco de dados? Zeros, DBExpress, FireDac...
GOSTEI 0
Nei

Nei

23/05/2015

firedac
GOSTEI 0
Nei

Nei

23/05/2015

e ai dorivan vc pode me ajudar?
GOSTEI 0
Dorivan Sousa

Dorivan Sousa

23/05/2015

FDStoredProc
GOSTEI 0
Dorivan Sousa

Dorivan Sousa

23/05/2015

http://docwiki.embarcadero.com/RADStudio/XE6/en/Executing_Stored_Procedures_(FireDAC)

DStoredProc1.StoredProcName := 'MY_PROC';
FDStoredProc1.Prepare;
FDStoredProc1.Params[0].Value := 100;
FDStoredProc1.Params[1].Value := 'audi';
FDStoredProc1.ExecProc;
GOSTEI 0
Nei

Nei

23/05/2015

boa noite dorivan, assim realmente chama a procedure e funciona perfeitamente, mais como fazer um tratamento de exceção no fdsstoredproc1. porque ele executa se tiver valido e se nao estiver ele nao mostra nada
GOSTEI 0
Dorivan Sousa

Dorivan Sousa

23/05/2015

entao no firebird que uso com mais frequencia eu faço a procedure é executavel onde apenas executa comandos e so retorna se deu certo ou a procedure é selecionavel onde funciona como se fosse uma tabela, retornando dados.

essa sua procedure tem as duas funcoes, eu nao sei bem como funciona isso no mysql, a sua procedure nao retorna uma excecao ela retorna um campo chamado mensagem com o valor 'Nova quantidade, menor que o estoque !'... eu tentaria executar a procedure e ver os fields do fdstoredproc se o valor do campo mensagem for igual Nova quantidade, menor que o estoque !' avisaria ao usuario.
GOSTEI 0
Dorivan Sousa

Dorivan Sousa

23/05/2015

pesquisando um pouco sobre como funciona o mysql, essa mensagem
select 'Nova quantidade, menor que o estoque !' as Mensagem;

ao que me parece retorna como uma mensagem de sistema, voce pode testar isso no console do mysql com o comando CALL e voce passa os parametros de um item com a quantidade insuficiente que voce vai ver o retorno da mensagem... se for realmente isso acho que pelos fields do fdstoredproc não vai ver essa mensagem ja que nao tem o parametro de retorno... nesse link [url]http://docwiki.embarcadero.com/RADStudio/XE5/en/Executing_Commands_(FireDAC)#Getting_DBMS_Feedback[/url] mostra como ver o feedback do DB...
var
  i: Integer;
begin
  FDConnection1.ResourceOptions.ServerOutput := True;
  FDQuery1.FetchOptions.AutoClose := False;
  FDQuery1.Open('select * from Region; print ''Hello''');
  FDMemTable1.Data := FDQuery1.Data;
  Memo1.Lines.Add(Format('%d rows processed', [FDMemTable1.RecordCount]));
  FDQuery1.NextRecordSet;
  if FDConnection1.Messages <> nil then
    for i := 0 to FDConnection1.Messages.ErrorCount - 1 do
      Memo1.Lines.Add(FDConnection1.Messages[i].Message);
end;

veja se a mensagem 'Nova quantidade, menor que o estoque !' não esteja retornando ai
GOSTEI 0
POSTAR