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'
    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类型

相关推荐
山茶花开时。7 天前
[SAP ABAP] 序列化与反序列化
开发语言·sap·abap
左甜甜9 天前
SAP MMPV报错MMPV_DATE_CHECK
sap
SAP女战士11 天前
【ABAP SAP】开发-BUG修补记录_采购申请打印时品名规格品牌为空
运维·数据库·bug·sap·abap开发
Cindy的SAP加油站13 天前
SAP Ariba_Order Fulfillment Status
sap·sap ariba
SAP学习成长之路14 天前
ADBC 查询语法介绍:EXECUTE_QUERY
java·服务器·开发语言·数据库·sap·abap·零售
需己以听的以听16 天前
4.模块化技术之子程序
sap·gui·abap·模块化·改行学it·子程序
syounger16 天前
近四分之一SAP ECC用户对未来规划尚不明朗
sap
HeathlX18 天前
ABAP - 系统集成之SAP的数据同步到OA(泛微E9)服务器数据库
数据库·abap
SAP学习成长之路21 天前
SAP HANA 上进行 ABAP 开发:简介
开发语言·数据结构·数据库·sap·abap·代码规范
Fireworks_me23 天前
SAP Native SQL 的简单说明
sql·abap