ABAP 简单容器分割 split
涉及类:
cl_gui_splitter_container
cl_gui_container
代码重点:
*1. 拆分界面
CREATE OBJECT gs_split
EXPORTING
link_dynnr = sy-dynnr
link_repid = sy-repid
parent = cl_gui_container=>screen0
rows = 1
columns = 3
name = 'GS_SPLIT'.
2. "取得每个子屏的容器对象
CALL METHOD gs_split->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = gs_cont1.
3.容器与ALV关联
CREATE OBJECT gv_alv1
EXPORTING
i_parent = gs_cont1.
运行效果:
test代码如下:
REPORT ztest_0003.
INCLUDE ZTEST_0003_TOP.
INCLUDE ZTEST_0003_CLASS.
INCLUDE ZTEST_0003_FRM.
INCLUDE ZTEST_0003_PBO.
INCLUDE ZTEST_0003_PAI.
INCLUDE ZTEST_0003_CLASS.
INCLUDE ZTEST_0003_FRM.
INCLUDE ZTEST_0003_PBO.
INCLUDE ZTEST_0003_PAI.
END-OF-SELECTION.
CALL SCREEN 9000.
CALL SCREEN 9000.
INCLUDE ZTEST_0003_TOP
"分割容器
DATA gs_split TYPE REF TO cl_gui_splitter_container.
DATA gs_split2 TYPE REF TO cl_gui_splitter_container.
DATA gs_cont1 TYPE REF TO cl_gui_container.
DATA gs_cont2 TYPE REF TO cl_gui_container.
DATA gs_cont3 TYPE REF TO cl_gui_container.
DATA: gs_fieldcat TYPE lvc_s_fcat, "lvc_s_fcat
gt_fieldcat1 TYPE lvc_t_fcat, "清单观察器控制的字段目录Add By Code_Tool
gt_fieldcat2 TYPE lvc_t_fcat, "清单观察器控制的字段目录Add By Code_Tool
gs_layout1 TYPE lvc_s_layo, "ALV 控制: 布局结构Add By Code_Tool
gs_layout2 TYPE lvc_s_layo. "ALV 控制: 布局结构Add By Code_Tool
DATA:gv_alv1 TYPE REF TO cl_gui_alv_grid,
gv_alv2 TYPE REF TO cl_gui_alv_grid,
gv_container1 TYPE REF TO cl_gui_custom_container,
gv_container2 TYPE REF TO cl_gui_custom_container,
gt_exclude1 TYPE ui_functions,
gt_exclude2 TYPE ui_functions,
gt_fcode TYPE TABLE OF sy-ucomm. "排除
TYPES: BEGIN OF gty_data,
num(5),
num_ms1(10),
num_ms2(10),
num_ms3(10),
END OF gty_data.
DATA : gt_data1 TYPE TABLE OF gty_data WITH HEADER LINE,
gt_data2 TYPE TABLE OF gty_data WITH HEADER LINE.
DATA:lv_num_1(5) VALUE 10000,
lv_num_2(5) VALUE 20000.
DO 200 TIMES.
ADD 1 TO lv_num_1.
gt_data1-num = lv_num_1.
gt_data1-num_ms1 = lv_num_1 && '_ms1'.
gt_data1-num_ms2 = lv_num_1 && '_ms2'.
gt_data1-num_ms3 = lv_num_1 && '_ms4'.
APPEND gt_data1.
CLEAR gt_data1.
ADD 1 TO lv_num_2.
gt_data2-num = lv_num_2.
gt_data2-num_ms1 = lv_num_2 && '_ms1'.
gt_data2-num_ms2 = lv_num_2 && '_ms2'.
gt_data2-num_ms3 = lv_num_2 && '_ms4'.
APPEND gt_data2.
CLEAR gt_data2.
ENDDO.
INCLUDE ZTEST_0003_CLASS.
*&---------------------------------------------------------------------*
*& CLASS LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
CLASS-METHODS hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id
e_column_id
es_row_no sender.
CLASS-METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm sender.
CLASS-METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no sender.
CLASS-METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
CLASS-METHODS handle_modify FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
*& CLASS LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD hotspot_click.
ENDMETHOD.
METHOD handle_user_command.
ENDMETHOD.
METHOD handle_double_click.
ENDMETHOD.
METHOD handle_toolbar.
ENDMETHOD.
METHOD handle_modify."修改数据
ENDMETHOD.
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
*& CLASS LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
CLASS-METHODS hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id
e_column_id
es_row_no sender.
CLASS-METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm sender.
CLASS-METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no sender.
CLASS-METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
CLASS-METHODS handle_modify FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
*& CLASS LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD hotspot_click.
ENDMETHOD.
METHOD handle_user_command.
ENDMETHOD.
METHOD handle_double_click.
ENDMETHOD.
METHOD handle_toolbar.
ENDMETHOD.
METHOD handle_modify."修改数据
ENDMETHOD.
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
INCLUDE ZTEST_0003_FRM.
*&---------------------------------------------------------------------*
*& Form FRM_SPLIT_SCREEN
*&---------------------------------------------------------------------*
*& 拆分屏幕
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_split_screen .
* 拆分界面
CREATE OBJECT gs_split
EXPORTING
link_dynnr = sy-dynnr
link_repid = sy-repid
parent = cl_gui_container=>screen0
rows = 1
columns = 3
name = 'GS_SPLIT'.
* CALL METHOD gs_split->set_border
* EXPORTING
* border = cl_gui_cfw=>false.
* CALL METHOD gs_split->set_row_height
* EXPORTING
* id = 1
* height = 60.
* CALL METHOD gs_split->set_visible
* EXPORTING
* visible = 'X'.
"取得每个子屏的容器对象
CALL METHOD gs_split->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = gs_cont1.
CALL METHOD gs_split->get_container
EXPORTING
row = 1
column = 2
RECEIVING
container = gs_cont2.
CREATE OBJECT gs_split2
EXPORTING
link_dynnr = sy-dynnr
link_repid = sy-repid
parent = gs_cont2
rows = 3
columns = 3
name = 'GS_SPLIT'.
CALL METHOD gs_split2->get_container
EXPORTING
row = 2
column = 2
RECEIVING
container = gs_cont3.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SCREEN_ALV
*&---------------------------------------------------------------------*
*& 将屏幕和alv进行关联
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_screen_alv .
"创建ALV网格对象
CREATE OBJECT gv_alv1
EXPORTING
i_parent = gs_cont1.
* CREATE OBJECT gv_alv2
* EXPORTING
* i_parent = gs_cont2.
CREATE OBJECT gv_alv2
EXPORTING
i_parent = gs_cont3.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_FIRST_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_first_alv .
PERFORM frm_set_fieldcat TABLES gt_fieldcat1.
CALL METHOD gv_alv1->set_table_for_first_display
EXPORTING
i_save = 'A'
i_default = 'X'
is_layout = gs_layout1
it_toolbar_excluding = gt_exclude1
CHANGING
it_outtab = gt_data1[]
it_fieldcatalog = gt_fieldcat1[].
SET HANDLER lcl_event_receiver=>handle_user_command FOR gv_alv1.
SET HANDLER lcl_event_receiver=>handle_toolbar FOR gv_alv1.
SET HANDLER lcl_event_receiver=>handle_double_click FOR gv_alv1.
SET HANDLER lcl_event_receiver=>hotspot_click FOR gv_alv1.
CALL METHOD gv_alv1->set_toolbar_interactive.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_SECOND_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_second_alv .
PERFORM frm_set_fieldcat TABLES gt_fieldcat2.
CALL METHOD gv_alv2->set_table_for_first_display
EXPORTING
i_save = 'A'
i_default = 'X'
is_layout = gs_layout2
it_toolbar_excluding = gt_exclude2[]
CHANGING
it_outtab = gt_data2[]
it_fieldcatalog = gt_fieldcat2[].
SET HANDLER lcl_event_receiver=>hotspot_click FOR gv_alv2.
SET HANDLER lcl_event_receiver=>handle_modify FOR gv_alv2.
* 设置enter事件
CALL METHOD gv_alv2->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
CALL METHOD gv_alv2->set_toolbar_interactive.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = gv_alv2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_FIELDCAT2
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat TABLES pt_fieldcat TYPE lvc_t_fcat.
REFRESH pt_fieldcat.
DEFINE %%fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-scrtext_s = &2.
gs_fieldcat-scrtext_m = &2.
gs_fieldcat-scrtext_l = &2.
gs_fieldcat-seltext = &2.
APPEND gs_fieldcat TO pt_fieldcat.
CLEAR gs_fieldcat.
END-OF-DEFINITION.
%%fieldcat :
'NUM' 'NUM' ,
'NUM_MS1' 'NUM_MS1',
'NUM_MS2' 'NUM_MS2',
'NUM_MS3' 'NUM_MS3'.
ENDFORM.
*& Form FRM_SPLIT_SCREEN
*&---------------------------------------------------------------------*
*& 拆分屏幕
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_split_screen .
* 拆分界面
CREATE OBJECT gs_split
EXPORTING
link_dynnr = sy-dynnr
link_repid = sy-repid
parent = cl_gui_container=>screen0
rows = 1
columns = 3
name = 'GS_SPLIT'.
* CALL METHOD gs_split->set_border
* EXPORTING
* border = cl_gui_cfw=>false.
* CALL METHOD gs_split->set_row_height
* EXPORTING
* id = 1
* height = 60.
* CALL METHOD gs_split->set_visible
* EXPORTING
* visible = 'X'.
"取得每个子屏的容器对象
CALL METHOD gs_split->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = gs_cont1.
CALL METHOD gs_split->get_container
EXPORTING
row = 1
column = 2
RECEIVING
container = gs_cont2.
CREATE OBJECT gs_split2
EXPORTING
link_dynnr = sy-dynnr
link_repid = sy-repid
parent = gs_cont2
rows = 3
columns = 3
name = 'GS_SPLIT'.
CALL METHOD gs_split2->get_container
EXPORTING
row = 2
column = 2
RECEIVING
container = gs_cont3.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SCREEN_ALV
*&---------------------------------------------------------------------*
*& 将屏幕和alv进行关联
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_screen_alv .
"创建ALV网格对象
CREATE OBJECT gv_alv1
EXPORTING
i_parent = gs_cont1.
* CREATE OBJECT gv_alv2
* EXPORTING
* i_parent = gs_cont2.
CREATE OBJECT gv_alv2
EXPORTING
i_parent = gs_cont3.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_FIRST_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_first_alv .
PERFORM frm_set_fieldcat TABLES gt_fieldcat1.
CALL METHOD gv_alv1->set_table_for_first_display
EXPORTING
i_save = 'A'
i_default = 'X'
is_layout = gs_layout1
it_toolbar_excluding = gt_exclude1
CHANGING
it_outtab = gt_data1[]
it_fieldcatalog = gt_fieldcat1[].
SET HANDLER lcl_event_receiver=>handle_user_command FOR gv_alv1.
SET HANDLER lcl_event_receiver=>handle_toolbar FOR gv_alv1.
SET HANDLER lcl_event_receiver=>handle_double_click FOR gv_alv1.
SET HANDLER lcl_event_receiver=>hotspot_click FOR gv_alv1.
CALL METHOD gv_alv1->set_toolbar_interactive.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_SECOND_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_second_alv .
PERFORM frm_set_fieldcat TABLES gt_fieldcat2.
CALL METHOD gv_alv2->set_table_for_first_display
EXPORTING
i_save = 'A'
i_default = 'X'
is_layout = gs_layout2
it_toolbar_excluding = gt_exclude2[]
CHANGING
it_outtab = gt_data2[]
it_fieldcatalog = gt_fieldcat2[].
SET HANDLER lcl_event_receiver=>hotspot_click FOR gv_alv2.
SET HANDLER lcl_event_receiver=>handle_modify FOR gv_alv2.
* 设置enter事件
CALL METHOD gv_alv2->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
CALL METHOD gv_alv2->set_toolbar_interactive.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = gv_alv2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_FIELDCAT2
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat TABLES pt_fieldcat TYPE lvc_t_fcat.
REFRESH pt_fieldcat.
DEFINE %%fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-scrtext_s = &2.
gs_fieldcat-scrtext_m = &2.
gs_fieldcat-scrtext_l = &2.
gs_fieldcat-seltext = &2.
APPEND gs_fieldcat TO pt_fieldcat.
CLEAR gs_fieldcat.
END-OF-DEFINITION.
%%fieldcat :
'NUM' 'NUM' ,
'NUM_MS1' 'NUM_MS1',
'NUM_MS2' 'NUM_MS2',
'NUM_MS3' 'NUM_MS3'.
ENDFORM.
INCLUDE ZTEST_0003_PBO.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'GUI9000'.
SET TITLEBAR 'TITLE9000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INITIAL_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE initial_alv OUTPUT.
CHECK gv_alv1 IS INITIAL.
* 1.划分屏幕
PERFORM frm_split_screen.
*2.将屏幕和alv关联
PERFORM frm_screen_alv.
*3.屏幕展示数据
PERFORM frm_show_first_alv.
PERFORM frm_show_second_alv.
ENDMODULE.
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'GUI9000'.
SET TITLEBAR 'TITLE9000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INITIAL_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE initial_alv OUTPUT.
CHECK gv_alv1 IS INITIAL.
* 1.划分屏幕
PERFORM frm_split_screen.
*2.将屏幕和alv关联
PERFORM frm_screen_alv.
*3.屏幕展示数据
PERFORM frm_show_first_alv.
PERFORM frm_show_second_alv.
ENDMODULE.
INCLUDE ZTEST_0003_PAI.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module MODULE_EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE module_exit INPUT.
LEAVE PROGRAM.
ENDMODULE.
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module MODULE_EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE module_exit INPUT.
LEAVE PROGRAM.
ENDMODULE.