前言
ZCL_ALV_MULTI是我封装 的一个 类 ,目的是使用较少代码实现在一个屏幕上显示多个ALV。
技术实现:1. 横向多页签显示利用了BUS框架
2\. ALV显示使用github开源库FALV(做了部分修改)
所有代码(含示例)在 我的GITHUB上,地址附在最后,需要的朋友欢迎下载、STAR.
接下来将通过几个示例代码来介绍下 ZCL_ALV_MULTI 的使用。
示例代码一
示例一:多ALV横向显示
*&---------------------------------------------------------------------**& Report ZDEMO_ALV_MULTI*&---------------------------------------------------------------------**& Horizontal TAB Layout*&---------------------------------------------------------------------*REPORT zdemo_alv_multi01.
START-OF-SELECTION. SELECT * FROM usr21 INTO TABLE @DATA(lt_usr21) UP TO 100 ROWS. SELECT * FROM adrc INTO TABLE @DATA(lt_adrc) UP TO 100 ROWS. SELECT * FROM kna1 INTO TABLE @DATA(lt_kna1) UP TO 100 ROWS. NEW zcl_alv_multi( iv_mode = zcl_alv_multi=>alv_mode-horizontal iv_title = 'MULTI ALV DEMO01' it_alvs = VALUE #( ( title = 'USR21' table = REF #( lt_usr21 ) ) ( title = 'ADRC' table = REF #( lt_adrc ) ) ( title = 'KNA1' table = REF #( lt_kna1 ) ) ) )->display( ).简单的调用NEW方法和DISPLAY方法就可以了,注意参数 iv_mode,
*
iv_mode = zcl_alv_multi=>alv_mode-horizontal它控制多个ALV以横向TAB页签显示
示例代码二
示例二:多ALV竖向显示
*&---------------------------------------------------------------------**& Report ZDEMO_ALV_MULTI*&---------------------------------------------------------------------**& vertical layout*&---------------------------------------------------------------------*REPORT zdemo_alv_multi02.
START-OF-SELECTION. SELECT * FROM adrc UP TO 100 ROWS INTO TABLE @DATA(lt_table). SELECT * FROM usr01 UP TO 100 ROWS INTO TABLE @DATA(lt_usr01). SELECT * FROM usr21 UP TO 100 ROWS INTO TABLE @DATA(lt_usr21). NEW zcl_alv_multi( iv_mode = zcl_alv_multi=>alv_mode-vertical iv_title = 'MULTI ALV DEMO02' it_alvs = VALUE #( ( title = 'ADRC' table = REF #( lt_table ) ) ( title = 'USR01' table = REF #( lt_usr01 ) ) ( title = 'USR21' table = REF #( lt_usr21 ) ) ) )->display( ).同示例一仅仅是 参数 iv_mode 的不同 ,
*
iv_mode = zcl_alv_multi=>alv_mode-vertical它控制多个ALV以竖向显示 。
示例代码三
示例三:隐藏列、修改列描述、隐藏Toolbar
*&---------------------------------------------------------------------**& Report ZDEMO_ALV_MULTI*&---------------------------------------------------------------------**& modify columns & hide alv toolbar*&---------------------------------------------------------------------*REPORT zdemo_alv_multi03.DATA: lo_alv_multi TYPE REF TO zcl_alv_multi, lo_falv TYPE REF TO zcl_falv.
START-OF-SELECTION. SELECT * FROM adrc UP TO 100 ROWS INTO TABLE @DATA(lt_table). SELECT * FROM usr01 UP TO 100 ROWS INTO TABLE @DATA(lt_usr01). SELECT * FROM usr21 UP TO 100 ROWS INTO TABLE @DATA(lt_usr21). lo_alv_multi = NEW zcl_alv_multi( iv_mode = zcl_alv_multi=>alv_mode-vertical iv_cb_before_show_alv = 'FRM_BEFORE_SHOW_ALV1' iv_title = 'MULTI ALV DEMO03' it_alvs = VALUE #( ( title = 'ADRC' it_hide = VALUE #( ( fieldname = 'CLIENT' ) ( fieldname = 'NATION' ) ) it_text = VALUE #( ( fieldname = 'ADDRNUMBER' text = 'ADDRESS NUMBER') ) table = REF #( lt_table ) ) ( title = 'USR01' table = REF #( lt_usr01 ) ) ( title = 'USR21' table = REF #( lt_usr21 ) ) ) ). lo_alv_multi->display( ).
FORM frm_before_show_alv1 USING is_alvs TYPE zcl_alv_multi=>ty_alvs. TRY. CASE is_alvs-index. WHEN 1.* is_alvs-falv->column( 'CLIENT' )->set_tech( abap_true ).* is_alvs-falv->column( 'NATION' )->set_tech( abap_true ).* is_alvs-falv->column( 'ADDRNUMBER' )->set_text( 'ADDRESS' ). is_alvs-falv->layout->set_no_toolbar( abap_true ). WHEN 2. is_alvs-falv->column( 'MANDT' )->set_tech( abap_true ). WHEN 3. is_alvs-falv->column( 'MANDT' )->set_tech( abap_true ). ENDCASE. CATCH cx_root. ENDTRY.ENDFORM.隐藏了所有ALV的"MANDT"列,修改了第一个ALV ADDRNUMBER 列的显示名称, 隐藏了第一个ALV的Toolbar状态栏。
iv_cb_before_sh ow_alv 参数给出了在ALV显示之前执行的回调FORM,在回调FORM中可调用FALV的各种方法。
示例代码四
示例四:单击hotspot、自定义按钮事件
*&---------------------------------------------------------------------**& Report ZDEMO_ALV_MULTI*&---------------------------------------------------------------------**& add custom button*&---------------------------------------------------------------------*REPORT zdemo_alv_multi04.DATA: lo_alv_multi TYPE REF TO zcl_alv_multi, lo_falv TYPE REF TO zcl_falv.DATA: gt_adrc TYPE STANDARD TABLE OF adrc.DATA: gt_usr01 TYPE STANDARD TABLE OF usr01.DATA: gt_usr21 TYPE STANDARD TABLE OF usr21.
START-OF-SELECTION. SELECT * FROM adrc UP TO 100 ROWS INTO TABLE @gt_adrc. SELECT * FROM usr01 UP TO 100 ROWS INTO TABLE @gt_usr01. SELECT * FROM usr21 UP TO 100 ROWS INTO TABLE @gt_usr21. lo_alv_multi = NEW zcl_alv_multi( iv_mode = zcl_alv_multi=>alv_mode-vertical* iv_before_show_alv_callback = 'FRM_BEFORE_SHOW_ALV1' iv_title = 'MULTI ALV DEMO04' it_events = VALUE #( ( name = zcl_alv_multi=>events-before_show_alv form = 'FRM_BEFORE_SHOW_ALV1' ) ( name = zcl_falv=>events-hotspot_click form = 'FRM_HOTSPOT_CLICK1' ) ( name = zcl_falv=>events-user_command form = 'FRM_USER_COMMAND1' ) ) it_alvs = VALUE #( ( title = 'ADRC' table = REF #( gt_adrc ) ) ( title = 'USR01' table = REF #( gt_usr01 ) ) ( title = 'USR21' table = REF #( gt_usr21 ) ) ) ). lo_alv_multi->display( ).
FORM frm_before_show_alv1 USING is_alvs TYPE zcl_alv_multi=>ty_alvs. TRY. CASE is_alvs-index. WHEN 1. is_alvs-falv->column( 'CLIENT' )->set_tech( abap_true ). is_alvs-falv->column( 'NATION' )->set_tech( abap_true ). is_alvs-falv->column( 'ADDRNUMBER' )->set_text( 'ADDRESS' )->set_hotspot( abap_true ). is_alvs-falv->layout->set_sel_mode( 'A' ). is_alvs-falv->add_button( EXPORTING iv_function = 'POST' iv_icon = icon_checked* IV_QUICKINFO =* IV_BUTN_TYPE =* IV_DISABLED = iv_text = 'POST'* IV_CHECKED = ). WHEN 2. is_alvs-falv->column( 'MANDT' )->set_tech( abap_true ). is_alvs-falv->column( 'BNAME' )->set_hotspot( abap_true ). WHEN 3. is_alvs-falv->column( 'MANDT' )->set_tech( abap_true ). is_alvs-falv->column( 'BNAME' )->set_hotspot( abap_true ). ENDCASE. CATCH cx_root. ENDTRY.ENDFORM.
FORM frm_user_command1 USING sender TYPE REF TO zcl_falv p_ucomm TYPE sy-ucomm. DATA: lt_rows TYPE lvc_t_row. CASE p_ucomm. WHEN 'POST'. sender->get_selected_rows( IMPORTING et_index_rows = lt_rows ). IF lt_rows[] IS INITIAL. MESSAGE 'NO SELECTED ROWS' TYPE 'S' DISPLAY LIKE 'E'. ELSE. READ TABLE lt_rows INTO DATA(l_row) INDEX 1. READ TABLE gt_adrc INTO DATA(ls_adrc) INDEX l_row. MESSAGE |POST-{ ls_adrc-addrnumber }-{ ls_adrc-date_from }| TYPE 'I'. ENDIF. ENDCASE.ENDFORM.
FORM frm_hotspot_click1 USING sender TYPE REF TO zcl_falv e_row_id TYPE lvc_s_row e_column_id TYPE lvc_s_col es_row_no TYPE lvc_s_roid. TRY. CASE lo_alv_multi->get_alv_index( sender ). WHEN 1. READ TABLE gt_adrc INTO DATA(gs_adrc) INDEX e_row_id-index. CHECK sy-subrc = 0. CASE e_column_id-fieldname . WHEN 'ADDRNUMBER' . MESSAGE |CLICK ROW { e_row_id-index }-{ gs_adrc-addrnumber }| TYPE 'I'. ENDCASE. WHEN 2. READ TABLE gt_usr01 INTO DATA(gs_usr01) INDEX e_row_id. CHECK sy-subrc = 0. CASE e_column_id-fieldname . WHEN 'BNAME' . MESSAGE |CLICK ROW { e_row_id-index }-{ gs_usr01-bname }| TYPE 'I'. ENDCASE. WHEN 3. READ TABLE gt_usr21 INTO DATA(gs_usr21) INDEX e_row_id. CHECK sy-subrc = 0. CASE e_column_...