Fórum Busca em banco de dados firebird 2.5 #547893

07/03/2016

0

Boa noite a todos.

Estou tentando fazer uma busca em um banco de dados, porem não esta dando certo. Quando eu utilizo o banco de dados access este código funciona perfeitamente:

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from tabela1 where kc= ' + QuotedStr(FloatToStr(kc)));
ADOQuery1.Open;

bx := SQLQuery1.fieldByName('bx').AsFloat;

ks := SQLQuery1.fieldbyname('Ks').AsFloat;


Porém agora eu quero utilizar o banco de dados firebird 2.5, o banco esta conectado com um SQLConection, SQLTable e SQLQuery, quando eu realizo a busca no banco de dados me retorna um erro de "Is not a valid floatpoint point value." O código utilizado e o seguinte:

SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('select * from tabela1 where kc= ' + QuotedStr(FloatToStr(kc)));
SQLQuery1.Open;

bx := SQLQuery1.fieldByName('bx').AsFloat;

ks := SQLQuery1.fieldbyname('Ks').AsFloat;


Alguém pode me dar uma dica de como resolver isto?
Emanuel

Emanuel

Responder

Post mais votado

08/03/2016

Emanuel, bom dia.

Qdo se faz floatToStr a formatação não fica válida para executar SQL. O que eu quero dizer com isso...

Qdo tenho o valor float 10.00, ao utilizar o floatToStr( 10.00 ) ficará 10.
Qdo tenho o valor float 10.18, ao utilizar o floatToStr( 10.00 ) ficará 10,18.
Esse valor de 10,18 não é valido para o SGDB do firebird.

Uma forma simples de se entender seria:

var x1 : string;

x1 := FloatToStr( kc );
x1 := StringReplace( x1 , ',' , '.' , [ rfReplaceAll , rfIgnoreCase ] );


SQLQuery1.Close;
SQLQuery1.Filtered := false; // <---- procure manter o padrão de retirar os filtros
SQLQuery1.Filter := ''; // <---- procure manter o padrão de retirar os filtros. é bom utilizar tb
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('select * from tabela1 where kc= ' + x1 );
SQLQuery1.Open;

Abc.

Gilberto Moura

Gilberto Moura
Responder

Gostei + 2

Mais Posts

08/03/2016

Mateus Ribeiro

Bom dia!

Troque esse: QuotedStr(FloatToStr(kc))
Por isso: FloatToStr(kc)

Veja se resolve
Responder

Gostei + 0

08/03/2016

Rafael Bosco

O campo KC é um Float? Faça o controle dessa variável através do código, não através da SQL, utilize o tipo de variável Currency:


procedure Select(Kc: Currency);
begin
 SQLQuery1.Close; 
 SQLQuery1.SQL.Clear;
 SQLQuery1.SQL.Add('select * from tabela1 where kc = :kc');
 SQLQuery1.ParamByName('KC').AsCurrency := KC
 SQLQuery1.Open;
 
 bx := SQLQuery1.fieldByName('bx').AsCurrency;
 
 ks := SQLQuery1.fieldbyname('Ks').AsCurrency;


Responder

Gostei + 0

08/03/2016

Emanuel

Emanuel, bom dia.

Qdo se faz floatToStr a formatação não fica válida para executar SQL. O que eu quero dizer com isso...

Qdo tenho o valor float 10.00, ao utilizar o floatToStr( 10.00 ) ficará 10.
Qdo tenho o valor float 10.18, ao utilizar o floatToStr( 10.00 ) ficará 10,18.
Esse valor de 10,18 não é valido para o SGDB do firebird.

Uma forma simples de se entender seria:

var x1 : string;

x1 := FloatToStr( kc );
x1 := StringReplace( x1 , ',' , '.' , [ rfReplaceAll , rfIgnoreCase ] );


SQLQuery1.Close;
SQLQuery1.Filtered := false; // <---- procure manter o padrão de retirar os filtros
SQLQuery1.Filter := ''; // <---- procure manter o padrão de retirar os filtros. é bom utilizar tb
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('select * from tabela1 where kc= ' + x1 );
SQLQuery1.Open;

Abc.


Vlw pela ajuda de todos, porém sempre retorna o erro "Is not a valid floatpoint point value.".

Gil sua dica ajudou a mudar o erro kkkkk, ele diz que o "operation not allowed on a unidirectional dataset" eu sei q o erro e pq os elementos da dbexpress são unidecionais, com uma pesquisa em vários tópicos sobre este erro eu vi que o certo seria fazer a conexão nesta sequencia, sqlconnection/sqlquery/datasetprovider/clientdataset/datasource para que os dados fossem retornados, porém o erro persiste.
Alguém teria alguma outra dica? ja estou quebrando cabeça com isso faz um tempo e nada.
Responder

Gostei + 0

09/03/2016

Emanuel

Sobe
Responder

Gostei + 0

09/03/2016

William

Tente parametrizado:
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('select * from tabela1 where kc= :param1');
SQLQuery1.ParamByName('param1').AsFloat := kc;
SQLQuery1.Open;
Responder

Gostei + 0

09/03/2016

Emanuel

Da o mesmo erro de "Is not a valid floatpoint point value.". To quebrando a cabeça com essa pesquisa, já tentei varias maneiras e sempre da erro.
Responder

Gostei + 0

09/03/2016

William

Que tipo de valor vem nesse campo "kc"?

Dê exemplos!
Responder

Gostei + 0

09/03/2016

Emanuel

Esse valor de kc e o resultado de uma equação matemática, conforme a img.

[img]http://arquivo.devmedia.com.br/forum/imagem/476122-20160309-132436.jpg[/img]

esse valor pode ser "1,8", "1,7", "2", "3,1". E com estes valor de Kc eu preciso buscar na tabela o valor de Ks e Bx para continuar os cálculos. Os valores de Ks e Bx podem ser: "0,029", "0,028" e "0,50", "0,48" respectivamente.
Responder

Gostei + 0

09/03/2016

Raimundo Pereira

Experimente alterar o campo da sua tabela para numeric 18,4
Responder

Gostei + 0

09/03/2016

Emanuel

Problema resolvido, podem fechar o tópico.
Responder

Gostei + 0

09/03/2016

Marco Antônio

Boa tarde Emanuel. Qual foi a solução encontrada?
A sugerida pelo P2? Caso não gostaríamos que fosse compartilhado uma vez que o fórum é sempre consultado por outros interessados.

Abc.
Responder

Gostei + 0

14/03/2016

Emanuel

Sim, deu certo utilizando o código original e transformando a tabela em numeric.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar