内部テーブルに数値項目の集計のオーバーフローについて
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.

浙公网安备 33010602011771号