SAP 负号提前
前言
在 ABAP 中,当显示或打印负数值时,减号位于数值的右侧,而不是数字的左侧。因此 ABAP 开发人员或 Smartform 开发人员需要格式化负数,并在打印之前将减号从数字的右向左移动。
在 ALV 报表中,SAP 总是将负号放在数字的末尾,比如这样:
方法一
用 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 中的负号提前的方法,希望能对你有所帮助~
- 点赞
- 收藏
- 关注作者
评论(0)