SAP ABAP 屏幕中创建多个alv

屏幕中创建多个OOALV,并设置各自的状态栏,命令控制等。

发布日期:2024/07/16

案例:创建一个报表程序展示销售订单信息。上半屏幕展示销售订单抬头信息,下半屏幕展示销售订单明细信息。

  1. 使用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.
  1. 主程序代码如下,我详细注解了每一步操作。主要过程是,先创建一个容器,再将容器分割给为上下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状态栏,因为要保留上方的退出功能,所以我们要设定此状态栏。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b9f541f0944f47be83fe837974d3c0fd.p

我们只需要把状态栏的所有按钮都删除就可以了。
在这里插入图片描述

最后再来看一下效果吧。可以看到,最上方的状态栏消失了。
在这里插入图片描述

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值