导语:SAP的负数有别于其它系统,SAP的负数实际储存符号是在后面的,例如【-5000】实际内表中的值会是【5000-】,所以在接口的传输给外围系统的时候需要事先先把负号转换一下,才可以传出,但是普通的判断会有BUG,亲测在内表字段值为【-0.02】的时候,判断小于零是失效的,sy-subrc会等于4,就不会进入我们的处理。所以这边写了一个函数,并且可以对一条数据的所有需要转换的字段进行一次性转换,【支持常规的数量和金额转换(小数点后两位或三位)】
注:其实可以用SAP标准的函数【CLOI_PUT_SIGN_IN_FRONT】,但是他只可以逐个字段的值进行处理,所以推荐用下面的自建函数。
函数名称:ZFM_NEGATIV_PREFIX
函数入参:I_NAME 需要转换的字段名,若多个用‘/’分开
正在更改:CS_CHANGE 需要转换的工作区
函数代码:
FUNCTION zfm_negativ_prefix.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(I_NAME)
*" CHANGING
*" REFERENCE(CS_CHANGE)
*"----------------------------------------------------------------------
"注意:这里的入参输入形式应为字段间的拼接例如:KBETR1/KBETR2.
DATA: BEGIN OF lw_name,
name TYPE char10,
END OF lw_name.
DATA : lt_name LIKE TABLE OF lw_name.
DATA : lv_change TYPE char50. " 存放原数值
DATA : lv_change2 TYPE p DECIMALS 2."如果是小数点后两位,用变量change2进行转换
DATA : lv_change3 TYPE p DECIMALS 3."如果是小数点后两位,用变量change3进行转换
DATA : lv_i1 TYPE char20."记录小数点前数值
DATA : lv_i2 TYPE char10."记录小数点后数值
DATA : lv_i3 TYPE char05."计算小数点后的长度
IF i_name IS NOT INITIAL.
SPLIT i_name AT '/' INTO TABLE lt_name.
DELETE ADJACENT DUPLICATES FROM lt_name COMPARING name.
LOOP AT lt_name INTO lw_name.
ASSIGN COMPONENT lw_name-name OF STRUCTURE cs_change TO FIELD-SYMBOL(<fs_change>)."获取指定字段的数值
IF sy-subrc = 0 .
lv_change = <fs_change>. CONDENSE lv_change. "这里不加<0的判断,因为会有bug,自测在这里变量=(0.22-)时< 0的sy-subrc <>0,不知道为什么
SPLIT lv_change AT '.' INTO lv_i1 lv_i2.
lv_i3 = strlen( lv_i2 ).
"这里对3、4两种长度进行识别最后一位是否是负号,是负号就把长度扣掉一位。
IF lv_i3 = 4.
IF lv_i2+3(1) = '-'.
lv_i3 = 3.
ENDIF.
ELSEIF lv_i3 = 3.
IF lv_i2+2(1) = '-'.
lv_i3 = 2.
ENDIF.
ENDIF.
"根据长度对数据进行赋值
IF lv_i3 = 2.
lv_change2 = <fs_change>.
<fs_change> = |{ lv_change2 SIGN = LEFT }|.
ELSEIF lv_i3 = 3.
lv_change3 = <fs_change>.
<fs_change> = |{ lv_change3 SIGN = LEFT }|.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
lv_change = <fs_change>.
ENDFUNCTION.
使用场景:
LOOP AT lt_ztre242_i2 INTO DATA(lw_ztre242_i2).
CLEAR : lwa_shitems2.
MOVE-CORRESPONDING lw_ztre242_i2 TO lwa_shitems2 .
SELECT SINGLE maktx from makt into lwa_shitems2-maktx_i2 WHERE matnr = lwa_shitems2-matnr and spras = '1'.
"负号前置
DATA(lv_input2) = 'MENGE_X13' && '/' && 'WRBTR_X10' && '/' && 'WRBTR_X11' && '/' && 'WRBTR_X12' && '/' && 'WRBTR_X14' && '/' && 'WRBTR_X15' .
CALL FUNCTION 'ZFM_NEGATIV_PREFIX'
EXPORTING
i_name = lv_input2
CHANGING
cs_change = lwa_shitems2.
APPEND lwa_shitems2 TO lt_shitems2.
ENDLOOP.
作者:小飞猪猪猪猪猪猪猪–CSDN
注意:转发请注明作者