erro; is not a valid floating
Tenho uma tabela em stringgrid que puxa produtos em outro formulario (em uma dbgrid), ao fazer isso ele me traz o produto, unidade, valor unitario, qtd(editavel) e valor total(qtd * valor unitario). Se o valor total ficar ate 999,99 ele nao da erro, porem se passar para casa dos 1.000,00 ele mostra a seguinte mensagem de erro:
Project OC.exe raised exception class EConvertError with message "6.299,37' is not a valid floating point value'.
Daniel
Curtidas 0
Respostas
Marco Salles
04/08/2010
Tenho uma tabela em stringgrid que puxa produtos em outro formulario (em uma dbgrid), ao fazer isso ele me traz o produto, unidade, valor unitario, qtd(editavel) e valor total(qtd * valor unitario). Se o valor total ficar ate 999,99 ele nao da erro, porem se passar para casa dos 1.000,00 ele mostra a seguinte mensagem de erro:
Project OC.exe raised exception class EConvertError with message "6.299,37' is not a valid floating point value'.
Vc deve estar fazendo alguma Conversão
Não faça a conversão , utilize a Propriedade AsString Do TField
Por exemplo
var
Str:String; // representa a coluna do seu StringGrid
begin
Str:=SeuDataSet.FieldByName('SeuCampoPreco').AsString;
ps) se quiser formatar esta String utilize as diversas opçoes de Format
GOSTEI 0
Eriley Barbosa
04/08/2010
Remova o ponto antes de passar para a célula do stringgrid:CelulaDoStringGrid := AnsiReplaceStr(SeuDataSet.FieldByName('SeuCampoPreco').AsString, '.', '');
Esa função retorna o conteúdo do primeiro parametro substituindo tudo que for igual ao segundo parametro, pelo último parametro...
Espero ter ajudado...
PS: Declare StrUtils.
Esa função retorna o conteúdo do primeiro parametro substituindo tudo que for igual ao segundo parametro, pelo último parametro...
Espero ter ajudado...
PS: Declare StrUtils.
GOSTEI 0
Marco Salles
04/08/2010
Remova o ponto antes de passar para a célula do stringgrid:CelulaDoStringGrid := AnsiReplaceStr(SeuDataSet.FieldByName('SeuCampoPreco').AsString, '.', '');
Esa função retorna o conteúdo do primeiro parametro substituindo tudo que for igual ao segundo parametro, pelo último parametro...
Espero ter ajudado...
PS: Declare StrUtils.
..
hummmmmmmmmm...
precisa disso não , com ponto ou sem ponto utilizando o SeuDataSet.FieldByName('SeuCampoPreco').AsString
o Resultado sera é String e não tera tipos inválidos
e tb decorre o fato que se o campo da tabela for currency ao fazer
Showmessage(SeuDataSet.FieldByName('SeuCampoPreco').AsString) por se so não tera nenhum ponto
na casa do milhar , portanto não justificaria o StringReplace
Esa função retorna o conteúdo do primeiro parametro substituindo tudo que for igual ao segundo parametro, pelo último parametro...
Espero ter ajudado...
PS: Declare StrUtils.
GOSTEI 0
Daniel
04/08/2010
Tenho uma tabela em stringgrid que puxa produtos em outro formulario (em uma dbgrid), ao fazer isso ele me traz o produto, unidade, valor unitario, qtd(editavel) e valor total(qtd * valor unitario). Se o valor total ficar ate 999,99 ele nao da erro, porem se passar para casa dos 1.000,00 ele mostra a seguinte mensagem de erro:
Project OC.exe raised exception class EConvertError with message "6.299,37' is not a valid floating point value'.
Vc deve estar fazendo alguma Conversão
Não faça a conversão , utilize a Propriedade AsString Do TField
Por exemplo
var
Str:String; // representa a coluna do seu StringGrid
begin
Str:=SeuDataSet.FieldByName('SeuCampoPreco').AsString;
ps) se quiser formatar esta String utilize as diversas opçoes de Formatprocedure TForm_Cadastro_Pedidos.StringGridProdutoClick(Sender: TObject);
var
result, linha1 : integer;
valor : real;
begin
Linha1 := StringGridProduto.Row;//Variavel linha se aplica a todas as linhas do componente string grid
if (StringGridProduto.Col=0)and(StringGridProduto.Row>0)and(StringGridProduto.Cells[StringGridProduto.Col,StringGridProduto.Row-1]<>'')
//se a 1° linha for selecionada, com excessão dos titulos e a linha anterior não esteja vazia então
then
begin
result:=Form_visualiza_produtos.showmodal;//abrir o formulario de visualização dos produtos
if (result = mrok)//e o botao ok for selecionado então
then
begin
StringGridProduto.Cells[StringGridProduto.Col,StringGridProduto.Row] := DataModule_Dados.TblProdutos.FieldByName('PRODUTO').AsString;
//o valor do campo nome da dbgridprodutos e copiado para a stringgrid
StringGridproduto.Cells[1,StringGridProduto.RowCount -5] := DataModule_dados.TblProdutos.FieldByName('UNIDADE').AsString;//A 2° coluna representa os dados do campo unidade da tabela produtos
StringGridproduto.Cells[2,StringGridProduto.RowCount -5] := DataModule_dados.TblProdutos.FieldByName('VALORUNITARIO').AsString;//A 3° coluna representa os dados do campo valor unitario da tabela produtos
valor := StrtoFloat(StringGridproduto.Cells[2,StringGridProduto.RowCount -5]);//A variavel valor recebe dados da 3° coluna da string grid
StringGridProduto.Cells[2,StringGridProduto.RowCount -5] := FormatFloat('##,###,##0.00', valor);//A variavel valor é mostrada no formato monetario
StringGridProduto.RowCount:= StringGridProduto.RowCount + 1;//a linha da stringgrid é aumentada em mais uma
StringGridProduto.Col := 3;//3° coluna da string grid
StringGridProduto.Row := Linha1;//Aplicação da variavel a 3° coluna
Setfocus;//Seleção
end;
end;
end;
procedure TForm_Cadastro_Pedidos.StringGridProdutoKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
var
i,indice:integer;//Variaveis inteiras
begin
if ORD (Key)=4103 then//Se a tecla delete for precionada então
begin
indice:= StringGridProduto.Row;//Armazena na variavel a linha a ser excluida
for I := indice to StringGridProduto.RowCount -1 do
begin
StringGridProduto.Cells[0,i]:= StringGridProduto.Cells[0,i+1];//Linhas abaixo da linha excluida é copiada para a linha de cima da 1° coluna
StringGridProduto.Cells[1,i]:= StringGridProduto.Cells[0,i+1];//Linhas abaixo da linha excluida é copiada para a linha de cima da 2° coluna
StringGridProduto.Cells[2,i]:= StringGridProduto.Cells[0,i+1];//Linhas abaixo da linha excluida é copiada para a linha de cima da 3° coluna
StringGridProduto.Cells[3,i]:= StringGridProduto.Cells[0,i+1];//Linhas abaixo da linha excluida é copiada para a linha de cima da 4° coluna
StringGridProduto.Cells[4,i]:= StringGridProduto.Cells[0,i+1];//Linhas abaixo da linha excluida é copiada para a linha de cima da 5° coluna
end;
StringGridProduto.RowCount := StringGridProduto.RowCount-1;//O numero de linhas é aumentado em uma unidade
end;
end;GOSTEI 0
Marco Salles
04/08/2010
ta fazendo conversão sim ..
se o erro de conversão tiver aqui
valor := StrtoFloat(StringGridproduto.Cells[2,StringGridProduto.RowCount -5]);
é so trocar por :
valor := DataModule_dados.TblProdutos.FieldByName('VALORUNITARIO').AsFloat;
GOSTEI 0
Daniel
04/08/2010
ta fazendo conversão sim ..
Fiz a alteração e continuo dando o mesmo erro.
se o erro de conversão tiver aqui
valor := StrtoFloat(StringGridproduto.Cells[2,StringGridProduto.RowCount -5]);
é so trocar por :
valor := DataModule_dados.TblProdutos.FieldByName('VALORUNITARIO').AsFloat;
GOSTEI 0
Marco Salles
04/08/2010
qual é a linha que esta dando o erro
GOSTEI 0
Daniel
04/08/2010
qual é a linha que esta dando o erro
O erro que da é qdo ultrapassa a 3 casa dos numeral, se ficar ate 999,99 ele garva normal se colocar assima desse valor ele da que nao é um valor valido 'is not a valid floating point value'
GOSTEI 0
Marco Salles
04/08/2010
é o seguinte Daniel .. Como ja comentei em outro tópico. Este campo VALORUNITARIO deve estar definido como String na sua base de dados .. e ainda deve conter o ponto na casa do milhar
Então claro que ao vc fazer a CONVERSÃO
valor := StrtoFloat(StringGridproduto.Cells[2,StringGridProduto.RowCount -5]);
ele ira reclamar ... O que tem que ser feito é retirar o ponto desta String StringGridproduto.Cells[2,StringGridProduto.RowCount -5]) Tudo indica que é isto... Pq que não foi matado o problema com mais rapidez ??? pq em uma situação normal , o campo para este caso não é do tipo String Bem , feito isto estamos atacando o efeito ... Mas não é muito compreensivel um campo que representa valores ser definido como String ( Causa )
ele ira reclamar ... O que tem que ser feito é retirar o ponto desta String StringGridproduto.Cells[2,StringGridProduto.RowCount -5]) Tudo indica que é isto... Pq que não foi matado o problema com mais rapidez ??? pq em uma situação normal , o campo para este caso não é do tipo String Bem , feito isto estamos atacando o efeito ... Mas não é muito compreensivel um campo que representa valores ser definido como String ( Causa )
GOSTEI 0