Fórum Sobre Passagem de Parâmetros #50689
27/04/2005
0
ClntDtStTesteCampoDecimal.Value := 0.152515
Bruno Belchior
Curtir tópico
+ 0Posts
27/04/2005
Vinicius2k
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.152515Espero ter ajudado.
T+
Gostei + 0
27/04/2005
Bruno Belchior
Gostei + 0
27/04/2005
Vinicius2k
Qual o tipo do TField no CDS ?
T+
Gostei + 0
27/04/2005
Bruno Belchior
Gostei + 0
27/04/2005
Vinicius2k
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+
Gostei + 0
27/04/2005
Bruno Belchior
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...
Gostei + 0
27/04/2005
Bruno Belchior
Gostei + 0
27/04/2005
Vinicius2k
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+
Gostei + 0
27/04/2005
Bruno Belchior
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)