Fórum Sobre Passagem de Parâmetros #50689

27/04/2005

0

pessoal tenho um Campo [b:dad1273541]Decimal(9,6)[/b:dad1273541], e quanto passo um valor para ele com precizão de seis casas decimais ele zera as últimas duas... ex.:
ClntDtStTesteCampoDecimal.Value := 0.152515
e salvo no Banco, mas ele só salva [b:dad1273541]0.152500[/b:dad1273541]...


Bruno Belchior

Bruno Belchior

Responder

Posts

27/04/2005

Vinicius2k

Colega,

Evite utilizar ´.Value´ para atribuir valores aos TFields. Sempre que possível, especifique o tipo de dado que o TField irá receber para evitar problemas de conversão.

Por exemplo, seu TField *provavelmente* é do tipo TFMTBCDField para que vc tenha a escala necessária, mas ao passar o valor para a propriedade Value é o mesmo que atribuir como ´AsBCD´ e como o TBcd só armazena 4 digitos decimais vc tem a truncagem do número.

Utilize AsFloat que seu problema deve ser solucionado:
CDS.FieldByName("TesteCampoDecimal").AsFloat := 0.152515


Espero ter ajudado.
T+


Responder

Gostei + 0

27/04/2005

Bruno Belchior

Utilize AsFloat que seu problema deve ser solucionado:
caro Vinicius eu já fiz esse teste, porém, mesmo assim o campo foi [b:903f3a1772]arredondado[/b:903f3a1772] para apenas quatro casas decimais...


Responder

Gostei + 0

27/04/2005

Vinicius2k

Colega,

Qual o tipo do TField no CDS ?

T+


Responder

Gostei + 0

27/04/2005

Bruno Belchior

[b:984c7a8fd4]TFMTBCDField[/b:984c7a8fd4]...


Responder

Gostei + 0

27/04/2005

Vinicius2k

Colega,

Apesar de estar bem explícito eu não percebi que vc falava de colunas do tipo Decimal. Considerei como se fosse Numeric.
Bem, eu não utilizo o tipo Decimal. Por convenção adotei o tipo Numeric e nunca tive problemas parecidos com o seu.

Apesar de, ao menos em teoria, não haver nenhuma diferença entre Decimal e Numeric, posso desconhecer alguma particularidade que está ocorrendo...

Vc já tentou utilizar o tipo Numeric? Penso que *talvez* o tipo mais indicado para o seu caso seja o Double Precision, caso o numeric não resolva o problema.

Há também que se considerar algum problema apenas na aplicação, por exemplo, vc já tentou inserir o valor desejado diretamente no BD via SQL ou através de um Front End? Se sim, e funciona adequadamente, não se preocupe com o tipo de dado no BD que estará corretamente definido. Neste caso, o problema seria de conversão/arredondamento/truncagem dentro da aplicação.

T+


Responder

Gostei + 0

27/04/2005

Bruno Belchior

Vinícios, tentei inserir o valor via DBEdit e funcionou perfeitamente, quanto diretamene via SQL não tentei, mas acredito que funionaria...

Tentei utilizar o tipo Double, mas se por exemplo eu inserisse 0,151515 ele me adicionaria n casas após isso que eu não sei de onde vieram tipo 0.15151502351142..., logo achei inviável, o tipo Numéric não tentei...


Responder

Gostei + 0

27/04/2005

Bruno Belchior

Vinícius, tentei tanto, Float, Double Precizion, Decimal, Numeric e todos arredondam para quatro casas decimais, já estou sem idéias...


Responder

Gostei + 0

27/04/2005

Vinicius2k

Colega,

Fiz vários testes aqui e pude concluir que:

1. Não é um problema relacionado ao tipo de dado no FB. Pode descartar esta possibilidade e utilizar o que for melhor para o seu caso, que creio ser o DoublePrecision.

2. O problema me parece ser na implementação do TFMTBCDField dentro do Delphi já que se vc utilizar um TDBEdit ou TDBGrid para entrar com os dados vc não tem o problema. Ele está limitado à atribuição do valor dentro do código ou através de uma variável Double, usando as propriedades Value ou AsFloat.

3. Se vc utilizar o tipo DoublePrecision no Banco de dados, o tipo do seu TField será TFloatField dando à vc o resultado que vc espera.

À principio eu havia pensado que seria um problema com TBcd que só suporta 4 digitos, mas em teoria, o TFmtbcd deveria suportar mais... Talvez exista uma forma de setar algo em runtime que resolva o problema, mas pesquisei bastante não encontrei solução para o seu caso, se existir. O máximo que consegui foi o ´quebra-galho´ forçando que o TField seja Float (com Double Precision).

Nota: Não use o tipo Float no banco de dados. Use Double Preciosion, caso contrário vc terá uma escala muito grande, desnecessária e propensa a erros de arredondamento.

Eu ainda não havia me deparado com este problema, porque usando controles DBAware o erro não ocorre, por isto tenho colunas armazenando até 8 digitos decimais, com o tipo Numeric, sem nenhum problema.

Sei que não ajudei muito mas...

T+


Responder

Gostei + 0

27/04/2005

Bruno Belchior

Vinicios, realmente usando o tipo Double Precision o arredondamento é correto, ou seja salva minhas seis casas decimais, porém não pretendo desistir e quero aprender a manipular o tipo numeric com seis casas pois se no firebird suporta é imperativo que no delphi também suporte...


Responder

Gostei + 0

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

Aceitar