Fórum Problemas com campos numeric(15,2). Muito estranho. #46586

09/09/2004

0

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:
/*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

Aledeol

Responder

Posts

09/09/2004

Afarias

|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+


Responder

Gostei + 0

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

Aceitar