erro; is not a valid floating

Delphi

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'.
Daniel

Daniel

Curtidas 0

Respostas

Marco Salles

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

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.
GOSTEI 0
Marco Salles

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
GOSTEI 0
Daniel

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 Format
Cara nao to fazendo nenhuma conversao tenho em algumas linha a formatfloat (nao sei se pode ser mas de qualquer dorma ve se tem como vc olhar o meu codigo:  
procedure 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

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

Daniel

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;

Fiz a alteração e continuo dando o mesmo erro.
GOSTEI 0
Marco Salles

Marco Salles

04/08/2010

qual é a linha que esta dando o erro
GOSTEI 0
Daniel

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

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