导语:我们都知道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