OO ALV Eample

文章介绍了如何在ABAPGUI中使用CL_GUI_ALV_GRID_EXT扩展类创建一个带有定义按钮、导航功能和隐藏列的报表,并展示了事件处理方法,如处理toolbar和user_command事件。

1 Introduciton

we copy the code from DEMO_GUI_ALV_GRID_EXT. I add the define button .

2 Code

*&---------------------------------------------------------------------*
*& Report ZJGLTEST07
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zjgltest07.
TABLES : sbook.
*&---------------------------------------------------------------------*
*& Report  DEMO_GUI_ALV_GRID_EXT
*&
*&---------------------------------------------------------------------*
*& this is an example report, how to use the PP extension class
*& CL_GUI_ALV_GRID_EXT that is based on CL_GUI_ALV_GRIDhas same
*& additional functions like: fast kernel BADI, Navigation profile,
*& and hide empty columns
*&---------------------------------------------------------------------*


TYPES: BEGIN OF ty_outtab,
        sel.
        INCLUDE STRUCTURE  sbook .
TYPES  END OF ty_outtab .

DATA: gw_outtab    TYPE  ty_outtab,
      gt_outtab    TYPE TABLE OF  ty_outtab.

*data: gt_outtab   type TABLE OF sbook.

data: gt_okcode    TYPE navp_t_okcode,
      go_grid      TYPE REF TO cl_gui_alv_grid_ext,
      go_container TYPE REF TO cl_gui_custom_container,
      okcode       TYPE sy-ucomm.

*&---------------------------------------------------------------------*
*&       Class LCL_EVENTHANDLER
*&---------------------------------------------------------------------*
*        eventhandler
*----------------------------------------------------------------------*
CLASS lcl_eventhandler DEFINITION FINAL.
  PUBLIC SECTION.
    CLASS-METHODS:
      on_toolbar FOR EVENT toolbar OF cl_gui_alv_grid_ext
        IMPORTING e_object,

      on_user_command FOR EVENT user_command OF cl_gui_alv_grid_ext
        IMPORTING e_ucomm.
ENDCLASS.                    "lcl_eventhandler DEFINITION


*----------------------------------------------------------------------*
*       CLASS lcl_eventhandler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_eventhandler IMPLEMENTATION.
  METHOD on_user_command.
    DATA: lt_rows   TYPE lvc_t_row,
          ls_rows   LIKE LINE OF lt_rows,
          ls_outtab LIKE LINE OF gt_outtab.

    CASE e_ucomm.
      WHEN 'ANWENDUNG'.
        CALL METHOD go_grid->get_selected_rows
          IMPORTING
            et_index_rows = lt_rows.
        IF NOT lt_rows IS INITIAL.
          LOOP AT lt_rows INTO ls_rows.
*           fill gt_selected_rows.
            READ TABLE gt_outtab INDEX ls_rows-index INTO ls_outtab.
            ls_outtab-forcuram = 4000.
            MODIFY gt_outtab FROM ls_outtab INDEX ls_rows-index.
          ENDLOOP.
          go_grid->refresh_table_display( ).
        ENDIF.
    ENDCASE.
  ENDMETHOD.                    "on_user_command
  METHOD on_toolbar.

    DATA: l_toolbar LIKE LINE OF e_object->mt_toolbar.

*   DEMO: change current line
    READ TABLE e_object->mt_toolbar WITH KEY function = 'ANWENDUNG'
    TRANSPORTING NO FIELDS.
    IF sy-subrc <> 0.
      l_toolbar-function   = 'ANWENDUNG'.
      l_toolbar-icon       = icon_price.
      l_toolbar-quickinfo  = ' 4000'.
      l_toolbar-disabled   = space.
      APPEND l_toolbar TO e_object->mt_toolbar.
    ENDIF.
    CLEAR l_toolbar.
  ENDMETHOD.                    "on_toolbar

ENDCLASS.                    "lcl_eventhandler IMPLEMENTATION

*PARAMETERS:
*  p_no_nav TYPE char1    DEFAULT space AS CHECKBOX,
*  p_ext_na TYPE char1    DEFAULT 'X'   AS CHECKBOX,
*  p_hid_em TYPE char1    DEFAULT 'X'   AS CHECKBOX.

SELECT-OPTIONS:s_carrid  FOR sbook-carrid DEFAULT 'AA'.

AT SELECTION-SCREEN OUTPUT.

START-OF-SELECTION.
  CALL SCREEN 0100.

*---------------------------------------------------------------------*
*  MODULE STATUS_0100 OUTPUT
*---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS '001'.
  SET TITLEBAR  '001'.
ENDMODULE.                 " STATUS_0100  OUTPUT

*---------------------------------------------------------------------*
*  MODULE pbo_0100 OUTPUT
*---------------------------------------------------------------------*
MODULE pbo_0100 OUTPUT.
  IF go_grid IS NOT BOUND.
    PERFORM pbo_0100.
  ENDIF.
ENDMODULE.                 " pbo_0100  OUTPUT

*---------------------------------------------------------------------*
*  MODULE user_command_0100 INPUT
*---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  okcode  =  sy-ucomm .
  CASE okcode.
    WHEN 'BACK'
      OR 'EXIT'
      OR 'CANCEL'.
      SET SCREEN 0.
      LEAVE SCREEN.
    WHEN 'REFRESH'.
      PERFORM data_select.
      go_grid->refresh_table_display( ).
    WHEN 'GEN'.
  ENDCASE.

  CLEAR okcode.
ENDMODULE.                 " USER_COMMAND_0100  INPUT


*&--------------------------------------------------------------------*
*&      Form  pbo_0100
*&--------------------------------------------------------------------*
FORM pbo_0100 .
  DATA: ls_variant TYPE disvariant,
        ls_layout  TYPE lvc_s_layo.

  PERFORM data_select.

* create new container for main screen
  CREATE OBJECT go_container
    EXPORTING
      container_name = 'CONTROL1'.

* create and initialize ALV display
  CREATE OBJECT go_grid
    EXPORTING
      i_parent = go_container
    EXCEPTIONS
      OTHERS   = 1.

* hide all visible emtpty columns at first display:
*  go_grid->set_hide_empty_columns( EXPORTING
*                                   iv_hide_empty_columns = p_hid_em ).

* init navigation profile ?
*  IF p_no_nav = 'X'.
*    go_grid->set_navigation_profile( EXPORTING
*                                          iv_navp_on = space ).
*  ELSE.
*  navigation profile activ -> add EXT function to navigation profile?
*    go_grid->set_okcode_table( EXPORTING it_okcode = gt_okcode
*                                        iv_ext_functions = p_ext_na ).
*  ENDIF.

  SET HANDLER lcl_eventhandler=>on_toolbar FOR go_grid.
*  SET HANDLER lcl_eventhandler=>on_context_menu FOR go_grid.
  SET HANDLER lcl_eventhandler=>on_user_command FOR go_grid.

* needed for BADI, without that no badi will activated!
  ls_variant-report   = sy-repid.

* set grid title
  ls_layout-grid_title = sy-title.
  ls_layout-smalltitle = 'X'.
* call ALV
  go_grid->W(
    EXPORTING
      is_variant       = ls_variant
      i_save           = 'A'
      is_layout        = ls_layout
      i_structure_name =  'SBOOK'
    CHANGING
      it_outtab        = gt_outtab
    EXCEPTIONS
      OTHERS           = 1 ).

ENDFORM.                                                    " pbo_0100
*&---------------------------------------------------------------------*
*&      Form  data_select
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM data_select.
* select data
  SELECT * FROM sbook INTO CORRESPONDING FIELDS OF TABLE gt_outtab
    WHERE carrid  in s_carrid .
                                        "#EC CI_NOWHERE

  IF gt_outtab IS INITIAL.
    MESSAGE i888(navigation_profile)
            WITH 'NO TEST DATA!' 'GENERATE'
                 'WITH REPORT' 'FLIGHT_MODEL_DATA_GENERATOR'.
    LEAVE TO SCREEN 0.
  ENDIF.
ENDFORM.                    "data_select

3 Summary

We call ‘set_table_for_first_display’ . I don’t know how to deal with the i_structure_name . Becasue we define internal table. In general I don’t use standard table.

12-09
### OO ALV 介绍 OO ALV 也被称为面向对象的 ALV(ABAP List Viewer)。它比传统的函数式 ALV(FUNALV)强大很多,虽然刚开始上手可能不习惯且代码量看起来比较臃肿,但实际比较模块化,易于维护。其优势包括灵活的事件处理、分屏显示多个 ALV、定制化更高、性能更好等,通过面向对象的设计,提高了代码的可维护性、灵活性和性能,是 ABAP 开发中非常重要的技能。ALV 具备排序数据、过滤数据、变更列宽、变更布局、下载 Excel 等文档的功能。ALV 的类型有 Function ALVOOALV、SALV、SALV IDA [^1][^2]。 ### OO ALV 使用方法 1. **定义内表**:定义显示在 ALV 画面上的内表,用于存储显示数据。 2. **创建屏幕、容器和 Grid 对象**:创建 SAP 容器及容器对象,此处传入的容器参数 PARENT 参照 CL_GUI_CONTAINER 类,传入的容器对象可以是 G_CONTAINER_9000 或 G_CONTAINER_9001,因为 CL_GUI_CUSTOM_CONTAINER 和 CL_GUI_DOCKING_CONTAINER 都是继承了 CL_GUI_CONTAINER 类 [^2][^3]。 3. **设置画面的字段目录** 4. **输出内表中的数据** ### 相关技术资料 在 ABAP 开发中,官方的 SAP 开发文档是很好的学习资源,其中详细介绍了 OO ALV 的各类、方法及使用示例。同时,一些专业的 ABAP 开发论坛和社区,也会有开发者分享 OO ALV 的使用经验和技巧。 以下是一个简单的 ABAP 代码示例,用于创建一个基本的 OO ALV: ```abap REPORT z_ooalv_demo. TABLES: mara. DATA: gt_data TYPE TABLE OF mara, gs_layout TYPE lvc_s_layo, go_alv TYPE REF TO cl_gui_alv_grid. SELECT * FROM mara INTO CORRESPONDING FIELDS OF TABLE gt_data. CREATE OBJECT go_alv EXPORTING i_parent = cl_gui_container=>screen0. gs_layout-zebra = 'X'. CALL METHOD go_alv->set_table_for_first_display EXPORTING i_structure_name = 'MARA' is_layout = gs_layout CHANGING it_outtab = gt_data. ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值