Campo Float Firebird

Delphi

08/01/2008

boa tarde,


Estou com problemas com campo Float no Firebird 1.5. Quando tento gravar o número ´282236,93´ ele grava como 282236,938. Ai complica tudo, porque faço o arredondamento quando vou buscar esse valor no banco e ele passa a ficar como se fosse 282236,94 na minha aplicação. Não posso mudar esse campo para Numeric nesse projeto.

Alguem pode me ajudar a resolver esse dilema?


Danilodcf

Danilodcf

Curtidas 0

Respostas

Sirologic

Sirologic

08/01/2008

Rapaz, a coisa complicou. Já q vc ñ pode alterar seu projeto, sujiro uma solução um pouco ortodoxa. Crie um segundo campo do tipo numéric e replique o valor desse campo, e comesse trabalhando somente com o novo campo. No futuro aconcelho a criar uma nova tabela transferindo todos os dados para ela.

abraços
Sidnei Roberto
Jampa/PB 8)


GOSTEI 0
Danilodcf

Danilodcf

08/01/2008

Obrigado pela dica Sidnei, mas preciso resolver isso com o próprio campo Float, será que tem alguma solução para isso?


GOSTEI 0
Onjahyr

Onjahyr

08/01/2008

Primeiro, ao criar sua tabela, creio que esteja colocando no último parâmetro ´,10,0´ o certo seria ´,10,2´. Já no caso das três casas no programa com Float, use FormatFloat e você resolverá a questão pois o [b:382afb2a1b]FormatFloat[/b:382afb2a1b] formata segundo como você desejar... Veja um exemplo no Help do Delphi que exlica sobre o [b:382afb2a1b]FormatFloat[/b:382afb2a1b].


GOSTEI 0
Danilodcf

Danilodcf

08/01/2008

O problema está no campo Float no próprio Firebird. Faça um teste, crie uma tabela com um campo Float e insira o número 282236,93 (estou usando o IbExpert para fazer essa operacao) e ao comitar ele vai atribuir o valor 282236,938 no campo (na verdade ele atrubui 282236,9375).


GOSTEI 0
Onjahyr

Onjahyr

08/01/2008

Amigo, veja bem. Qual o problema no Firebird? você vai usar ele fora do seu programa? Se não vai, então para que todo esse alarme :lol:

Veja bem, o que vc tem que se preocupar é no seu programa!
No seu programa, use a propriedade Display Format e informar nela:

[b:33e0474f87]#,0.00[/b:33e0474f87]

Então, sempre que o componente for pegar os dados no seu banco, só vai trazer com duas casas decimais apenas, o restante será ignorado, entendeu? Já no Firebird, se tiver 200 casas decimais, do que importa? Importaria se você fosse trabalhar com finanças como posto de gasolina que quer saber o valor real do combustível que seria (um exemplo) de R$ 1,3408 ou se você utilizar o Firebird como no Access, mas no seu caso você vai usar dentro da sua aplicação.

Blz?


GOSTEI 0
Onjahyr

Onjahyr

08/01/2008

Amigo, veja bem. Qual o problema no Firebird? você vai usar ele fora do seu programa? Se não vai, então para que todo esse alarme :lol: Veja bem, o que vc tem que se preocupar é no seu programa! No seu programa, use a propriedade Display Format e informar nela: [b:36387a8d80]#,0.00[/b:36387a8d80] Então, sempre que o componente for pegar os dados no seu banco, só vai trazer com duas casas decimais apenas, o restante será ignorado, entendeu? Já no Firebird, se tiver 200 casas decimais, do que importa? Importaria se você fosse trabalhar com finanças como posto de gasolina que quer saber o valor real do combustível que seria (um exemplo) de R$ 1,3408 ou se você utilizar o Firebird como no Access, mas no seu caso você vai usar dentro da sua aplicação. Blz?



Andei pesquisando na internet e encontrei essa função: Vê se funciona aí, mas avisa se funcionou ou não:

Use
FloatToStrF(Numero, Formato, precisão, decimais)
onde:
Numero: O numero que deseja converter
Formato: Formato a ser usado. Use ffNumber (para outros formatos, leia o help da
funcao)
precisão: A precisão decimal que deve ser levado em consideração. Eu uso
normalmente 15
decimais: número de casas decimais que desejo converter. Aqui vc pode
especificar 3, 4, 5, ou quantas for necessário.

Para maiores informações, leia o help da função FloatToStrF


GOSTEI 0
Danilodcf

Danilodcf

08/01/2008

Amigo, acho que voce não entendeu o problema.
Imagine uma situação: Voce tem uma tabela de lancamentos Financeiro, voce faz um derteminado lancamento com o valor de 282236,93, ate ai tranquilo. voce vai trazer esse registro para sua aplicacao e ele te traz 282236,94, sua aplicação já está errada, Ok?
Já tentei usar FormatFloat(´,0.00´, Field), ja formatei de direto no ClientDataSet e nao deu certo. O Firebird sempre grava os valores Float com valores aproximados, tipo 358,30 = 358,2999999, e sempre traz o valor correto para aplicacao (358,30). Essa tabela ja tem mais de 80.000 registros e somente apresenta esse erro quando gravo esse valor especifico 282236,93. Tente criar uma tabela com o campo float e coloque esse valor e puxe pelo delhi que voce vai entender qual é o meu problema.


GOSTEI 0
Danilodcf

Danilodcf

08/01/2008

alem disso se eu tentar fazer Select somando os valores dessa tabela, a soma vai vim com 0,01 a mais por conta desse problema.


GOSTEI 0
Onjahyr

Onjahyr

08/01/2008

Pesquisando na internet (no site DBFreeMagazine), eu encontrei isso aqui numa pergunta igualzinha a sua:

----------------------------------------------------------------
Para gravar com duas casas decimais voce pode mudar o tipo do campo de ´float´ para ´numeric´ ex: ´numeric(15,2)´ este tipo define q quantidade de casas decimais.

mas se deseja somente visualizar com duas casas decimais, utilize na hora do select a funcao ´cast´ do firebird.

ex:
select cast(campofloat as numeric(15,2))
from tabela

espero ter ajudado...
----------------------------------------------------------------

Também espero ter te ajudado!
Blz.


GOSTEI 0
POSTAR