[firebase-br] Campo zerado

joao_jma joao_jma em itelefonica.com.br
Qui Dez 4 12:17:55 -03 2008


eu já utilizo o dialeto 3

com o email que respondi para o Fabrício... vc consegue ver algum problema?

agradeço


Assinatura João M. de Amorim - Informática: Andreza Enxovais - Ibitinga/SP 
((16) 3341-9000 È(16) 9239-0959
----- Original Message ----- 
From: "Sandro Souza" <escovadordebits em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, December 04, 2008 8:52 AM
Subject: Re: [firebase-br] Campo zerado


Bom dia/tarde João.

Eu falei sobre esse "sintoma" na resposta a uma questão sobre que dialeto
deveria ser utilizado, mas vou colocar aqui o mesmo texto. Espero que seja
aproveitável de alguma forma.

"Nos dialetos 1 e 2, quando você declara um campo do tipo NUMERIC ou
DECIMAL, ele será armazenado com o formato de ponto flutuante, como o tipo
DOUBLE PRECISION por exemplo.

Isso implica diretamente em possíveis erros de precisão numérica, sendo
notados principalmente em somatórios (SUM) e médias (AVG).

No dialeto 3, o Firebird procura armazenar o valor como se fosse um valor
inteiro, ou seja:

Se o seu campo tiver até 4 dígitos, independente de quantas casas decimais
tenha, será armazenado internamente como um SMALLINT (inteiro de 16 bits com
sinal).

Se o seu campo tiver de 5 até 8 dígitos, independente de quantas casas
decimais tenha, será armazenado internamente como um INTEGER (inteiro de 32
bits com sinal).

Se o seu campo tiver de 9 até 18 dígitos, independente de quantas casas
decimais tenha, será armazenado internamente como um BIGINT (inteiro de 64
bits com sinal), que é disponível apenas no dialeto 3.

Apesar desses valores serem armazenados como inteiros, durante as operações
matemáticas, seus valores são multiplicados e/ou divididos por potências de
10 para respeitar as casas decimais informadas.

Como resultado final, você tem o mínimo possível de erros de precisão
(arredondamento, etc...).

Esse "pequeno detalhe técnico" faz muita diferença quando você está lidando
com valores monetários (como o tipo MONEY do SQL Server, ou o tipo Currency
do Borland Delphi), que também são BIGINTs (Int64) "disfarçados".

Resumindo, quer o máximo de precisão numérica entre outros benefícios? Use
sempre o dialeto 3."

2008/12/4 joao_jma <joao_jma em itelefonica.com.br>

> Usando Firebird 1.5, Delphi 7 com Zeos.
>
> Campos da Tabela que faço calculo. (CAMPOS CRIADOS COM O TIPO FLOAT)
>
> PROVENTOS = 690,800
> DESCONTOS = 690,800
> ------------------------------------
> TOTAL = 0,000
>
>
> Quando estou visualizando, os valores aparecem da maneira acima citada. 
> Mas
> quando eu "entro" no campo pelo IBExpert, dando um ENTER sobre ele, como 
> se
> eu fosse alterá-lo, os valores mudam... ficam assim:
>
> PROVENTOS = 690,7999877929688
> DESCONTOS = 690,7999877929688
> ------------------------------------------------------
> TOTAL = -0,0000152587891
>
>
> Existe um relatório no sistema, que eu testo se o campo TOTAL é < 0 ...
> caso seja menor que zero, imprimo a linha em vermelho.
> E nesse caso a linha está saindo vermelha....
> Alguém sabe me dizer, qual a causa, motivo, razão ou circunstância que 
> está
> levando esses campos de valores ficarem assim?
>
> Antecipo meus agradecimentos
>
>    João M. de Amorim - Informática:
>    Andreza Enxovais - Ibitinga/SP
>    ((16) 3341-9000
>    È(16) 9239-0959
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista