目录
前言
在ABAP ALV中,TOP_OF_PAGE
是一个事件标识符,用于描述在报表每一页顶部打印或显示内容的情况。当ALV在打印或显示数据时,每翻到新的一页,系统就会触发TOP_OF_PAGE
事件,这时你可以定义一个处理程序(通常是FORM或CLASS的方法)来控制在新页顶部展示哪些内容,比如公司logo、报表标题、页码、日期等。
实战
两种实现方式:
第一种:直接通过REUSE_ALV_GRID_DISPLAY函数的i_callback_top_of_page来回调Form;
第二种:通过REUSE_ALV_GRID_DISPLAY函数的it_events参数接口,向事件内表中Append事件top_of_page与对应的Form;
I_CALLBACK_TOP_OF_PAGE Form 与 REUSE_ALV_COMMENTARY_WRITE 函数配合使用。
REUSE_ALV_COMMENTARY_WRITE 函数包括一个必须参数,三个可选参数:
1、IT_LIST_COMMENTARY(必须):一个类型为 SLIS_T_LISTHEADER 的内表;
TYPES: BEGIN OF slis_listheader,
typ(1) TYPE C, " H = Header, S = Selection, A = Action
key(20) TYPE C,
info TYPE slis_entry,
END OF slis_listheader.
2、I_LOGO(可选):图片/Logo 的 Object ID
3、I_END_OF_LIST_GRID(可选):用于页脚的信息
4、I_ALV_FORM(可选):是否用于 ALV 的FORM中,默认为:Space
typ的取值为:"H=Header, S=Selection, A=Action
- H:表示输出内容为列表头。通常只有一行(但可以有多行),此时KEY不会输出,只有INFO值才会输出,字体会加粗加大,左对齐。
- S:表示输出内容为字段型说明,即针对某个词进行说明,分两列(KEY和INFO)输出。通常有多个,且每行中只允许一对。此时KEY与INFO都会输出,Key字段会加粗,INFO正常显示,均左对齐输出。
- A:表示输出内容为提示说明性文字。通常只有一行(但可以有多行),此时KEY不会输出,只有INFO值才会输出,字粗为斜体左对齐输出。
注意:同时有 H、S、A时,会按照 H、S、A的先后顺序输出(而不管向内表APEPEND的顺序),且H、S、A之间会使用空行分隔,但它们各自内部(类型相同的行)之间不会输出空行。
实战开发
展示效果:
完整代码:
TYPE-POOLS:slis.
DATA:gt_fieldcat TYPE slis_t_fieldcat_alv,
gs_fieldcat TYPE slis_fieldcat_alv,
gs_layout TYPE slis_layout_alv,
gv_repid TYPE sy-repid.
DATA:gt_spfli LIKE STANDARD TABLE OF spfli WITH HEADER LINE.
INITIALIZATION.
gv_repid = sy-repid.
*屏幕开始事件
START-OF-SELECTION.
PERFORM f_getdata.
PERFORM f_catalog.
PERFORM f_alvshow.
FORM f_getdata.
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE gt_spfli.
ENDFORM.
FORM f_catalog.
*fieldcat属性
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = gv_repid
i_structure_name = 'SPFLI'
CHANGING
ct_fieldcat = gt_fieldcat "导出gt_fieldcat内表数据
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CLEAR gs_fieldcat.
*"对gt_fieldcat属性的修改
READ TABLE gt_fieldcat INTO gs_fieldcat INDEX 2. "将第二列设为热点显示
gs_fieldcat-hotspot = 'X'.
MODIFY gt_fieldcat FROM gs_fieldcat INDEX 2.
*layout属性
gs_layout-zebra = 'X'."斑马线显示
gs_layout-colwidth_optimize = 'X'."列宽度最优化显示
ENDFORM.
FORM f_alvshow.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = gv_repid
i_grid_title = 'ALV REPORT TEST' "ALV显示标题
is_layout = gs_layout
it_fieldcat = gt_fieldcat
i_callback_top_of_page = 'F_TOP_OF_PAGE'
TABLES
t_outtab = gt_spfli
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 f_top_of_page.
DATA: i_header TYPE slis_t_listheader,
wa_header TYPE slis_listheader.
* 定义登录用户的描述
DATA: l_name TYPE string ,
name_first LIKE adrp-name_first ,
name_last LIKE adrp-name_last .
* 定义登录日期
DATA: l_date TYPE string .
* 得到登录用户的描述
SELECT SINGLE
adrp~name_first
adrp~name_last
INTO (name_first,name_last)
FROM adrp
INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber
WHERE usr21~bname = sy-uname .
IF sy-subrc = 0 .
CONCATENATE name_last name_first INTO l_name .
ELSE .
l_name = sy-uname .
ENDIF.
CLEAR name_first.
CLEAR name_last.
CONCATENATE sy-datum+0(4) '.'
sy-datum+4(2) '.'
sy-datum+6(2) INTO l_date.
wa_header-typ = 'H'.
wa_header-info = 'ALV DEMO' .
APPEND wa_header TO i_header .
CLEAR wa_header .
wa_header-typ = 'S'.
wa_header-key = '制表日期:' .
wa_header-info = l_date .
APPEND wa_header TO i_header .
CLEAR wa_header .
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = i_header
i_logo = 'ENJOYSAP_LOGO' "OAOR 中的Object Key
i_alv_form = 'X'.
ENDFORM. "frm_top_of_page