做SAP项目,我们肯定有各种报表开发。我们都知道ALV grid函数的输出有两个:REUSE_ALV_GRID_DISPLAY 和 REUSE_ALV_GRID_DISPLAY_LVC。我最喜欢用LVC结尾的函数,因为它可以和ALV容器结合使用,且参数可以双击跳转到对应的数据字典查询每个参数的描述和属性用法。
在做了那么项目中,发现过很多人写的报表真的很烂,也杂乱无章,所以我每次写报表,为了方便给后续运维的人看起来代码通俗易懂不杂乱,如果不涉及很复杂的功能,我几乎都是直接用LVC函数直接展示,同时把ALV报表模板复制过来,然后对应的修改对应form,一般就只需要修改一下ALV显示的定义结构,fieldcat字段目录,sql数据抽取就行。下面记录一下模板的代码:同时附加一些常用的功能。(我尽量不涉及status的新建,都是用喜欢用ALV标准自带的GUI)。
大概报表逻辑如下:
1.定义alv显示的内表结构;
2.定义选择屏幕;
3.sql数据获取及整理;
4.定义fieldcat;
5.call function to display data
6.如果有一些按钮触发事件再添加user_command事件和对应的代码
ALV模板代码(无用户响应事件)
PS:特别说明一下就是在定义fieldcat的时候我很喜欢用到ref_table和ref_field,因为加了参考可以避免很多显示的问题,比如单元格是可编辑的时候输入长度受限的问题或者数据筛选器筛选数据长度问题或者筛选结果不正确的问题,加了参考就不怕这些问题了。然后还有一个参数就是seltext,控制在筛选数据或者变更布局的时候筛选字段的描述显示,加上它就可以避免ALV在编辑设置布局字段显示的描述不是你定义描述。
*======================================================================*
* 事务代码: ZMM005 *
* 程序名: ZMMR005 *
* 描述: xxx报表 *
* 类型: 报表 *
* APPLICATION AREA: MM *
*----------------------------------------------------------------------*
* 功能描述: *
* 为了方便xxx,特此开发此报表 *
*----------------------------------------------------------------------*
* 修改记录: *
* 版本 DD/MM/YY 作者 描述 更改请求 *
* ---------------------------------------------------------------------*
* 000 28/08/18 xxxx Initial release *
*======================================================================*
REPORT zmmr005 MESSAGE-ID zmm01.
*----------------------------------------------------------------------*
* Tables/声明数据库表
*----------------------------------------------------------------------*
Tables:mara.
*----------------------------------------------------------------------*
* Type/自定义类型
*----------------------------------------------------------------------*
TYPES:
BEGIN OF ty_alv,
matnr type mara-matnr,"物料号
END OF ty_alv.
*----------------------------------------------------------------------*
* Variable/定义变量
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Define the Macros/定义宏
*----------------------------------------------------------------------*
DEFINE
set_fieldcat.
CLEAR gs_fcat.
gs_fcat-fieldname = &1."内表的字段
gs_fcat-coltext = &2.
gs_fcat-scrtext_m = &2.
gs_fcat-scrtext_s = &2.
gs_fcat-scrtext_l = &2.
gs_fcat-seltext = &2."布局设置时显示的列名称
gs_fcat-ref_table = &3.
gs_fcat-ref_field = &4.
APPEND gs_fcat TO gt_fcat.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
* Internal table and work area/定义内表和工作区
*----------------------------------------------------------------------*
DATA:
gt_alv TYPE TABLE OF ty_alv,
gs_alv TYPE ty_alv,
gs_layout TYPE lvc_s_layo,
gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat.
*----------------------------------------------------------------------*
* Selection screen/定义屏幕
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN END OF BLOCK blk.
*----------------------------------------------------------------------*
* Initialization/初始事件
*----------------------------------------------------------------------*
INITIALIZATION.
*----------------------------------------------------------------------*
* At selection-screen/屏幕事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
*----------------------------------------------------------------------*
* Start-of-selection/开始选择事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_get_data.
*----------------------------------------------------------------------*
* End-of-selection/结束选择事件
*----------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM frm_show_data.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_get_data .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_show_data .
* 确定ALV输出列的属性
PERFORM frm_fill_fieldcat.
* 确定ALV输出格式的属性
PERFORM frm_fill_layout .
* ALV报表输出
PERFORM frm_alv_display.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_fill_fieldcat .
REFRESH: gt_fcat.
set_fieldcat:
'MATNR' '物料号' 'MARA' 'MATNR'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_fill_layout .
CLEAR:gs_layout.
gs_layout-zebra = 'X'.
gs_layout-cwidth_opt = 'X'.
gs_layout-sel_mode = 'A'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_alv_display .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fcat
i_save = 'A'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
当有需要叫双击跳转事件,没有其他自定义的按钮事件的,那不需要定义gui,直接定义事件,然后调用的LVC函数加多参数i_callback_user_command = 'FRM_USER_COMMAND'
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_alv_display .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fcat
i_save = 'A'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_user_command USING p_ucomm LIKE sy-ucomm
p_rs_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN '&IC1'."点击跳转
READ TABLE gt_alv INTO DATA(ls_alv) INDEX p_rs_selfield-tabindex.
IF sy-subrc = 0.
CASE p_rs_selfield-fieldname.
WHEN 'VBELN'.
SET PARAMETER ID: 'VL' FIELD ls_alv-vbeln.
CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
WHEN 'VGBEL'.
IF ls_alv-vgtyp = 'C'.
SET PARAMETER ID: 'AUN' FIELD ls_alv-vgbel.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
ELSEIF ls_alv-vgtyp = 'V'.
SET PARAMETER ID: 'BES' FIELD ls_alv-vgbel.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
ENDIF.
WHEN OTHERS.
ENDCASE.
CLEAR ls_alv.
ENDIF.
ENDCASE.
ENDFORM.