Problemas com campos numeric(15,2). Muito estranho.
Bom dia, galera,
possuo e minha tabela estoque, o campo saldo do tipo numeric(15,2).
E vem acontecendo coisas estranhas, quando faço movimentações que zerem este saldo.
Exemplo:
Com um saldo de 5,560, faço as seguintes movimentações:
Saida de 3,530 = 2,030
Saída de 1,525 = 0,505
saída de 0,500 =0,005
saída de 0,005 = 0,00 (Deveria zerar.) Mas o q acontece é q ele gera um valor do tipo -1,2535245-e7.
Como posso resolver isto? Já tentei passar para float e o erro continua, para numeric(15,3 e 4) e tbm continua.
Eu dou baixa no saldo, através de um trigger da tabela de movimentações, beforeInsert.
desta forma:
O q pode estar gerando este erro?
obrigado. :(
possuo e minha tabela estoque, o campo saldo do tipo numeric(15,2).
E vem acontecendo coisas estranhas, quando faço movimentações que zerem este saldo.
Exemplo:
Com um saldo de 5,560, faço as seguintes movimentações:
Saida de 3,530 = 2,030
Saída de 1,525 = 0,505
saída de 0,500 =0,005
saída de 0,005 = 0,00 (Deveria zerar.) Mas o q acontece é q ele gera um valor do tipo -1,2535245-e7.
Como posso resolver isto? Já tentei passar para float e o erro continua, para numeric(15,3 e 4) e tbm continua.
Eu dou baixa no saldo, através de um trigger da tabela de movimentações, beforeInsert.
desta forma:
/*Vefifica o movimento e faz a movimentacao*/ if ((Movimento = ´E´) or (Movimento = ´R´)) then begin Update estoque_mat EM set em.saldo = em.saldo + Cast(new.quantmov as numeric(15,2)) , em.log =:SLOG Where em.empcod = :Empresa and em.idmat = :Codmat and em.codcor = new.codcor; end if (Movimento = ´S´) then begin Update estoque_mat EM set em.saldo = em.saldo - cast(new.quantmov as numeric(15,2)),em.log =:SLOG Where em.empcod = :Empresa and em.idmat = :Codmat and em.codcor = new.codcor; end /*Atualiza o campo estoqant*/ new.estoqant =:Estoque;
O q pode estar gerando este erro?
obrigado. :(
Aledeol
Curtidas 0
Respostas
Afarias
09/09/2004
|Como posso resolver isto? Já tentei passar para float e o erro continua,
|para numeric(15,3 e 4) e tbm continua.
Vc está usando o banco de dados no DIALETO 1 -- seu problema está exatamente no tipo FLOAT -- float e double precision são extremamente sucetíveis a pequenos ´desvios de cálculos´.
NUMERIC não é um tipo de dados mas uma espécie de ALIAS -- quando vc usa NUMERIC o interbase escolhe o melhor tipo de dados baseado nos valores de precisão e escala informados.
No DIALETO 1 NUMERIC com precisão 10 ou e superior são definidos como double precision. Para resolver seu problema vc tem 2 opções::
1- definir o campo como NUMERIC(9,3)
ou
2- mudar para o DIALETO 3 e ai sim usar NUMERIC(15,3)
T+
|para numeric(15,3 e 4) e tbm continua.
Vc está usando o banco de dados no DIALETO 1 -- seu problema está exatamente no tipo FLOAT -- float e double precision são extremamente sucetíveis a pequenos ´desvios de cálculos´.
NUMERIC não é um tipo de dados mas uma espécie de ALIAS -- quando vc usa NUMERIC o interbase escolhe o melhor tipo de dados baseado nos valores de precisão e escala informados.
No DIALETO 1 NUMERIC com precisão 10 ou e superior são definidos como double precision. Para resolver seu problema vc tem 2 opções::
1- definir o campo como NUMERIC(9,3)
ou
2- mudar para o DIALETO 3 e ai sim usar NUMERIC(15,3)
T+
GOSTEI 0