首先看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.
定義的螢幕:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB5ENFRkT6NmeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyADN5ADMxUTM3ITNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
建立的定制控件:
效果展示: