SAP ALV 负号前置/去掉小数点后多余的0

导语:我们都知道SAP的负数,负号都是在数字之后展示的,下面分享一下通过例程实现ALV负号前置的解决办法,告别给每个字段都用CHAR类型,在判断小于0,用0相减,在拼接负号的方式。

一、创建一个例程

所有对于数字的处理都放在这个例程里进行处理,ALV只要处理在FIELDCAT中添加这个例程,系统就会自动处理了。

注意:
1、要定义好outsing这个参数的小数长度。
2、例程的名称格式为:CONVERSION_EXIT_XXXX_OUTPUT
中间XXXX的位置,作为例程名称。

FUNCTION conversion_exit_sign_output.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(INPUT)
*"  EXPORTING
*"     REFERENCE(OUTPUT)
*"----------------------------------------------------------------------

  DATA: output1(20) TYPE c,
        output2(20),
        outsign    TYPE p DECIMALS 2,
         lv_input  TYPE string.
         
  lv_input = input.
  REPLACE ALL OCCURRENCES OF ',' IN lv_input WITH space.
  IF lv_input IS NOT INITIAL.
    outsign = lv_input.
    IF lv_input > 0.
      WRITE outsign TO output1 ."RIGHT-JUSTIFIED .
    ELSE.
      outsign = outsign * ( -1 ).
      WRITE outsign TO output1 ."RIGHT-JUSTIFIED.
      CONCATENATE '-' output1 INTO output1.
    ENDIF.
  ELSE.
    CLEAR output1.
  ENDIF.
  CONDENSE output1 NO-GAPS .
  WRITE output1 TO output2 RIGHT-JUSTIFIED .
  output = output2.

ENDFUNCTION.

二、ALV调用例程

在FILEDCAT的时候添加例程,例程的名称为"==XXXX",XXXX就是前面定义的例程名字。

DEFINE add_fieldcat.

    CLEAR gs_fieldcat.
    gs_fieldcat-fieldname    =  &1.
    gs_fieldcat-reptext      =  &2.
    gs_fieldcat-edit         =  &3.
    gs_fieldcat-col_pos      =  &4.
    gs_fieldcat-just         =  &5.
    gs_fieldcat-outputlen    =  &6.
    gs_fieldcat-edit_mask    =  &7.

    APPEND gs_fieldcat TO gt_fieldcat.

  END-OF-DEFINITION.

  CLEAR gt_fieldcat.
  REFRESH gt_fieldcat.

  add_fieldcat     'KUNNR'          '客户编号'               ''   ''  ''  ''  ''.
  add_fieldcat     'BU_SORT1'       '客户简称'               ''   ''  ''  ''  ''.
  add_fieldcat     'NAME_ORG1'      '客户全称'               ''   ''  ''  ''  ''.
  add_fieldcat     'ZKHFL'          '客户分类'               ''   ''  ''  ''  ''.
  add_fieldcat     'BZTXT'          '销售地区名称'           ''   ''  ''  ''  ''.
  add_fieldcat     'BEZEI'          '销售办事处名称'         ''   ''  ''  ''  ''.
  add_fieldcat     'ZTERM'          '收款条件'               ''   ''  ''  ''  ''.
  add_fieldcat     'CREDIT_LIMIT'   '信用额度'               ''   ''  ''  ''  '==SIGN'.
  add_fieldcat     'WAERS'          '币种'                   ''   ''  ''  ''  ''.
  add_fieldcat     'YSZKJE'         '应收账款净额'           ''   ''  ''  ''  '==SIGN'.
  add_fieldcat     'XYQN_SUM'       '信用期内小计'           ''   ''  ''  ''  '==SIGN'.
  add_fieldcat     'XYQW_SUM'       '信用期外小计'           ''   ''  ''  ''  '==SIGN'.
  add_fieldcat     'YSZKJE_Y'       '预收账款净额'           ''   ''  ''  ''  '==SIGN'.
  add_fieldcat     'YSZK_KP'        '已开票应收账款'         ''   ''  ''  ''  '==SIGN'.
  add_fieldcat     'XYQN_SUM_KP'    '信用期内小计(已开票)'  ''   ''  ''  ''  '==SIGN'.

附加:负号前置,并去掉小数后面多余的0和小数点。

FUNCTION conversion_exit_decimal_output.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(INPUT)
*"  EXPORTING
*"     REFERENCE(OUTPUT)
*"----------------------------------------------------------------------

  DATA: output1(20),
        output2(20),
        outsign     TYPE p DECIMALS 6.
  DATA : lv_string TYPE string,
         lv_input  TYPE string.

  "负号前置
  lv_input = input.
  REPLACE ALL OCCURRENCES OF ',' IN lv_input WITH space.
  IF lv_input IS NOT INITIAL.
    outsign = lv_input.
    IF input > 0.
      WRITE outsign TO output1 ."RIGHT-JUSTIFIED .
    ELSEIF input = 0.
      WRITE space TO output1.
    ELSE.
      outsign = outsign * ( -1 ).
      WRITE outsign TO output1 ."RIGHT-JUSTIFIED.
      CONCATENATE '-' output1 INTO output1.
    ENDIF.
  ELSE.
    CLEAR output1.
  ENDIF.
  CONDENSE output1 NO-GAPS .

  "去掉多余的0和小数点
  lv_string = output1.
  CONDENSE lv_string NO-GAPS.
  SHIFT lv_string RIGHT DELETING TRAILING '0'.     "除右边无意义0
  SHIFT lv_string RIGHT DELETING TRAILING '.'.     "除右边无意义小数点
  SHIFT lv_string LEFT DELETING LEADING space.     "除右边无意义小数点
  REPLACE ALL OCCURRENCES OF ',' IN lv_string WITH space.

  WRITE lv_string TO output2 RIGHT-JUSTIFIED .
  SHIFT output2 LEFT DELETING LEADING space.     "除右边无意义小数点
  output = output2.

ENDFUNCTION.
FUNCTION conversion_exit_decimal_input.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(INPUT)
*"  EXPORTING
*"     REFERENCE(OUTPUT)
*"----------------------------------------------------------------------
  DATA: output1(20),
        output2(20),
        outsign     TYPE p DECIMALS 6.
  DATA : lv_string TYPE string.

  "负号前置
  IF input IS NOT INITIAL.
    outsign  = input.
    IF input > 0.
      WRITE outsign TO output1 ."RIGHT-JUSTIFIED .
    ELSE.
      outsign = outsign * ( -1 ).
      WRITE outsign TO output1 ."RIGHT-JUSTIFIED.
      CONCATENATE '-' output1 INTO output1.
    ENDIF.
  ELSE.
    CLEAR output1.
  ENDIF.
  CONDENSE output1 NO-GAPS .

  "去掉多余的0和小数点
  lv_string = output1.
  CONDENSE lv_string NO-GAPS.
  SHIFT lv_string RIGHT DELETING TRAILING '0'.     "除右边无意义0
  SHIFT lv_string RIGHT DELETING TRAILING '.'.     "除右边无意义小数点
  REPLACE ALL OCCURRENCES OF ',' IN lv_string WITH space.
  SHIFT lv_string LEFT DELETING LEADING space.     "除右边无意义小数点

  WRITE lv_string TO output2 RIGHT-JUSTIFIED .
  SHIFT output2 LEFT DELETING LEADING space.     "除右边无意义小数点
  output = output2.

ENDFUNCTION.

附加:ALV下载到EXCEL负号也需要前置

在字段属性fieldcat中添加参考表和参考字段,参考表使用EKPO,参考字段使用MENGE就可以了。

作者:小飞猪猪猪猪猪猪猪–CSDN

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小飞猪猪猪猪猪猪猪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值