当前需求,需要实现同时显示抬头、明细两个ALV信息。这里使用cl_gui_docking_container,通过上下分割创建2个容器,用这两个容器创建ALV对象,并显示。 效果图如下:
第一步:创建屏幕0100. (只需要将PBO、PAI实现)
第二步: 创建GUI STATUS。
第三步:创建TITLE BAR。
代码如下:
REPORT zmmr030.
* 全局变量定义
DATA: gr_top_alv TYPE REF TO cl_gui_alv_grid. "屏幕alv对象
DATA: gr_bottom_alv TYPE REF TO cl_gui_alv_grid. "屏幕alv对象
DATA: gr_dock TYPE REF TO cl_gui_docking_container, "屏幕容器对象"选择屏幕
gr_splitter TYPE REF TO cl_gui_splitter_container,
gr_top_con TYPE REF TO cl_gui_container, " 最上面的容器
gr_bottom_con TYPE REF TO cl_gui_container. " 最下面的容器
DATA: gt_spfli TYPE TABLE OF spfli,
gt_sbook TYPE TABLE OF sbook.
START-OF-SELECTION.
CALL SCREEN 0100.
*&---------------------------------------------------------------------*
*& Module z OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE pbo_0100 OUTPUT.
PERFORM frm_status_0100.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module PAI_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE pai_0100 INPUT.
PERFORM frm_pai_0100 USING sy-ucomm.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_status_0100
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_status_0100 .
IF gr_dock IS INITIAL.
" 创建ALV
PERFORM frm_init_alv_grids.
ELSE.
" 刷新ALV对象
PERFORM frm_refresh_alv USING gr_top_alv.
PERFORM frm_refresh_alv USING gr_bottom_alv.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_init_alv_grids
*&---------------------------------------------------------------------*
*& 使用Dock将屏幕分割为上下两部分;
*& 建立上下两个ALV对象
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init_alv_grids.
DATA: ls_layout TYPE lvc_s_layo.
**& 设置屏幕的标题状态
SET PF-STATUS 'STATUS_0100'.
SET TITLEBAR 'TITLE_0100'.
**& 0. 创建docking
CREATE OBJECT gr_dock
EXPORTING
repid = sy-repid
dynnr = sy-dynnr
extension = '1500' "屏幕大小
side = cl_gui_docking_container=>dock_at_top.
"将屏幕拆分成上下两个屏幕:两行一列
CREATE OBJECT gr_splitter
EXPORTING
parent = gr_dock
rows = 2
columns = 1.
**& 1. 第一个屏幕容器放在第一行第一列
CALL METHOD gr_splitter->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = gr_top_con.
"第一个屏幕高度
CALL METHOD gr_splitter->set_row_height
EXPORTING
id = 1
height = 50.
" 第一个ALV
CREATE OBJECT gr_top_alv
EXPORTING
i_parent = gr_top_con.
ls_layout-sel_mode = 'D'.
ls_layout-zebra = 'X'.
ls_layout-cwidth_opt = 'X'.
CALL METHOD gr_top_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SPFLI'
is_layout = ls_layout
CHANGING
it_outtab = gt_spfli.
**& 2. 第二个屏幕容器放在第二行第一列
CALL METHOD gr_splitter->get_container
EXPORTING
row = 2
column = 1
RECEIVING
container = gr_bottom_con.
" 第二个ALV
CREATE OBJECT gr_bottom_alv
EXPORTING
i_parent = gr_bottom_con.
ls_layout-sel_mode = 'D'.
ls_layout-zebra = 'X'.
ls_layout-cwidth_opt = 'X'.
CALL METHOD gr_bottom_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SBOOK'
is_layout = ls_layout
CHANGING
it_outtab = gt_sbook.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_refresh_alv
*&---------------------------------------------------------------------*
*& ALV 刷新
*&---------------------------------------------------------------------*
*& --> GR_TOP_ALV
*&---------------------------------------------------------------------*
FORM frm_refresh_alv USING ir_alv_grid TYPE REF TO cl_gui_alv_grid.
DATA: ls_stable TYPE lvc_s_stbl.
CLEAR: ls_stable.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
CALL METHOD ir_alv_grid->refresh_table_display
EXPORTING
is_stable = ls_stable.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_pai_0100
*&---------------------------------------------------------------------*
*& 100屏幕 互动处理
*&---------------------------------------------------------------------*
*& --> SY_UCOMM
*&---------------------------------------------------------------------*
FORM frm_pai_0100 USING iv_ucomm TYPE sy-ucomm.
CASE iv_ucomm.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE TO SCREEN 0. "返回上一级
WHEN OTHERS.
ENDCASE.
ENDFORM.