SAP 负号提前

举报
雨绸缪 发表于 2023/07/31 17:08:34 2023/07/31
【摘要】 前言在 ABAP 中,当显示或打印负数值时,减号位于数值的右侧,而不是数字的左侧。因此 ABAP 开发人员或 Smartform 开发人员需要格式化负数,并在打印之前将减号从数字的右向左移动。在 ALV 报表中,SAP 总是将负号放在数字的末尾,比如这样: 方法一用 write to 语句把负数取绝对值,然后把数字型写入字符型可以保留千位符,再判断正负数,在输出的时候添上负号。Form a...

前言

在 ABAP 中,当显示或打印负数值时,减号位于数值的右侧,而不是数字的左侧。因此 ABAP 开发人员或 Smartform 开发人员需要格式化负数,并在打印之前将减号从数字的右向左移动。

在 ALV 报表中,SAP 总是将负号放在数字的末尾,比如这样:

image.png

方法一

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.

字符串处理方法

通过 ABAP 代码将数值读入局部变量。然后检查它是否是负数。如果它具有负数值,则乘以 -1 以获取数值数据的绝对值。

在使数字为正数之后,ABAP 代码将其保存到一个字符变量中,使用 SHIFT... LEFT DELETE LEADING ' ' 语句将清除前导空格字符。如果原始数字值为负,则作为 ABAP 脚本的最后一步,使用 CONCATENATE 命令在字符值前面添加减号 “-” 。

*DATA GV_CONDVALUE_TXT TYPE CHAR20. " in Global Data definition
DATA lv_kwert TYPE kwert.

lv_kwert = gs_it_kond-kwert.

IF gs_it_kond-kwert < 0.
 lv_kwert = -1 * lv_kwert .
ENDIF.
WRITE lv_kwert TO gv_condvalue_txt.
SHIFT gv_condvalue_txt LEFT DELETING LEADING ' '.
IF gs_it_kond-kwert < 0.
 CONCATENATE '-' gv_condvalue_txt INTO gv_condvalue_txt.
ENDIF.

系统自带函数

CLOI_PUT_SIGN_IN_FRONT 是把负号提前的,但是它是把字符转化为字符型输出的。就是把负号split下然后放前面,这样的问题就是在显示的时候字符型数字没有 3 位一分的千位分隔符。再把字符型赋予数字型输出,但是输出的时候负号还是会自动加后面滴。

CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          VALUE = gt_table-column5.

默认情况下,负号将显示在 ABAP 字段的右侧。通过使用功能模块 CLOI_PUT_SIGN_IN_FRONT,我们可以在报告中显示值时将负号显示在左侧。但此 FM 仅适用于字符字段,因此首先将货币或数量字段复制到文本字段,进行转换,然后在报表中显示文本字段。例如:

DATA: gv_amount type konp-kbetr.
  DATA: gv_amount_text(15)  type c. 

gv_amount = 100.
  WRITE:/ 'Positive Value : ', gv_amount. 

gv_amount = gv_amount * -1. 

WRITE:/ 'Negative Value : ', gv_amount. 

gv_amount_text = gv_amount. 

CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
    CHANGING
      value         = gv_amount_text. 

WRITE:/ 'After Shifting : ', gv_amount_text RIGHT-JUSTIFIED.

千分位

把字符型加千位符的,取整,判断长度,除 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.

总结

以上就是综合网上几种方法将 SAP 中的负号提前的方法,希望能对你有所帮助~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。