GARANTIR DESCONTO

Fórum Problema com tamanho de campo no Firebird #274840

31/03/2005

0

Crie a tabela MOVTO_ENTRADA como segue:

CREATE TABLE MOVTO_ENTRADA
(
COD_MOVTO INTEGER NOT NULL,
NF_AGR VARCHAR(10),
DATA_EMISSAO DATE,
COD_IEP INTEGER,
QTDE NUMERIC(6,5),
VR_UNIT NUMERIC(6,6),
FASE CHAR(2)
);

Quando tento incluir um registro nessa tabela, o campo QTDE não aceita nenhum valor acima de 21474, ou seja, se eu colocar 21475, ele me retorna a famosa mensagem ´arithmetic exception, numeric overflow, or string truncation´.

Já tentei trocar o tipo do campo para Float, Double Precision, aumentei a quantidade de dígitos e precisão, mas nada resolveu...

Por favor, se alguém puder ajudar, desde já agradeço...


Douglascrp

Douglascrp

Responder

Posts

31/03/2005

Sremulador

qual versão do fire você esta utilizando ???


Responder

Gostei + 0

31/03/2005

Vinicius2k

Colega,

Acho que esta pergunta estaria melhor colocada no fórum de IB/FB... atenção às [url=http://forum.clubedelphi.net/viewtopic.php?t=6689]Regras de Conduta[/url]...

Bem, existem dois aspectos envolvidos nesta questão :

1. A sua interpretação de precisão e escala estão incorretas (ao menos em teoria) pois convenciona-se que :
[i:a944741d8f]Numeric(p,e)[/i:a944741d8f]
[b:a944741d8f]p[/b:a944741d8f]-> precisão : tamanho total do dado.
[b:a944741d8f]e[/b:a944741d8f]-> escala : número de dígitos para a parte decimal

Neste caso, vc estaria criando uma coluna com apenas um dígito para a parte inteira, já que vc definiu como Numeric(6,5). No seu caso a teoria diz que o valor máximo que vc poderia armazenar seria [b:a944741d8f]9,99999[/b:a944741d8f] (6 digítos no total sendo 5 para a parte decimal).

2. Este segundo aspecto contradiz o primeiro pois trata especificamente do IB/FB.
O tipo ´Numeric´ do IB/FB não é um tipo real. Dependendo da precisão definidos o próprio IB/FB irá escolher o melhor tipo de dado real para armazenar o valor desta coluna.

Funciona desta forma (no dialeto 3):
- Numeric(1,e) até Numeric(4,e) usa o tipo real Smallint
- Numeric(5,e) até Numeric(9,e) usa o tipo real Integer
- Numeric(10,e) até Numeric(18,e) usa o tipo real Int64
O ´truque´ é que o IB/FB irá realizar uma divisão na hora de retornar o dado de acordo com a escala que vc definir...

Ex: Se vc define uma coluna como Numeric(6,2), vc, teoricamente, poderia armazenar no máximo [b:a944741d8f]9.999,99[/b:a944741d8f].
Mas o IB/FB utilizará internamente o tipo Integer para armazenar seu dado, o que permitirá um armazenamento real de até [b:a944741d8f]21.474.836,47[/b:a944741d8f] (2.147.483.647 que é o valor máximo para o tipo Integer, dividido por 100 para lhe fornecer as duas casas decimais).

Acho que vc já deve ter percebido que o seu problema é este... Seu Numeric(6,5) irá utilizar internamente o tipo Integer e só permitirá o armazenamento de [b:a944741d8f]21.474,83647[/b:a944741d8f], que é o valor máximo de um Integer dividido, por 10.000 para lhe resultar as 5 casas decimais...

O segundo ponto é uma ´particularidade´, se vc utilizar como base para a criação das suas colunas o primeiro ponto, que o ´padrão´, não terá problemas quanto a exceder o tamanho máximo e não precisa ficar ´descobrindo´ qual o tipo interno o IB/FB irá utilizar...
No seu caso, se vc deseja 6 digitos inteiros e 5 decimais, utilize [b:a944741d8f]Numeric(11,5)[/b:a944741d8f]

Observando apenas a primeira regra vc teria um máximo de [b:a944741d8f]999.999,99999[/b:a944741d8f], mas se levar em consideração a segunda o máximo seria muito superior ao limite do primeiro, pois internamente o tipo Int64 estaria sendo utilizado.

T+


Responder

Gostei + 0

01/04/2005

Douglascrp

Estou utilizando a versão 1.5.2

Quanto ao fórum utilizado, só percebi a burrada depois que já tinha postado, mas mesmo assim, valeu pelo toque, da próxima vou prestar mais atenção...

Vinicius, eu consegui resolver o problema ontem a tarde mesmo, alterando o campo para Numeric(10,5).

Vc poderia me dizer qual o número máximo que eu conseguiria colocar nesse campo?

Obrigado pela ajuda...


Responder

Gostei + 0

01/04/2005

Kotho

E ai moçada...

Dêem uma chance pro nosso colega, pois, quem é que nunca cometeu um engano... hehehe

Cara... existe um artigo, se não me engano em [url]www.firebase.com.br[/url] que fala umas coisas muito interessantes sobre campos numéricos... mas resumindo, o Fire vai trabalhar melhor com tamanhos 9 e 18, porque internamente ele irá trabalhar como inteiro, e terá maior precisão... o artigo explica bem...


Responder

Gostei + 0

01/04/2005

Vinicius2k

...eu consegui resolver o problema ontem a tarde mesmo, alterando o campo para Numeric(10,5). Vc poderia me dizer qual o número máximo que eu conseguiria colocar nesse campo?

Segundo a regra ´padrão´: [b:844c33616c]99999,9999[/b:844c33616c].

Mas se considerar o que o IB/FB faz internamente (usando Int64) o máximo é [b:844c33616c]((2^63)-1) / (10^5)[/b:844c33616c]...
Fique tranquilo pois está na casa dos trilhões : 92.233.720.368.547,75807


Dêem uma chance pro nosso colega, pois, quem é que nunca cometeu um engano...

Não entendi... não creio ter menosprezado o colega em nenhum momento. Se sim, sinceramente peço que me perdoem.
Aliás esta confusão é bastante comum, visto que única documentação precisa e confiável sobre isto está presente apenas no Manual do IB 6.0. (Foi o único lugar onde encontrei as regras claras sobre isso, até hoje... me corrijam se eu estiver enganado)

...mas resumindo, o Fire vai trabalhar melhor com tamanhos 9 e 18, porque internamente ele irá trabalhar como inteiro, e terá maior precisão

Se utilizado o dialeto 3, ele sempre vai trabalhar com inteiros (Smallint, Integer ou Int64), não importando a precisão. O único caso que ele adota o Double Precision internamente é se utilizado precisão superior a 9 no dialeto 1.

T+


Responder

Gostei + 0

01/04/2005

Douglascrp

Aí Vinícius, não esquenta que eu não levei a mal não...

E obrigado pela resposta...


Responder

Gostei + 0

01/04/2005

Vinicius2k

:wink:

Nesta última resposta, aonde lê-se :
Segundo a regra ´padrão´: 99999,9999


Leia-se :
Segundo a regra ´padrão´ : [b:30c264d5f5]99999,99999[/b:30c264d5f5].


Falou um dígito na escala para o Numeric(10,5).

T+


Responder

Gostei + 0

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

Aceitar