1、负号提前
**问题描述:**SAP的数据,例如金额,为负数时,负号放在数值后面,不符合一般的负号在前的读数习惯,如何把负号放到数值前面?
**解决办法:**使用 'CLOI_PUT_SIGN_IN_FRONT'
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
value = gs_out-menge.
注意这里要转换字符的值必须是字符类型,对外接口采用这种方式比较好用。
2、负号提前且有千分符
用户需求升级:金额 负号前置,并且加千分符。
展示效果如下:
解决办法:
参考:SAP 金额等负号提前问题_sap 负号提前-CSDN博客
操作步骤:
(1)SE37 ,命名规则如下,从Z001开始,这里Z001已用,故使用Z002。
(2)输入所属的函数组、描述、导入参数、导出参数。
(3)源代码如下,保存、激活。
FUNCTION conversion_exit_z002_output.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(INPUT)
*" EXPORTING
*" REFERENCE(OUTPUT)
*"----------------------------------------------------------------------
DATA:output1(20),
output2(20),
outnum(16) TYPE p DECIMALS 2.
IF input IS NOT INITIAL.
outnum = input.
IF input >= 0.
WRITE outnum TO output1.
ELSE.
outnum = outnum * ( -1 ).
WRITE outnum TO output1.
CONCATENATE '-' output1 INTO output1.
ENDIF.
ELSEIF input = '0.00'.
WRITE outnum TO output1.
* CLEAR output1.
ENDIF.
CONDENSE output1 NO-GAPS.
WRITE output1 TO output2 RIGHT-JUSTIFIED.
output = output2.
CLEAR : output2.
ENDFUNCTION.
(4)在设置对应的ALV格式时,针对金额添加字段类型'Z002',与上面函数命名里面的一致。
wa_fieldcat_lvc-EDIT_MASK = '==Z002'.
注意:设置负号提前类型的数据类型,不能设置为字符类型,需要设置为金额类型 CURR。
详细如下:
FORM display_data .
* alv 显示定义
DATA: wa_fieldcat_lvc TYPE lvc_s_fcat,
i_fieldcat_lvc TYPE lvc_t_fcat,
i_layout_lvc TYPE lvc_s_layo,
i_grid_settings TYPE lvc_s_glay.
DEFINE fill_alv.
CLEAR wa_fieldcat_lvc.
wa_fieldcat_lvc-fieldname = &1. "变量1 字段名
wa_fieldcat_lvc-scrtext_l = &2 . "变量2 字段编码
wa_fieldcat_lvc-outputlen = &3 . "变量3 字段描述
wa_fieldcat_lvc-EDIT_MASK = &4. "变量4 金额类型设置
APPEND wa_fieldcat_lvc TO i_fieldcat_lvc .
END-OF-DEFINITION.
fill_alv 'NAME' '项目' '20' '' .
fill_alv 'HSLVT' '金额' '20' '==Z002' .
i_grid_settings-edt_cll_cb = 'X'. "退出可编辑单元格时回调
i_layout_lvc-zebra = 'X' . " 使ALV界面呈现颜色交替
i_layout_lvc-sel_mode = 'A' . " 选择模式,"A"在最左端有选择按钮
i_layout_lvc-cwidth_opt = 'X' . " 自动优化列宽
i_layout_lvc-detailinit = 'X' . " 是否出现细节屏幕
i_layout_lvc-detailtitl = '金额表' . " 标题
"i_layout_lvc-stylefname = 'CELLSTYLES'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid " 当前程序
i_callback_top_of_page = 'TOP_OF_PAGE'
i_callback_pf_status_set = 'SET_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
i_grid_settings = i_grid_settings
is_layout_lvc = i_layout_lvc " 属性内表
it_fieldcat_lvc = i_fieldcat_lvc[] " 列明内表
i_save = 'A' " 是否保存布局
TABLES
t_outtab = gt_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " DISPLAY_DATA
3、显示百分号
用户需求再升级:对同比、环比数据,添加百分号。
要求效果如下:
**解决办法1:**直接加。当字符串处理。
DATA: ZTB(20),
LZTB TYPE p DECIMALS 2.
LZTB = 0.02. "同比是为0.02
ZTB = | { LZTB * 100 } %|.
或者
ZTB = ( LZTB * 100 ) && '%'.
**解决办法2:**和上面将负号提前的方法类似,SE37创建'CONVERSION_EXIT_Z001_OUTPUT'.
(1)设置如下
(2)源代码如下:
FUNCTION conversion_exit_z001_output.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(INPUT)
*" EXPORTING
*" REFERENCE(OUTPUT)
*"----------------------------------------------------------------------
DATA input1 TYPE p DECIMALS 1.
data lv_outpt type char8.
IF input > 0.
input1 = input * 100.
WRITE input1 TO lv_outpt.
CONCATENATE lv_outpt '%' INTO lv_outpt.
output = lv_outpt.
ELSE.
output = lv_outpt.
output = '0'.
ENDIF.
ENDFUNCTION.
(3)ALV设置,gt_fieldcat-EDIT_MASK = '==Z001'.
注意:设置有百分号类型的数据类型,不能设置为字符类型,需要设置为 TYPE p DECIMALS 2。
FORM display_data .
* alv 显示定义
DATA: i_grid_settings TYPE lvc_s_glay,
lt_fieldcat TYPE slis_t_fieldcat_alv,
lr_aggregations TYPE REF TO cl_salv_aggregations.
DATA:gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
gs_layout TYPE slis_layout_alv.
* 自定义ALV 显示方式
DEFINE fill_alv.
clear gt_fieldcat.
gt_fieldcat-fieldname = &1. "变量1 字段名
gt_fieldcat-seltext_m = &2 . "变量2 字段描述
gt_fieldcat-outputlen = &3 . "变量2 字段描述
gt_fieldcat-NO_ZERO = &4.
gt_fieldcat-EDIT_MASK = &5.
append gt_fieldcat.
END-OF-DEFINITION.
fill_alv 'MENGE1' '上月数量' '20' 'X' ''.
fill_alv 'MENGE2' '本月数量' '20' 'X' ''.
fill_alv 'BFB' '环比' '20' 'X' '==Z001'.
LOOP AT gt_fieldcat.
MODIFY gt_fieldcat.
IF gt_fieldcat-fieldname = ' FLTIME'.
gt_fieldcat-edit = 'X'.
gt_fieldcat-outputlen = '50'.
ENDIF.
MODIFY gt_fieldcat.
ENDLOOP.
i_grid_settings-edt_cll_cb = 'X'. "退出可编辑单元格时回调
gs_layout-zebra = 'X'.
gs_layout-colwidth_optimize = 'X'.
gs_layout-box_fieldname = 'ZSEL'. "定义边框选中栏
gs_layout-window_titlebar = '环比分析表'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
i_grid_settings = i_grid_settings
is_layout = gs_layout
it_fieldcat = gt_fieldcat[]
it_sort = lt_sort
i_save = 'A'
TABLES
t_outtab = gt_tab
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " DISPLAY_DATA
4、总结
ALV展示时,采用'CONVERSION_EXIT_Z****_OUTPUT'' 方式,在报表展示时可以重复使用。如果对外部接口使用,在代码中需要做相应的转换。
5、注意事项
定义数据类型时,需要注意,如果是CHAR类型,在判断的时候可能有如下问题。
DATA: INPUT(20).
input = 0.05.
IF input > 0.
A
ELSE input = 0.
B
ELSE.
C
ENDIF.
这里会直接跳到B。因为类型是CHAR类型,舍去了小数点之后的数字,效果和自动向下取整一样。如果字符类型和0进行比较,需要写成 IF input = '0'.
数字进行比较的时候,需要设置数字类型、金额类型、p类型。