[firebase-br] [Firebase-Br] Problema de arithmetic overflow em select

Humberto S. Reis hsreisjr em gmail.com
Qua Fev 23 12:00:59 -03 2011


Pessoal bom dia

Mudei os tipos de campos da tabela abaixo de:

CREATE TABLE ITEMMOVIMENTACAOPRODUTO (
    COD_MOVIMENTACAO         DM_CODIGO NOT NULL /* DM_CODIGO = INTEGER
DEFAULT 0 NOT NULL */,
    TIPOMOVIMENTACAO         DM_CHAR01 NOT NULL /* DM_CHAR01 = CHAR(1) */,
    CODIGO                   DM_CODIGO NOT NULL /* DM_CODIGO = INTEGER
DEFAULT 0 NOT NULL */,
    VALORUNITARIO            DM_MOEDA5 DEFAULT 0 NOT NULL /* DM_MOEDA5 =
NUMERIC(15,5) DEFAULT 0 NOT NULL */,
    QUANTIDADE               T_CURRENCY DEFAULT 0 NOT NULL /* T_CURRENCY =
NUMERIC(18,4) DEFAULT 0 NOT NULL */,
    VALORITEM                DM_MOEDA /* DM_MOEDA = NUMERIC(15,2) DEFAULT 0
NOT NULL */,
    TIPODESCONTO             DM_CHAR01 /* DM_CHAR01 = CHAR(1) */,
    VALORRATEIO              DM_ZERO DEFAULT 0 NOT NULL /* DM_ZERO = DOUBLE
PRECISION DEFAULT 0 NOT NULL */,
    VALORRATEIO_FRETE        DM_ZERO /* DM_ZERO = DOUBLE PRECISION DEFAULT 0
NOT NULL */,
    VALORRATEIO_SEGURO       DM_MOEDA /* DM_MOEDA = NUMERIC(15,2) DEFAULT 0
NOT NULL */,
    SALDOANTERIOR            DM_ZERO DEFAULT 0 /* DM_ZERO = DOUBLE PRECISION
DEFAULT 0 NOT NULL */,
    VALORDESCONTO            T_CURRENCY DEFAULT 0 NOT NULL /* T_CURRENCY =
NUMERIC(18,4) DEFAULT 0 NOT NULL */,
    VALORCUSTO               T_CURRENCY DEFAULT 0 /* T_CURRENCY =
NUMERIC(18,4) DEFAULT 0 NOT NULL */,
    VALORICMSSUBSTITUIDO     T_CURRENCY /* T_CURRENCY = NUMERIC(18,4)
DEFAULT 0 NOT NULL */,
    VALORDESPAC              DM_MOEDA /* DM_MOEDA = NUMERIC(15,2) DEFAULT 0
NOT NULL */);

Para:

CREATE TABLE ITEMMOVIMENTACAOPRODUTO (
    COD_MOVIMENTACAO         DM_CODIGO NOT NULL /* DM_CODIGO = INTEGER
DEFAULT 0 NOT NULL */,
    TIPOMOVIMENTACAO         DM_CHAR01 NOT NULL /* DM_CHAR01 = CHAR(1) */,
    CODIGO                   DM_CODIGO NOT NULL /* DM_CODIGO = INTEGER
DEFAULT 0 NOT NULL */,
    VALORUNITARIO            DM_MOEDA5 DEFAULT 0 NOT NULL /* DM_MOEDA5 =
NUMERIC(15,5) DEFAULT 0 NOT NULL */,
    QUANTIDADE               T_CURRENCY DEFAULT 0 NOT NULL /* T_CURRENCY =
NUMERIC(18,4) DEFAULT 0 NOT NULL */,
    VALORITEM                DM_MOEDA /* DM_MOEDA = NUMERIC(15,2) DEFAULT 0
NOT NULL */,
    TIPODESCONTO             DM_CHAR01 /* DM_CHAR01 = CHAR(1) */,
    VALORRATEIO              DM_MOEDA DEFAULT 0 NOT NULL /* DM_MOEDA =
NUMERIC(15,2) DEFAULT 0 NOT NULL */, <<<<Mudança>>>>
    VALORRATEIO_FRETE        DM_MOEDA /* DM_MOEDA = NUMERIC(15,2) DEFAULT 0
NOT NULL */,                    <<<<Mudança>>>>
    VALORRATEIO_SEGURO       DM_MOEDA /* DM_MOEDA = NUMERIC(15,2) DEFAULT 0
NOT NULL */,
    SALDOANTERIOR            DM_ZERO DEFAULT 0 /* DM_ZERO = DOUBLE PRECISION
DEFAULT 0 NOT NULL */,
    VALORDESCONTO            T_CURRENCY DEFAULT 0 NOT NULL /* T_CURRENCY =
NUMERIC(18,4) DEFAULT 0 NOT NULL */,
    VALORCUSTO               T_CURRENCY DEFAULT 0 /* T_CURRENCY =
NUMERIC(18,4) DEFAULT 0 NOT NULL */,
    VALORICMSSUBSTITUIDO     T_CURRENCY /* T_CURRENCY = NUMERIC(18,4)
DEFAULT 0 NOT NULL */,
    VALORDESPAC              DM_MOEDA /* DM_MOEDA = NUMERIC(15,2) DEFAULT 0
NOT NULL */);


Depois disso, o cálculo da MARGEM, no select abaixo, está dando erro de
arithmetic overflow or string truncation

select /*MARGEM*/
       cast((((IMP.VALORUNITARIO-IMP.VALORDESCONTO) * IMP.QUANTIDADE)+
              IMP.VALORRATEIO+
              IMP.VALORRATEIO_FRETE+
              IMP.VALORRATEIO_SEGURO+
              IMP.VALORICMSSUBSTITUIDO) -
            (IMP.QUANTIDADE * IMP.VALORCUSTO) /
            (((IMP.VALORUNITARIO-IMP.VALORDESCONTO) * IMP.QUANTIDADE)+
              IMP.VALORRATEIO+
              IMP.VALORRATEIO_FRETE+
              IMP.VALORRATEIO_SEGURO+
              IMP.VALORICMSSUBSTITUIDO)
             as numeric(14,2))
  from MOVIMENTACAO M
  join TIPOMOVIMENTACAO TP on (TP.CODIGO = M.COD_TIPOMOVIMENTACAO)
  join ITEMMOVIMENTACAOPRODUTO IMP on (M.CODIGO = IMP.COD_MOVIMENTACAO and
M.TIPO = IMP.TIPOMOVIMENTACAO)
 where (M.STATUS = 'F' ) and (TP.OPERACAO = 'VD')

A pergunta é: Como resolver isso

Desde já agradeço a valorosa colaboração.

Humberto S.



Mais detalhes sobre a lista de discussão lista