SAP负号前置转换【函数】

导语: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 ).
        "这里对34两种长度进行识别最后一位是否是负号,是负号就把长度扣掉一位。
        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
注意:转发请注明作者

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞猪猪猪猪猪猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值