业务背景:用户想实现在一个界面上同时显示两个ALV报表,同时双击第一个ALV报表某一行信息的时候,可以下钻带出第二个ALV报表信息
实现步骤:
- 创建自定义屏幕Screen 9000,在屏幕上话一个container容器
- 分别对两个ALV定义fieldcat
- 在container容器上拆分成多个ALV然后进行展示
其中还有包含在OO ALV单击事件以及双击事件的处理方法,详细内容可以参考以下代码:
*&---------------------------------------------------------------------*
*& Report ZWMR312
*&
*&---------------------------------------------------------------------*
*&
*&MIGO发料过账传MES重发平台
*&---------------------------------------------------------------------*
REPORT zwmr312.
TABLES: resb,
mkpf,
ztwm321_h.
TYPES: BEGIN OF gty_alv1,
checkbox TYPE c, "复选框
werks TYPE ztwm321_h-werks, "工厂
rsnum TYPE ztwm321_h-rsnum, "预留
rspos TYPE ztwm321_h-rspos, "行项目
mblnr TYPE ztwm321_h-mblnr, "物料凭证
mjahr TYPE ztwm321_h-mjahr, "年
zeile TYPE ztwm321_h-zeile, "行项目
budat TYPE ztwm321_h-budat, "过帐日期
umlgo TYPE ztwm321_h-umlgo, "接收地库存地点
lgort TYPE ztwm321_h-lgort, "发送库存地点
matnr TYPE ztwm321_h-matnr, "物料
menge TYPE ztwm321_h-menge, "数量
charg TYPE ztwm321_h-charg, "批次
bwart TYPE ztwm321_h-bwart, "移动类型
zztype TYPE ztwm321_h-zztype, "消息类型
zzmessage TYPE ztwm321_h-zzmessage, "消息
END OF gty_alv1,
BEGIN OF gty_alv2,
werks TYPE ztwm321_i-werks, "工厂
rsnum TYPE ztwm321_i-rsnum, "预留
rspos TYPE ztwm321_i-rspos, "行项目
mblnr TYPE ztwm321_i-mblnr, "物料凭证
mjahr TYPE ztwm321_i-mjahr, "年
zeile TYPE ztwm321_i-zeile, "行项目
sernr TYPE ztwm321_i-sernr, "序列号
END OF gty_alv2.
DATA: gt_alv1 TYPE TABLE OF gty_alv1,
gs_alv1 TYPE gty_alv1,
gt_alv2 TYPE TABLE OF gty_alv2,
gs_alv2 TYPE gty_alv2,
gt_fieldcat TYPE TABLE OF slis_fieldcat_alv,
gs_fieldcat TYPE slis_fieldcat_alv,
gs_layout TYPE slis_layout_alv,
gt_fcat1 TYPE lvc_t_fcat,
gs_fcat1 TYPE lvc_s_fcat,
gt_fcat2 TYPE lvc_t_fcat,
gs_fcat2 TYPE lvc_s_fcat,
g_repid LIKE sy-repid,
ok_code LIKE sy-ucomm,
custom_cont TYPE REF TO cl_gui_custom_container,
splitter TYPE REF TO cl_gui_splitter_container,
grid_result1 TYPE REF TO cl_gui_alv_grid,
grid_result2 TYPE REF TO cl_gui_alv_grid,
gs_layout1 TYPE lvc_s_layo,
gs_layout2 TYPE lvc_s_layo,
gt_sort1 TYPE lvc_t_sort,
gt_sort2 TYPE lvc_t_sort.
*--------------------------------------------------------------------*
*Class define
*--------------------------------------------------------------------*
CLASS cl_event_receiver DEFINITION.
PUBLIC SECTION.
* PROTECTED SECTION.
" 双击事件
METHODS handle_double_click1
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
"单击事件
METHODS handle_cell_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING
e_row_id
e_column_id
es_row_no.
ENDCLASS. "cl_event_receiver DEFINITION
*--------------------------------------------------------------------*
*Class implement
*--------------------------------------------------------------------*
CLASS cl_event_receiver IMPLEMENTATION.
METHOD handle_double_click1.
DATA: lt_item TYPE TABLE OF ztwm321_i,
ls_item TYPE ztwm321_i,
ls_stbl TYPE lvc_s_stbl.
CLEAR: lt_item,
ls_item.
CLEAR: gs_alv1.
READ TABLE gt_alv1 INTO gs_alv1 INDEX e_row-index.
IF sy-subrc = 0.
SELECT * INTO TABLE lt_item
FROM ztwm321_i
WHERE werks = gs_alv1-werks
AND rsnum = gs_alv1-rsnum
AND rspos = gs_alv1-rspos
AND mblnr = gs_alv1-mblnr
AND mjahr = gs_alv1-mjahr
AND zeile = gs_alv1-zeile.
CLEAR: gt_alv2,
gs_alv2.
LOOP AT lt_item INTO ls_item.
MOVE-CORRESPONDING ls_item TO gs_alv2.
APPEND gs_alv2 TO gt_alv2.
CLEAR: gs_alv2.
ENDLOOP.
ENDIF.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
"ALV 控制:刷新稳定性 按行刷新,可选参数
CLEAR ls_stbl.
"稳定刷新,保持滚动条位置
ls_stbl-row = ls_stbl-col = 'X'.
"刷新
* CALL METHOD grid_result1->refresh_table_display
* EXPORTING
* is_stable = ls_stbl
* i_soft_refresh = 'X'.
CALL METHOD grid_result2->refresh_table_display
EXPORTING
is_stable = ls_stbl
i_soft_refresh = 'X'.
"提交
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD. "handle_double_click
METHOD handle_cell_click.
"获取单击字段
DATA: l_msg TYPE string,
l_row TYPE string,
l_field TYPE string,
ls_stbl TYPE lvc_s_stbl.
FIELD-SYMBOLS: <lfs_alv1> TYPE gty_alv1.
l_row = es_row_no-row_id. "选中行
l_field = e_column_id. "选中的字段
READ TABLE gt_alv1 ASSIGNING <lfs_alv1> INDEX es_row_no-row_id.
IF sy-subrc = 0.
"得到所单击值
IF <lfs_alv1>-checkbox = 'X'.
<lfs_alv1>-checkbox = ''.
ELSE.
<lfs_alv1>-checkbox = 'X'.
ENDIF.
ENDIF.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
"ALV 控制:刷新稳定性 按行刷新,可选参数
CLEAR ls_stbl.
"稳定刷新,保持滚动条位置
ls_stbl-row = ls_stbl-col = 'X'.
"刷新
CALL METHOD grid_result1->refresh_table_display
EXPORTING
is_stable = ls_stbl
i_soft_refresh = 'X'.
* CALL METHOD grid_result2->refresh_table_display
* EXPORTING
* is_stable = ls_stbl
* i_soft_refresh = 'X'.
"提交
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD. "handle_cell_click
ENDCLASS. "cl_event_receiver IMPLEMENTATION
DATA: event_receiver TYPE REF TO cl_event_receiver.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_werks FOR resb-werks NO INTERVALS OBLIGATORY, "工厂
s_rsnum FOR resb-rsnum, "预留单
s_lgort FOR resb-lgort, "发货库存地点
s_umlgo FOR resb-umlgo, "收货库存地点
s_budat FOR mkpf-budat OBLIGATORY, "过帐日期
s_bwart FOR resb-bwart NO INTERVALS, "移动类型
s_typ FOR ztwm321_h-zztype DEFAULT 'E'. "消息类型
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
PERFORM frm_init.
AT SELECTION-SCREEN.
START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_init_fcat.
END-OF-SELECTION.
CALL SCREEN 9000.
*&---------------------------------------------------------------------*
*& Form FRM_INIT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init .
CLEAR: gt_alv1,
gs_alv1,
gt_alv2,
gs_alv2,
gt_fieldcat,
gs_fieldcat,
gs_layout,
gt_fcat1,
gs_fcat1,
gt_fcat2,
gs_fcat2
.
ENDFORM. " FRM_INIT
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_data .
DATA: lt_data_h TYPE TABLE OF ztwm321_h,
ls_data_h TYPE ztwm321_h,
lt_data_i TYPE TABLE OF ztwm321_i,
ls_data_i TYPE ztwm321_i.
CLEAR: lt_data_h,
ls_data_h,
lt_data_i,
ls_data_i.
SELECT * INTO TABLE lt_data_h
FROM ztwm321_h
WHERE werks IN s_werks
AND rsnum IN s_rsnum
AND lgort IN s_lgort
AND umlgo IN s_umlgo
AND budat IN s_budat
AND bwart IN s_bwart
AND zztype IN s_typ.
LOOP AT lt_data_h INTO ls_data_h.
MOVE-CORRESPONDING ls_data_h TO gs_alv1.
APPEND gs_alv1 TO gt_alv1.
CLEAR: ls_data_h, gs_alv1.
ENDLOOP.
ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_INIT_FCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_fcat .
PERFORM sub_init_fcat_result1.
PERFORM sub_init_fcat_result2.
ENDFORM. " FRM_INIT_FCAT
*&---------------------------------------------------------------------*
*& Form SUB_INIT_FCAT_RESULT1
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM sub_init_fcat_result1 .
CLEAR: gt_fcat1,
gs_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'CHECKBOX'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '复选框'.
gs_fcat1-hotspot = 'X'.
gs_fcat1-checkbox = 'X'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'WERKS'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '工厂'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'RSNUM'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '预留'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'RSPOS'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '行项目'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'MBLNR'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '物料凭证'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'MJAHR'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '年'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'ZEILE'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '行项目'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'BUDAT'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '过帐日期'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'UMLGO'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '接收地库存地点'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'LGORT'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '发送库存地点'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'MATNR'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '物料'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'MENGE'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '数量'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'CHARG'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '批次'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'BWART'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '移动类型'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'ZZTYPE'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '消息类型'.
APPEND gs_fcat1 TO gt_fcat1.
CLEAR gs_fcat1.
gs_fcat1-fieldname = 'ZZMESSAGE'.
gs_fcat1-tabname = 'GT_ALV1'.
gs_fcat1-coltext = '消息'.
APPEND gs_fcat1 TO gt_fcat1.
ENDFORM. " SUB_INIT_FCAT_RESULT1
*&---------------------------------------------------------------------*
*& Form SUB_INIT_FCAT_RESULT2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM sub_init_fcat_result2 .
CLEAR gs_fcat2.
gs_fcat2-fieldname = 'WERKS'.
gs_fcat2-tabname = 'GT_ALV2'.
gs_fcat2-coltext = '工厂'.
APPEND gs_fcat2 TO gt_fcat2.
CLEAR gs_fcat2.
gs_fcat2-fieldname = 'RSNUM'.
gs_fcat2-tabname = 'GT_ALV2'.
gs_fcat2-coltext = '预留'.
APPEND gs_fcat2 TO gt_fcat2.
CLEAR gs_fcat2.
gs_fcat2-fieldname = 'RSPOS'.
gs_fcat2-tabname = 'GT_ALV2'.
gs_fcat2-coltext = '行项目'.
APPEND gs_fcat2 TO gt_fcat2.
CLEAR gs_fcat2.
gs_fcat2-fieldname = 'MBLNR'.
gs_fcat2-tabname = 'GT_ALV2'.
gs_fcat2-coltext = '物料凭证'.
APPEND gs_fcat2 TO gt_fcat2.
CLEAR gs_fcat2.
gs_fcat2-fieldname = 'MJAHR'.
gs_fcat2-tabname = 'GT_ALV2'.
gs_fcat2-coltext = '年'.
APPEND gs_fcat2 TO gt_fcat2.
CLEAR gs_fcat2.
gs_fcat2-fieldname = 'ZEILE'.
gs_fcat2-tabname = 'GT_ALV2'.
gs_fcat2-coltext = '行项目'.
APPEND gs_fcat2 TO gt_fcat2.
CLEAR gs_fcat2.
gs_fcat2-fieldname = 'SERNR'.
gs_fcat2-tabname = 'GT_ALV2'.
gs_fcat2-coltext = '序列号'.
APPEND gs_fcat2 TO gt_fcat2.
ENDFORM. " SUB_INIT_FCAT_RESULT2
*&---------------------------------------------------------------------*
*& Module PBO_9000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE pbo_9000 OUTPUT.
SET PF-STATUS '0100'.
g_repid = sy-repid.
PERFORM sub_cr_alv_result.
ENDMODULE. " PBO_9000 OUTPUT
*&---------------------------------------------------------------------*
*& Module PAI_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE pai_9000 INPUT.
CASE ok_code.
WHEN 'SAVE'.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
PERFORM sub_exit.
WHEN '&RESEND'. "重新发送MES
PERFORM frm_resend_mes.
ENDCASE.
CLEAR ok_code.
ENDMODULE. " PAI_9000 INPUT
*&---------------------------------------------------------------------*
*& Form SUB_EXIT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM sub_exit .
PERFORM unlock_all.
LEAVE TO SCREEN 0.
ENDFORM. " SUB_EXIT
*&---------------------------------------------------------------------*
*& Form UNLOCK_ALL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM unlock_all .
CALL FUNCTION 'DEQUEUE_ALL'.
ENDFORM. " UNLOCK_ALL
*&---------------------------------------------------------------------*
*& Form SUB_CR_ALV_RESULT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM sub_cr_alv_result .
DATA: result_cont1 TYPE REF TO cl_gui_container,
result_cont2 TYPE REF TO cl_gui_container,
ref_grid TYPE REF TO cl_gui_alv_grid,
ls_stbl TYPE lvc_s_stbl.
IF custom_cont IS INITIAL.
CREATE OBJECT custom_cont
EXPORTING
container_name = 'CONT1'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
IF sy-subrc NE 0.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = g_repid
txt2 = sy-subrc
txt1 = 'The control could not be created'(510).
ENDIF.
CREATE OBJECT splitter
EXPORTING
parent = custom_cont
rows = 2
columns = 1.
CALL METHOD splitter->get_container " HPC
EXPORTING
row = 1
column = 1
RECEIVING
container = result_cont1.
CREATE OBJECT grid_result1
EXPORTING
i_parent = result_cont1.
gs_layout1-cwidth_opt = 'X'.
gs_layout1-zebra = 'X'.
CREATE OBJECT event_receiver.
* 注册事件handler方法
" 双击某一单元格事件
SET HANDLER event_receiver->handle_double_click1 FOR grid_result1.
" 单击某一单元格事件
SET HANDLER event_receiver->handle_cell_click FOR grid_result1.
CALL METHOD grid_result1->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD grid_result1->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
CALL METHOD grid_result1->set_table_for_first_display
EXPORTING
i_structure_name = 'GT_ALV1'
is_layout = gs_layout1
CHANGING
it_outtab = gt_alv1[]
it_fieldcatalog = gt_fcat1[]
it_sort = gt_sort1[].
* CALL METHOD grid_result1->register_edit_event
* EXPORTING
* i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD splitter->get_container " HPC
EXPORTING
row = 2
column = 1
RECEIVING
container = result_cont2.
CREATE OBJECT grid_result2
EXPORTING
i_parent = result_cont2.
gs_layout2-cwidth_opt = 'X'.
gs_layout2-zebra = 'X'.
CALL METHOD grid_result2->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD grid_result2->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
CALL METHOD grid_result2->set_table_for_first_display
EXPORTING
i_structure_name = 'GT_ALV2'
is_layout = gs_layout2
CHANGING
it_outtab = gt_alv2[]
it_fieldcatalog = gt_fcat2[]
it_sort = gt_sort2[].
* CALL METHOD grid_result2->register_edit_event
* EXPORTING
* i_event_id = cl_gui_alv_grid=>mc_evt_modified.
ELSE.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
"ALV 控制:刷新稳定性 按行刷新,可选参数
CLEAR ls_stbl.
"稳定刷新,保持滚动条位置
ls_stbl-row = ls_stbl-col = 'X'.
"刷新
CALL METHOD grid_result1->refresh_table_display
EXPORTING
is_stable = ls_stbl
i_soft_refresh = 'X'.
CALL METHOD grid_result2->refresh_table_display
EXPORTING
is_stable = ls_stbl
i_soft_refresh = 'X'.
"提交
CALL METHOD cl_gui_cfw=>flush.
ENDIF.
ENDFORM. " SUB_CR_ALV_RESULT
*&---------------------------------------------------------------------*
*& Form FRM_RESEND_MES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_resend_mes .
"重新发送MES
LOOP AT gt_alv1 INTO gs_alv1 WHERE checkbox = 'X'.
ENDLOOP.
ENDFORM. " FRM_RESEND_MES
实现出来效果图:
备注:关于一些OO ALV 自定义触发事件,可以参考以下地址: