屏幕中创建多个OOALV,并设置各自的状态栏,命令控制等。
发布日期:2024/07/16
案例:创建一个报表程序展示销售订单信息。上半屏幕展示销售订单抬头信息,下半屏幕展示销售订单明细信息。
- 使用OOALV需要创建一个屏幕,这里我创建了100屏幕,创建了状态栏ZSTANDARD
屏幕代码:
PROCESS BEFORE OUTPUT.
MODULE status_0100 .
MODULE alv_display.
PROCESS AFTER INPUT.
MODULE exit_user_command AT EXIT-COMMAND.
MODULE user_command_100.
- 主程序代码如下,我详细注解了每一步操作。主要过程是,先创建一个容器,再将容器分割给为上下2部分(可以按需求创建多个,上下分屏或左右分屏都可),在这两部分中分别创建alv对象。这里我没有创建事件类。
REPORT zmm_rpt_538_wu.
DATA:
go_docking TYPE REF TO cl_gui_docking_container,
go_splitter TYPE REF TO cl_gui_splitter_container,
go_container_head TYPE REF TO cl_gui_container,
go_container_item TYPE REF TO cl_gui_container,
go_grid_head TYPE REF TO cl_gui_alv_grid,
go_grid_item TYPE REF TO cl_gui_alv_grid,
gt_exclude TYPE ui_functions.
DATA:
gt_fieldcat_head TYPE lvc_t_fcat,
gt_fieldcat_item TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo.
DATA:gt_output_head TYPE STANDARD TABLE OF vbak,
gt_output_item TYPE STANDARD TABLE OF vbap.
INITIALIZATION.
CLEAR:gt_output_head,gt_output_item.
START-OF-SELECTION.
CALL SCREEN 100.
MODULE status_0100 OUTPUT.
SET PF-STATUS 'ZSTANDARD'.
ENDMODULE.
MODULE alv_display OUTPUT.
*获取抬头,明细数据
SELECT * UP TO 2 ROWS FROM vbak INTO TABLE gt_output_head.
SELECT * FROM vbap FOR ALL ENTRIES IN @gt_output_head
WHERE vbeln = @gt_output_head-vbeln
INTO TABLE @gt_output_item.
"创建Docking容器
IF go_docking IS INITIAL.
CREATE OBJECT go_docking
EXPORTING
repid = sy-repid
dynnr = '100'
side = cl_gui_docking_container=>dock_at_top
extension = 99999
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
* 创建分割对象,分割方式:1行2列
CREATE OBJECT go_splitter
EXPORTING
parent = go_docking
rows = 2
columns = 1.
* 创建容器-Head(1行1列)
CALL METHOD go_splitter->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = go_container_head.
* 创建容器-Item(1行2列)
CALL METHOD go_splitter->get_container
EXPORTING
row = 2
column = 1
RECEIVING
container = go_container_item.
* ALV Grid Head
CREATE OBJECT go_grid_head
EXPORTING
i_parent = go_container_head.
* ALV Grid Head
CREATE OBJECT go_grid_item
EXPORTING
i_parent = go_container_item.
* 创建ALV布局
gs_layout-cwidth_opt = abap_true.
gs_layout-zebra = abap_true.
gs_layout-no_rowins = abap_true.
* 创建ALV的FieldCatlog
gt_fieldcat_head = VALUE #(
( fieldname = 'VBELN' coltext = '销售凭证' ref_table = 'VBAK' ref_field = 'VBELN')
( fieldname = 'ERDAT' coltext = '创建日期' ref_table = 'VBAK' ref_field = 'ERDAT' )
( fieldname = 'ERZET' coltext = '输入事件' ref_table = 'VBAK' ref_field = 'ERZET' )
( fieldname = 'ERNAM' coltext = '创建对象' ref_table = 'VBAK' ref_field = 'ERNAM' ) ).
* 创建ALV的FieldCatlog
gt_fieldcat_item = VALUE #(
( fieldname = 'VBELN' coltext = '销售凭证' ref_table = 'VBAP' ref_field = 'VBELN')
( fieldname = 'POSNR' coltext = '销售凭证行项目' ref_table = 'VBAP' ref_field = 'POSNR' )
( fieldname = 'MATNR' coltext = '物料编号' ref_table = 'VBAP' ref_field = 'MATNR' )
( fieldname = 'MATKL' coltext = '物料描述' ref_table = 'VBAP' ref_field = 'MATKL' ) ).
* 隐藏ALV功能按钮
PERFORM frm_build_exclude CHANGING gt_exclude.
* Head注册回车事件(用于屏幕有可编辑字段)
CALL METHOD go_grid_head->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
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.
go_grid_head->set_ready_for_input( ).
* Head ALV显示
CALL METHOD go_grid_head->set_table_for_first_display
EXPORTING
i_save = 'A'
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
CHANGING
it_fieldcatalog = gt_fieldcat_head
it_outtab = gt_output_head
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 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.
* Item注册注册回车事件(用于屏幕有可编辑字段)
CALL METHOD go_grid_item->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
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.
go_grid_item->set_ready_for_input( ).
* Item ALV显示
CALL METHOD go_grid_item->set_table_for_first_display
EXPORTING
i_save = 'A'
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
CHANGING
it_fieldcatalog = gt_fieldcat_item
it_outtab = gt_output_item
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 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.
ENDIF.
ENDMODULE.
MODULE exit_user_command INPUT.
CASE sy-ucomm.
WHEN '&CANCEL'.
LEAVE TO SCREEN 0.
WHEN '&EXIT'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
MODULE user_command_100 INPUT.
CASE sy-ucomm.
WHEN '&BACK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
FORM frm_build_exclude CHANGING ct_exclude TYPE ui_functions.
DATA: ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
APPEND ls_exclude TO ct_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_info.
APPEND ls_exclude TO ct_exclude.
ENDFORM.
3.最后来看一下效果吧
我们成功实现了上下分屏!但是呢!我们可以看到最上方有一条状态栏是多余的,这是我们设置的ZSTANDARD状态栏,因为要保留上方的退出功能,所以我们要设定此状态栏。
我们只需要把状态栏的所有按钮都删除就可以了。
最后再来看一下效果吧。可以看到,最上方的状态栏消失了。