本文主要是介绍ABAP—ALV 进阶:对展示数字要求负号提前、有千分符、有百分号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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'EXPORTINGi_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_settingsis_layout_lvc = i_layout_lvc " 属性内表it_fieldcat_lvc = i_fieldcat_lvc[] " 列明内表i_save = 'A' " 是否保存布局TABLESt_outtab = gt_outEXCEPTIONSprogram_error = 1OTHERS = 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'EXPORTINGi_callback_program = sy-repidi_callback_pf_status_set = 'SET_PF_STATUS'i_callback_user_command = 'FRM_USER_COMMAND'i_grid_settings = i_grid_settingsis_layout = gs_layoutit_fieldcat = gt_fieldcat[]it_sort = lt_sorti_save = 'A'TABLESt_outtab = gt_tabEXCEPTIONSprogram_error = 1OTHERS = 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类型。
这篇关于ABAP—ALV 进阶:对展示数字要求负号提前、有千分符、有百分号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!