ABAP--ALV_BLOCK_LIAST的函数使用样例

本文介绍了一种使用 ABAP 编程语言实现的 ALV 报表多块显示的方法。通过定义数据结构、获取字段目录、选择数据及调用 ALV 控制块初始化等步骤,实现了两组不同数据的并列展示。适用于 SAP 开发人员学习和参考。
REPORT z_alv_block_list.
* Type-pools
TYPE-POOLS: slis.
* Data declarations.
DATA: BEGIN OF t_vbak OCCURS 0,
        vbeln TYPE vbeln,
        bstnk TYPE vbak-bstnk,
        erdat TYPE vbak-erdat,
        kunnr TYPE vbak-kunnr,
      END OF t_vbak.
DATA: BEGIN OF t_vbap OCCURS 0,
        vbeln  TYPE vbeln,
        matnr  TYPE vbap-matnr,
        netpr  TYPE vbap-netpr,
        waerk  TYPE vbap-waerk,
        kwmeng TYPE vbap-kwmeng,
        meins  TYPE vbap-meins,
      END OF t_vbap.
DATA: t_fieldcatalog1 TYPE slis_t_fieldcat_alv.
DATA: t_fieldcatalog2 TYPE slis_t_fieldcat_alv.
DATA: v_repid         TYPE syrepid.
DATA: s_layout        TYPE slis_layout_alv.
DATA: v_tabname       TYPE slis_tabname.
DATA: t_events        TYPE slis_t_event.

* start-of-selection event.
START-OF-SELECTION.
  v_repid = sy-repid.
* Get the fieldcatalog for the first block
  PERFORM get_fieldcat1 CHANGING t_fieldcatalog1.
* Get the fieldcatalog for the second block
  PERFORM get_fieldcat2 CHANGING t_fieldcatalog2.
* Get the data for the first block
  SELECT vbeln bstnk erdat kunnr UP TO 10 ROWS
         INTO TABLE t_vbak
         FROM vbak WHERE vbeln > '0060000100'.
* Get the data for the second block
  SELECT vbeln matnr netpr waerk kwmeng meins UP TO 10 ROWS
         INTO TABLE t_vbap
         FROM vbap WHERE vbeln > '0060000100'.
* init
  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_INIT'
       EXPORTING
            i_callback_program = v_repid.

* First block
  v_tabname = 'ITAB1'.
  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
       EXPORTING
            is_layout   = s_layout
            it_fieldcat = t_fieldcatalog1
            i_tabname   = v_tabname
            it_events   = t_events
       TABLES
            t_outtab    = t_vbak.
* Second block
  v_tabname = 'ITAB2'.
  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
       EXPORTING
            is_layout   = s_layout
            it_fieldcat = t_fieldcatalog2
            i_tabname   = v_tabname
            it_events   = t_events
       TABLES
            t_outtab    = t_vbap.
*Display
  CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_DISPLAY'
            .
*---------------------------------------------------------------------*
*       FORM GET_FIELDCAT1                                            *
*---------------------------------------------------------------------*
*       Get the field catalog for the first block                     *
*---------------------------------------------------------------------*
FORM get_fieldcat1 CHANGING lt_fieldcatalog TYPE slis_t_fieldcat_alv.
  DATA: s_fieldcatalog TYPE slis_fieldcat_alv.
* Order number
  s_fieldcatalog-col_pos       = '1'.
  s_fieldcatalog-fieldname     = 'VBELN'.
  s_fieldcatalog-tabname       = 'T_VBAK'.
  s_fieldcatalog-ref_tabname   = 'VBAK'.
  s_fieldcatalog-ref_fieldname = 'VBELN'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Customer purchase order.
  s_fieldcatalog-col_pos       = '2'.
  s_fieldcatalog-fieldname     = 'BSTNK'.
  s_fieldcatalog-tabname       = 'T_VBAK'.
  s_fieldcatalog-ref_tabname   = 'VBAK'.
  s_fieldcatalog-ref_fieldname = 'BSTNK'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Creation date.
  s_fieldcatalog-col_pos       = '3'.
  s_fieldcatalog-fieldname     = 'ERDAT'.
  s_fieldcatalog-tabname       = 'T_VBAK'.
  s_fieldcatalog-ref_tabname   = 'VBAK'.
  s_fieldcatalog-ref_fieldname = 'ERDAT'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Customer
  s_fieldcatalog-col_pos       = '4'.
  s_fieldcatalog-fieldname     = 'KUNNR'.
  s_fieldcatalog-tabname       = 'T_VBAK'.
  s_fieldcatalog-ref_tabname   = 'VBAK'.
  s_fieldcatalog-ref_fieldname = 'KUNNR'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM GET_FIELDCAT2                                            *
*---------------------------------------------------------------------*
*       Get the field catalog for the second block                    *
*---------------------------------------------------------------------*
FORM get_fieldcat2 CHANGING lt_fieldcatalog TYPE slis_t_fieldcat_alv.
  DATA: s_fieldcatalog TYPE slis_fieldcat_alv.
* Order number
  s_fieldcatalog-col_pos       = '1'.
  s_fieldcatalog-fieldname     = 'VBELN'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'VBELN'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Material number
  s_fieldcatalog-col_pos       = '2'.
  s_fieldcatalog-fieldname     = 'MATNR'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'MATNR'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Net price
  s_fieldcatalog-col_pos       = '3'.
  s_fieldcatalog-fieldname     = 'NETPR'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'NETPR'.
  s_fieldcatalog-cfieldname    = 'WAERK'.
  s_fieldcatalog-ctabname      = 'T_VBAP'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Currency.
  s_fieldcatalog-col_pos       = '4'.
  s_fieldcatalog-fieldname     = 'WAERK'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'WAERK'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* Quantity
  s_fieldcatalog-col_pos       = '5'.
  s_fieldcatalog-fieldname     = 'KWMENG'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'KWMENG'.
  s_fieldcatalog-qfieldname    = 'MEINS'.
  s_fieldcatalog-qtabname      = 'T_VBAP'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
* UOM
  s_fieldcatalog-col_pos       = '6'.
  s_fieldcatalog-fieldname     = 'MEINS'.
  s_fieldcatalog-tabname       = 'T_VBAP'.
  s_fieldcatalog-ref_tabname   = 'VBAP'.
  s_fieldcatalog-ref_fieldname = 'MEINS'.
  APPEND s_fieldcatalog TO lt_fieldcatalog.
  CLEAR s_fieldcatalog.
ENDFORM.
运行结果:
 
**&---------------------------------------------------------------------* **& Report ZTEXT03 **&---------------------------------------------------------------------* **& **&---------------------------------------------------------------------* REPORT ztext03. TABLES :ZTSD040 , ZTSD032,MARC. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS : S_ZCHTZD FOR ZTSD040-ZCHTZD, S_ZXSZZ FOR ZTSD040-ZXSZZ, S_ZFXQD FOR ZTSD040-ZFXQD, S_ZSDF1 FOR ZTSD040-ZSDF1, S_ZSDF2 FOR ZTSD040-ZSDF2, S_ZCHRQ FOR ZTSD040-ZCHRQ, S_ZCJRQ FOR ZTSD040-ZCJRQ, S_ZGZZT FOR ZTSD040-ZGZZT, S_BUDAT FOR ZTSD040-ZCHRQ. PARAMETERS :P_1 AS CHECKBOX. SELECT-OPTIONS : S_WERKD FOR MARC-WERKS. PARAMETERS :P_2 AS CHECKBOX. SELECTION-SCREEN END OF BLOCK B1. * 全局变量定义 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 9000. **&---------------------------------------------------------------------* *& 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. 给gt_sbook创建按钮
最新发布
09-18
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值