首先看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.
定义的屏幕:
创建的定制控件:
效果展示: