天天看点

SAP:OOALV实例

首先看OOALV与FMALV的区别:

1、OO ALV的屏幕需要自己创建生成,FM ALV的屏幕已经包含在函数中;

2、OO ALV更灵活,通过类的方法对ALV执行操作,比如,一个屏幕可以放多个ALV,而FM ALV不能;

3、OO ALV更安全,增加显示效果,比如刷新稳定性;

4、OO ALV能实现在显示列表的页脚或者边上显示LOGO,而FM不能;

5、类可实例化,而函数组不能(对象是类的实例,而函数不是函数组的实例)。

实例:

*&---------------------------------------------------------------------*
*& Report Z_ZHANGM_018
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_zhangm_018.

DATA:
  wcl_container TYPE REF TO cl_gui_custom_container,      "存放ALV的容器
  wcl_alv       TYPE REF TO cl_gui_alv_grid ,                      "ALV的网格
  gt_fieldcat   TYPE lvc_t_fcat ,                              "存放字段目录的内表
  gs_layout     TYPE lvc_s_layo .                               "布局结构

DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE sflight .
DATA END OF gt_list .
DATA:ok_code LIKE sy-ucomm.  "按钮事件
DATA:save_ok LIKE sy-ucomm.


CALL SCREEN '0100'.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS_100'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module DISPLAY_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE display_alv OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
  PERFORM display_alv .

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'BACK'.
      LEAVE PROGRAM.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM display_alv .
  IF  wcl_alv IS INITIAL .
    CREATE OBJECT wcl_container    "创建容器
      EXPORTING
        container_name = 'WCL_CONTAINER'.  "屏幕上的定制控制名字,大写
    IF wcl_container IS NOT INITIAL.
      CREATE OBJECT wcl_alv         "创建ALV实例
        EXPORTING
          i_parent = wcl_container.  "父节点:容器
    ENDIF.

*获取字段目录
    PERFORM prepare_field_catalog CHANGING gt_fieldcat .
*获取样式
    PERFORM prepare_layout CHANGING gs_layout .
*获取需要显示的数据
    PERFORM get_data TABLES gt_list.
*-----显示ALV-------------------------------------------(详细的用法在最后附录)
    CALL METHOD wcl_alv->set_table_for_first_display
      EXPORTING
*       I_BUFFER_ACTIVE               =
*       I_CONSISTENCY_CHECK           =
*       I_STRUCTURE_NAME              =
*       IS_VARIANT                    =
*       I_SAVE                        =
*       I_DEFAULT                     = 'X'
        is_layout                     = gs_layout
*       IS_PRINT                      =
*       IT_SPECIAL_GROUPS             =
*       IT_TOOLBAR_EXCLUDING          =
*       IT_HYPERLINK                  =
      CHANGING
        it_outtab                     = gt_list[]
        it_fieldcatalog               = gt_fieldcat
*       IT_SORT                       =
*       IT_FILTER                     =
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
  ELSE .
*ALV----------------------
    CALL METHOD wcl_alv->refresh_table_display
* EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
      EXCEPTIONS
        finished = 1
        OTHERS   = 2.
    IF sy-subrc <> 0.
*--异常处理
    ENDIF.
  ENDIF .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      <--P_GT_FIELDCAT  实参
*&---------------------------------------------------------------------*
FORM prepare_field_catalog  CHANGING p_gt_fieldcat.
  DATA ls_fcat TYPE lvc_s_fcat .
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = 'SFLIGHT'
    CHANGING
      ct_fieldcat            = p_gt_fieldcat
*     ct_fieldcat            = gt_fieldcat[]
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  IF sy-subrc <> 0.
*--Exception handling
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      <--P_GS_LAYOUT  text
*&---------------------------------------------------------------------*
FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.
  ps_layout-zebra = 'X' .
  ps_layout-grid_title = 'Flights' .
  ps_layout-smalltitle = 'X' .
ENDFORM. " prepare_layout

*&---------------------------------------------------------------------*
*& Form GET_DATA
*&-------------------------------------------------------------------
FORM get_data  TABLES   rt_outtab LIKE gt_list[].
  SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE rt_outtab UP TO 30 ROWS.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  COMMIT_EXIT  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE commit_exit INPUT.
  LEAVE PROGRAM.
ENDMODULE.
           

定义的屏幕:

SAP:OOALV实例

创建的定制控件:

SAP:OOALV实例

效果展示:

SAP:OOALV实例

继续阅读