内部テーブルに数値項目の集計のオーバーフローについて

TYPES:
  BEGIN OF TYP_TAB01,
              KEY1(10)              TYPE C,
              KEY2(4)                TYPE C,
              FIELD1(40)            TYPE C,
              FIELD2(40)            TYPE C,
              …
              AMOUNT              TYPE P(8),
              …
  END OF TYP_TAB01,
  BEGIN OF TYP_COL_TAB01,
              KEY1(10)              TYPE C,
              KEY2(4)                TYPE C,
              AMOUNTSUM       TYPE P(8),
END OF TYP_COL_TAB01.
 
DATA:    
  LTD_TAB01                     TYPE STANDARD TABLE OF TYP_TAB01,
  LTD_COL_TAB01              TYPE HASHED TABLE OF TYP_COL_TAB01
                                                        WITH UNIQUE KEY KEY1 KEY2,
  LTH_TAB01                      LIKE LINE OF LTD_TAB01,
  LTH_COL_TAB01              LIKE LINE OF LTD_COL_TAB01.
 
LOOP AT LTD_TAB01 INTO LTH_TAB01.
              LTH_COL_TAB01-KEY1 = LTH_TAB01-KEY1.
              LTH_COL_TAB01-KEY2 = LTH_TAB01-KEY2.
              LTH_COL_TAB01-AMOUNTSUM = LTH_TAB01-AMOUNT.
              TRY.
                            COLLECT LTH_COL_TAB01 INTO LTD_COL_TAB01.
              CATCH CX_SY_ARITHMETIC_OVERFLOW.
                            LTH_COL_TAB01-AMOUNTSUM = 999999999999999.
                            MODIFY TABLE LTD_COL_TAB01 FROM LTH_COL_TAB01.
              ENDTRY.
ENDLOOP.

  

2.

今天在进行数量累加的时候报了一个如下错误
COLLECT_OVERFLOW_TYPE_P
CX_SY_ARITHMETIC_OVERFLOW
这个错误从字面上就可以看出是数量太大溢出了,所以解决方法也比较简单,只需将发生溢出的字段的值范围修改大点就行
具体方法:
1.如果是数量 数据元素可以考虑使用 MENGE13 (带 3 位小数位字符的数量字段 13(25))
2.如果是金额 数据元素可以考虑使用 WERTV13 (带 2 位小数的值字段 13(25) 字符)
 
3.

ABAP中的金额溢出

ABAP数据库表中金额字段一般都是DEC形式。

例如,BSIK-DMBTR(国内贸易额)是DEC(13,2),就是说,长度为13,其中2位是小数位,而通常DEC(13,2)在debug的时候,可以看到P(7)类型,即用P(7)来保存DEC(13,2).这是因为,金额字段默认有小数点和符号位,其中符号位不能被替换,可以忽略位数,故用压缩型7位来保存DEC(13,2)即可。

在输出的时候,一般要进行金额参照货币转换,尤其是日币的时候要进行100倍变换。在金额计算是,一般会有异常产生(オーバーフロー),此时,捕捉异常的语句为TRY.

   O_W_MONTH = O_W_MONTH + I_W_WRBTR.
*    CATCH CX_ROOT.
    CATCH CX_SY_ARITHMETIC_OVERFLOW.(如果捕捉到异常,做catch后面的处理)

      MESSAGE ID SY-MSGID
            TYPE CNS_TYPE_S
          NUMBER SY-MSGNO
            WITH SY-MSGV1
                 SY-MSGV2
                 SY-MSGV3
                 SY-MSGV4.
      O_W_ERR = CNS_FLG_ON.

  ENDTRY.

------------------------------

try.
 計算式 
 CATCH CX_SY_ARITHMETIC_OVERFLOW.
     オーバーフローした場合内容
entry.

 

------------------------------------

    TRY.
        LW_COUKK = LW_BAPICURR / LH_Z16F443T-ZKWMENG.
      CATCH CX_SY_ZERODIVIDE.
        LW_COUKK  = 0.
    ENDTRY.

  

posted @ 2019-03-27 09:52  Park_SAP  阅读(916)  评论(0)    收藏  举报