Erro ao ter saldo estoque = 0
Utilizo esse procedimento para INSERIR valores na minha tab_entradas, ou seja.. dar entrada de QUANTIDADE no estoque.
O problema é quando tenho estoque com SALDO = 0 (zero) me acontece um erro no aplicativo... caso for diferente de zero (possuir estoque) funciona normalmente.
[b:4904be51ef]ERRO: ´´ is not a valid floating point value[/b:4904be51ef]
Mesmo com o erro me grava a entrada.. só nao atualiza meu SALDO do produto.
PODEM ME AJUDAR POR FAVOR?
// PROCEDIMENTO USADO
procedure TForm_Entradas.BtnOKClick(Sender: TObject);
var
dataCad : string;
ddata : TDate;
Begin
ddata := strtodateDef(Form_Menu.SBPrincipal.Panels[2].text,0);
if ddata > 0 then
dataCad := formatdatetime(´yyyy-mm-dd´,ddata)
else
dataCad := ´null´;
/////////////////////////// INSERE NA TABELA ENTRADAS
Begin
decimalseparator:=´.´; //DEFINE O SEPARADOR COMO . FICA 33.33 E NAO 33,33
QueryEntradas.Active := False;
QueryEntradas.SQL.Clear;
QueryEntradas.Sql.Add(´insert into tab_entradas (PRODUTO, COD_PRODUTO, UN, NF, PRECO_COMPRA, QTDE, FORNECEDOR, DATA_ENTRADA, ´+
´USUARIO, VIVO) values (´+´´´´+CBProduto.text+´´´´+´,´+´´´´+EdCod.text+´´´´+´,´+´´´´+EdUN.text+´´´´+´,´+´´´´+EdNF.text+´´´´+´,´+QuotedStr(FLOATTOSTR(EdValorUnit.VALUE))+´,´+QuotedStr(FLOATTOSTR(EdQtde.VALUE))+´,´+´´´´+CBFornecedor.text+´´´´+´,´+´´´´+dataCad+´´´´+´,´+´´´´+Form_Menu.SBPrincipal.Panels[0].Text+´´´´+´,´+´´´´+´S´+´´´)´);
QueryEntradas.ExecSql; //execucao final
MessageDLG(´OK.QUANTIDADE adicionada no Estoque.´,mtinformation, [mbok],0); //mensagem de OK
decimalseparator:=´,´;
End;
///////////////////VERIFICA SALDO ANTIGO DO PRODUTO
with QueryProdutos do
Begin
QueryProdutos.Close;
QueryProdutos.Sql.Clear;
QueryProdutos.Sql.text := ´select COD,PRODUTO,SALDO from tab_produtos where COD = ´+QuotedStr(EdCod.text)+´´;
QueryProdutos.Active := true;
End;
EDSaldoEstoqueAntigo.Text:=queryProdutos.FieldByname(´SALDO´).Asstring;
EdSAldoEstoqueNovo.Text:=floattostr(strtofloat(EDSAldoEstoqueAntigo.text)+ strtofloat(EDQtde.text));
with QueryProdutos do
Begin
decimalseparator:=´.´; //DEFINE O SEPARADOR COMO . FICA 33.33 E NAO 33,33
Close;
Sql.Clear;
Sql.text:= ´update tab_produtos Set SALDO = ´+QuotedStr(FLOATTOSTR(EdSAldoEstoqueNovo.VALUE))+´ where COD=´´´+edcod.text+´´´´;
ExecSql;
End;
decimalseparator:=´,´; //volta o separador para ,
//End
BtnCadastrar.Enabled := true;
BtnCancelar.Enabled := false;
CBFornecedor.Text := ´´;
CBFornecedor.Enabled := False;
CBProduto.Text := ´´;
CBProduto.Enabled := false;
EdUn.Clear;
EdQtde.Clear;
EdQtde.Enabled := false;
EdValorUnit.Clear;
EdValorUnit.Enabled := false;
EdNf.Clear;
EdNf.Enabled := false;
BtnOK.Enabled := false;
Form_Entradas.Close;
end;
O problema é quando tenho estoque com SALDO = 0 (zero) me acontece um erro no aplicativo... caso for diferente de zero (possuir estoque) funciona normalmente.
[b:4904be51ef]ERRO: ´´ is not a valid floating point value[/b:4904be51ef]
Mesmo com o erro me grava a entrada.. só nao atualiza meu SALDO do produto.
PODEM ME AJUDAR POR FAVOR?
// PROCEDIMENTO USADO
procedure TForm_Entradas.BtnOKClick(Sender: TObject);
var
dataCad : string;
ddata : TDate;
Begin
ddata := strtodateDef(Form_Menu.SBPrincipal.Panels[2].text,0);
if ddata > 0 then
dataCad := formatdatetime(´yyyy-mm-dd´,ddata)
else
dataCad := ´null´;
/////////////////////////// INSERE NA TABELA ENTRADAS
Begin
decimalseparator:=´.´; //DEFINE O SEPARADOR COMO . FICA 33.33 E NAO 33,33
QueryEntradas.Active := False;
QueryEntradas.SQL.Clear;
QueryEntradas.Sql.Add(´insert into tab_entradas (PRODUTO, COD_PRODUTO, UN, NF, PRECO_COMPRA, QTDE, FORNECEDOR, DATA_ENTRADA, ´+
´USUARIO, VIVO) values (´+´´´´+CBProduto.text+´´´´+´,´+´´´´+EdCod.text+´´´´+´,´+´´´´+EdUN.text+´´´´+´,´+´´´´+EdNF.text+´´´´+´,´+QuotedStr(FLOATTOSTR(EdValorUnit.VALUE))+´,´+QuotedStr(FLOATTOSTR(EdQtde.VALUE))+´,´+´´´´+CBFornecedor.text+´´´´+´,´+´´´´+dataCad+´´´´+´,´+´´´´+Form_Menu.SBPrincipal.Panels[0].Text+´´´´+´,´+´´´´+´S´+´´´)´);
QueryEntradas.ExecSql; //execucao final
MessageDLG(´OK.QUANTIDADE adicionada no Estoque.´,mtinformation, [mbok],0); //mensagem de OK
decimalseparator:=´,´;
End;
///////////////////VERIFICA SALDO ANTIGO DO PRODUTO
with QueryProdutos do
Begin
QueryProdutos.Close;
QueryProdutos.Sql.Clear;
QueryProdutos.Sql.text := ´select COD,PRODUTO,SALDO from tab_produtos where COD = ´+QuotedStr(EdCod.text)+´´;
QueryProdutos.Active := true;
End;
EDSaldoEstoqueAntigo.Text:=queryProdutos.FieldByname(´SALDO´).Asstring;
EdSAldoEstoqueNovo.Text:=floattostr(strtofloat(EDSAldoEstoqueAntigo.text)+ strtofloat(EDQtde.text));
with QueryProdutos do
Begin
decimalseparator:=´.´; //DEFINE O SEPARADOR COMO . FICA 33.33 E NAO 33,33
Close;
Sql.Clear;
Sql.text:= ´update tab_produtos Set SALDO = ´+QuotedStr(FLOATTOSTR(EdSAldoEstoqueNovo.VALUE))+´ where COD=´´´+edcod.text+´´´´;
ExecSql;
End;
decimalseparator:=´,´; //volta o separador para ,
//End
BtnCadastrar.Enabled := true;
BtnCancelar.Enabled := false;
CBFornecedor.Text := ´´;
CBFornecedor.Enabled := False;
CBProduto.Text := ´´;
CBProduto.Enabled := false;
EdUn.Clear;
EdQtde.Clear;
EdQtde.Enabled := false;
EdValorUnit.Clear;
EdValorUnit.Enabled := false;
EdNf.Clear;
EdNf.Enabled := false;
BtnOK.Enabled := false;
Form_Entradas.Close;
end;
Ce
Curtidas 0
Respostas
Rjun
10/04/2006
Você está passando [b:f67e88d422]Zero[/b:f67e88d422] ou [b:f67e88d422]vazio[/b:f67e88d422] quando o estoque for ZERO?
GOSTEI 0
Tolimpio
10/04/2006
Voce provavelmente esta pegando alguma ´string vazia´.... de algum edit... etc
e convertendo para float.......
faca um breakpoint nas linha que da o erro...... e verifique o valor a ser convertido........
e convertendo para float.......
faca um breakpoint nas linha que da o erro...... e verifique o valor a ser convertido........
GOSTEI 0
Ce
10/04/2006
Você está passando [b:40832cad53]Zero[/b:40832cad53] ou [b:40832cad53]vazio[/b:40832cad53] quando o estoque for ZERO?
Estou passando ZERO (pelo menos estou pretendendo) :?
GOSTEI 0
Edilcimar
10/04/2006
Se passar vazio vai dar erro, se passar 0 não dá, portanto vc tem que ter certeza que o local onde vc está buscando os dados não está ´´, caso esteja durante a conversão vai dar erro, portanto tente fazer a coisa dentro de um try
GOSTEI 0
Ce
10/04/2006
Se passar vazio vai dar erro, se passar 0 não dá, portanto vc tem que ter certeza que o local onde vc está buscando os dados não está ´´, caso esteja durante a conversão vai dar erro, portanto tente fazer a coisa dentro de um try
mas aonde q faço isso?? poderia me dar o exemplo :(
GOSTEI 0
Gameiro
10/04/2006
Eu uso essa função para verificar se o valor é válido se não for eu passo como zero:
na sua instrução sql em vez de passar o QuotedStr(FLOATTOSTR(EdQtde.VALUE)), tente passar direto a variavel que recebeu o valor convertido.
Obs.: É mais fácil de entender o código se vc usar parametros na instrução SQL.
Até mais. :)
function Tcaixa.validafloat(valor : string):boolean; begin //função que verifica se foi digitado um valor q não pode ser convertido try StrTofloat(valor); result := true; except on EConvertError do result := false; end; end; NO ONEXIT DO EDIT OU NA HORA DE FAZER O INSERT USE A FUNÇÃO if validafloat(currencyedit2.Text) then begin valor:=strtofloat(currencyedit2.Text); end else begin valor:=0.00; end;
na sua instrução sql em vez de passar o QuotedStr(FLOATTOSTR(EdQtde.VALUE)), tente passar direto a variavel que recebeu o valor convertido.
Obs.: É mais fácil de entender o código se vc usar parametros na instrução SQL.
Até mais. :)
GOSTEI 0