SAP 金额等负号提前问题

9 篇文章 2 订阅

一般我们在alv上展示的金额如果是负数,默认是这样显示的:
系统默认样式
在有的开发中,客户可能要求负号提前,实现这样的效果:
负号提前
为了实现这样的效果,这里给大家介绍三种方法,第一和第二种是来自网上常见的方法。
第一种:使用函数CLOI_PUT_SIGN_IN_FRONT

REPORT  ZGY_TEST.
TABLES : BSEG.
DATA : E_DMBTR TYPE STRING.
E_DMBTR = '100-'.
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
  CHANGING
    VALUE         = E_DMBTR.
WRITE : E_DMBTR.

这个的局限是只能用字符类型进行操作,这样就不是金额这样的数字类型了,对于对齐等也都和金额类型不同,同时会导致千分位符号丢失。
用write to语句把负数取绝对值,然后把数字型写入字符型可以保留千位符,再判断正负数,在输出的时候添上负号。

Form asset_front_minus changing value1.
   value2 = abs( value1 ).
   write value2 to string1.
   condense string1.
   if value1 < 0.
       write: '-', string1 LEFT-JUSTIFIED NO-GAP NO-ZERO.
   else.
       write: string1 LEFT-JUSTIFIED NO-GAP NO-ZERO.
   endif.
endform.

第二种:
这种方法手动添加千分位符号,以下是来自网上的实现方法:
手动把字符型加千位符的,取整,判断长度,除3以后循环mask”_,”格式,分割,再处理头3位。

FORM NUMTOSTR USING VALUE(ZNUM) CHANGING VALUE(ZSTR).
    DATA : ZCLEN TYPE I,
           N TYPE I,
           ZCSTR(20)  TYPE C,
           ZCSTR2(20) TYPE C,
           ZCTEMP(3)  TYPE C,
           ZFLAG(1)   TYPE C VALUE '.',
           ZFLAG2     TYPE I VALUE 0,
           ZCDEC(20)  TYPE C. "记录小数部分
    ZSTR = ''.
    CHECK ZNUM <> 0.
    IF ZNUM <= -1000.
        ZFLAG2 = 1.
        ZNUM = ABS( ZNUM ).
    ENDIF.
    IF ZNUM >= 1000.
        ZCSTR = ZNUM.
        * 压缩字符串,去除前面的空格。 
        CONDENSE ZCSTR NO-GAPS.
        * 分离整数与小数,好单独处理整数。 
        SPLIT ZCSTR AT ZFLAG INTO ZCSTR ZCDEC.
        ZCLEN = STRLEN( ZCSTR ).
        * 在循环中从右面在每三位的前面加上一个逗号。 
        WHILE ZCLEN > 3.
            N = ZCLEN - 3.
            ZCTEMP = ZCSTR+N(3).
            IF NOT ZCSTR2 IS INITIAL.
                CONCATENATE ZCTEMP ZCSTR2 INTO
                                ZCSTR2 SEPARATED BY ','.
            ELSE.
                ZCSTR2 = ZCTEMP.
            ENDIF.
                ZCLEN = ZCLEN - 3.
        ENDWHILE.
        * 将不剩下的不足三位数加到前面 
        CONCATENATE ZCSTR+0(ZCLEN) ZCSTR2 
                        INTO ZCSTR2 SEPARATED BY ','.
        IF ZFLAG2 = 1.
            CONCATENATE '-' ZCSTR2 INTO ZCSTR2.
        ENDIF.
        CLEAR ZCSTR.
        * 将处理过的整数与小数连接起来。 
        CONCATENATE ZCSTR2 ZCDEC INTO 
                            ZCSTR SEPARATED BY ZFLAG.
        * 将值返回 
        ZSTR = ZCSTR.
    ELSE.
        ZSTR = ZNUM.
    ENDIF.
ENDFORM.

第三种:
这种方法相对于前两种方法的优点是,一.类型还是金额等数字类型,负号实现前置;二.几乎不用写很多代码,且可以保留千分位;三.适用于多个这样的字段修改需求。
实现步骤如下:
1.SE37,按下图命名规范创建FUNCTION,
创建FUNCTION
输入函数组和描述,然后输入import和export参数,如图
inport
export
添加代码:
源代码
保存,激活。
最后,在对应的alv设置fieldcat时针对设置金额等数字类型的字段添加代码:固定写成’ZXXX’形式。

WE_FIELDCAT-EDIT_MASK = '==Z001'.
  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值