Fórum Duvida com campos Numeric(15,2) #401675
25/05/2011
0
Estou procurando uma explicação e até agora não encontrei.
Defini no meu banco de dados campos numeric(15,2) quando fui acessar reparei que os valores estavam com dizima ai me surgiu a duvida, um campo numeric(15,2) não deveria conter 15 digitos antes da virgula e somente 2 no caso um valor de 33,33 e não 33,3300018310547.
Por favor se estiver errado me corrijam como esse campo deve ser usado? Isso é um bug do firebird? porque no sql server não tenho esse problema.
E até onde conheço ele deveria respeitar os 2 campos e fazer o arredondamento caso venha alguma dizima correta?
Agora o que fazer?
Desde ja Obrigado pela ajuda.
Leandro Santos
Leandro Santos
Curtir tópico
+ 0Posts
25/05/2011
Rafael Mattos
nunca vi isso trabalho ha 7 anos com o firebird.
posta a imagem da tela.
Gostei + 0
25/05/2011
Leandro Santos
Porém me surgiu um outra duvida agora, o mecanismo de acesso ao banco poderia estar ocasionando este bug? O dialeto do banco poderia estar influenciando nisso tambem?
Gostei + 0
25/05/2011
Rafael Mattos
pode ser esse RDB$262 que não ta com as casas certa
vc alterou o tipo desse campo? ultimamente?
faz esse update aqui
update RDB$FIELDS set
RDB$FIELD_SCALE = -2,
RDB$FIELD_PRECISION = 15
where RDB$FIELD_NAME = 'RDB$262'
-----------------------------
se não resolver faz o backup restore
Gostei + 0
25/05/2011
Leandro Santos
Nem se eu criar um campo novo do tipo numeric(15,2) e migrar o valor do campo antigo para o campo novo não resolve.
Gostei + 0
25/05/2011
Rafael Mattos
Gostei + 0
25/05/2011
Leandro Santos
Alguma idéia?
Gostei + 0
25/05/2011
Rafael Mattos
Alguma idéia?
talves seja o SQL Manager, essa é a ultima versão dele? talves ele esteja com problema.
é q sempre usei o IBExpert
Gostei + 0
25/05/2011
Leandro Santos
No IBExpert aconteceu o mesmo..acredito que estava correto mas não está não.
Gostei + 0
25/05/2011
Rafael Mattos
Gostei + 0
25/05/2011
Leandro Santos
Agora isso pode ser porque é um banco que foi criado no interbase?
Gostei + 0
25/05/2011
Rafael Mattos
Agora isso pode ser porque é um banco que foi criado no interbase?
vc ta usando qual DIALECT?
Gostei + 0
25/05/2011
Leandro Santos
Gostei + 0
25/05/2011
Rafael Mattos
to achando que o problema vai ser isso
DIALETO 1
Usando o dialeto 1, as características de transição se comportam como no Interbase 5:
Constantes alfanuméricas podem ser delimitadas por aspas simples e duplas. O dialeto 1 não reconhece
identificadores delimitados.
O tipo DATE não está disponível, mas é substituído pelo tipo TIMESTAMP, que contém informações sobre
data e hora. Quando um banco de dados versão 5 é gravado/restaurado na versão 6, os campos DATE são
automaticamente atualizados para o tipo TIMESTAMP.
Os tipos DECIMAL e NUMERIC com precisão maior que 9 são gravados como ponto flutuante.
------------
DIALECT 2
Os Clientes podem ser configurados para utilizar o dialeto 2. Nesse modo, eles reportam erros quando
encontram aspas duplas, tipos DATE, ou campos NUMERIC/DECIMAL com precisão maior que 9. Esse
dialeto é utilizado para alertar o desenvolvedor para potenciais problemas durante a migração e não deve ser
utilizado para uso normal no dia a dia. Para detectar áreas problemáticas na definição de um banco de dados
que você está migrando, extraia a METADATA e rode-a através de um cliente utilizando o dialeto 2. Por
exemplo :
isql -i v5metadata.sql
Lembre-se de NÃO utilizar o dialeto 2 para uso normal dos bancos de dados.
----------------------
DIALETO 3
As seguintes características são específicas do DIALETO 3, e são incompatíveis com o dialeto 1 e todos os
BDs e clientes antigos:
Constantes alfanuméricas devem ser delimitadas por aspas simples (apóstrofe). Aspas duplas (") são usadas
somente em identificadores delimitados.
O tipo de dado DATE armazena somente a DATA. Dois novos tipos de dados estão disponíveis : TIME que
armazena somente a informação de HORA, e TIMESTAMP que armazena ambos DATA e HORA. O tipo
TIMESTAMP substitui a funcionalidade do tipo DATE das versões anteriores do IB. O Dialeto 3 também
inclui os operadores funcionais CURRENT_DATE, CURRENT_TIME, e CURRENT_TIMESTAMP.
Tipos DECIMAL e NUMERIC com precisão maior que 9 são gravados utilizando inteiros de 64 bits se
forem criados no dialeto 3. Note que todas os campos desse tipo continuam sendo armazenados como float
se o BD foi trazido de alguma versão anterior do IB.
Gostei + 0
25/05/2011
Leandro Santos
Gostei + 0
25/05/2011
Rafael Mattos
vc cria como DATE, mas vc reparo que, quando mostra ali no IBExpert e no SQL Manager ele mostra com o formato timestamp....
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)