目前實現ALV的形式報表主要有2種:調用函數REUSE_ALV_GRID_DISPLAY和用面向對象的方法實現。前一種比較普遍,不過性能好像不太高,如果查詢語句寫得不太精妙,很容易出現卡的情況。後者是採用面向對象的形式,事先在畫面上畫出一個控制區域,然後用代碼的形式填充ALV進去。
現在着重介紹第二種方法。
1、首先在SE38裏面新建一個程序:
2、保存退出,在SE51裏面新建屏幕100:
3、打開格式,準備在上面畫出一個控制區域:
4、然後在代碼頁裏將狀態,事件添加進去,同時在PBO裏面添加一個MODULE,用於載入ALV報表:
5、回到SE38裏面打開新建的程序,添加一個INCLUDE ZALV_OO 程序,將與ALV有關的代碼放進去封裝起來,這樣以後所有的程序都可以調用:
INCLUDE ZALV_OO.
相關代碼如下:
*ALV變量設定
DATA GR_ALVGRID TYPE REF TO CL_GUI_ALV_GRID .
DATA GC_CUSTOM_CONTROL_NAME TYPE SCRFNAME VALUE 'CC_ALV'. "對應我們畫的控制區的名稱
DATA GR_CCONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER .
*---欄位
DATA GT_FIELDCAT TYPE LVC_T_FCAT .
*---佈局
DATA GS_LAYOUT TYPE LVC_S_LAYO .
*個人定義的變量
DATA: SET_COLOR TYPE I,
DECI_COUNT TYPE P,
CHR_COUNT(8) TYPE C,
TITLE(50) TYPE C,
ALL_FIELD TYPE I,
ALL_FIELD1 TYPE I,
LV_INDEX TYPE I,
TABIX LIKE SY-TABIX,
TMP_TITLE TYPE STRING.
*&---------------------------------------------------------------------*
*& Form display_alv
*&---------------------------------------------------------------------*
* 顯示ALV報表
*----------------------------------------------------------------------*
FORM DISPLAY_ALV USING IT_TABLE TYPE TABLE.
IF GR_ALVGRID IS INITIAL .
*----新建容器,填充到我們畫的控制區域
CREATE OBJECT GR_CCONTAINER
EXPORTING
CONTAINER_NAME = GC_CUSTOM_CONTROL_NAME "這個地方前面已經賦值了
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6.
IF SY-SUBRC EQ 0.
*----容器新建成功,然後在此容器裏面新建ALV的實例
CREATE OBJECT GR_ALVGRID
EXPORTING
I_PARENT = GR_CCONTAINER
EXCEPTIONS
ERROR_CNTL_CREATE = 1
ERROR_CNTL_INIT = 2
ERROR_CNTL_LINK = 3
ERROR_DP_CREATE = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
ENDIF.
*----準備獲取欄位列表
PERFORM SETFIELDS.
"*-----設置佈局
PERFORM PREPARE_LAYOUT CHANGING GS_LAYOUT .
*準備完畢,顯示ALV
CALL METHOD GR_ALVGRID->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 = IT_TABLE[] "設置成自己的內表
IT_FIELDCATALOG = GT_FIELDCAT
* IT_SORT =
* IT_FILTER =
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4 .
IF SY-SUBRC <> 0.
ENDIF.
*刷新ALV
CALL METHOD GR_ALVGRID->REFRESH_TABLE_DISPLAY
* EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
EXCEPTIONS
FINISHED = 1
OTHERS = 2 .
IF SY-SUBRC <> 0.
*--Exception handling
ENDIF.
ENDIF .
ENDIF.
*狀態欄裏面顯示本報表名稱和記錄等信息
CHR_COUNT = DECI_COUNT.
CONDENSE CHR_COUNT.
CONCATENATE TMP_TITLE ',共' CHR_COUNT '筆記錄' INTO TITLE.
MESSAGE TITLE TYPE 'S'.
ENDFORM . "display_alv
*&---------------------------------------------------------------------*
*& Form prepare_layout
*&---------------------------------------------------------------------*
* ALV屬性,具體屬性意義請參考LVC_S_LAYO
*----------------------------------------------------------------------*
* -->PS_LAYOUT text
*----------------------------------------------------------------------*
FORM PREPARE_LAYOUT CHANGING PS_LAYOUT TYPE LVC_S_LAYO.
PS_LAYOUT-ZEBRA = 'X' .
PS_LAYOUT-GRID_TITLE = TITLE .
PS_LAYOUT-SMALLTITLE = 'X' .
PS_LAYOUT-SEL_MODE = 'A'.
PS_LAYOUT-INFO_FNAME = 'COLOR'.
PS_LAYOUT-CWIDTH_OPT = 'X'.
PS_LAYOUT-DETAILINIT = 'X'.
ENDFORM. " prepare_layout
*設置ALV表欄位的宏
DEFINE DSETFIELDS.
DATA LS_FCAT TYPE LVC_S_FCAT .
LS_FCAT-FIELDNAME = &1.
LS_FCAT-INTTYPE = 'C' .
LS_FCAT-OUTPUTLEN = &3.
LS_FCAT-COLTEXT = &2.
LS_FCAT-SELTEXT = &2.
APPEND LS_FCAT TO GT_FIELDCAT .
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& FORM SETFIELDS
*&---------------------------------------------------------------------*
* 調用宏設置欄位
*----------------------------------------------------------------------*
FORM SETFIELD USING TMP_FIELD TYPE C
TMP_NAME TYPE C
TMP_LENGTH TYPE I.
DSETFIELDS TMP_FIELD TMP_NAME TMP_LENGTH.
ENDFORM. "SETFIELDS
6、設定完INCLUDE之後,在主程序裏面新建一個內表:
TABLES:SFLIGHT.
DATA:BEGIN OF IT_SFLIGHT OCCURS 0,
CARRID LIKE SFLIGHT-CARRID,
CONNID LIKE SFLIGHT-CONNID,
FLDATE LIKE SFLIGHT-FLDATE,
PRICE LIKE SFLIGHT-PRICE,
COLOR(4) TYPE C,
END OF IT_SFLIGHT.
START-OF-SELECTION.
PERFORM GETDATA. "讀取數據
CALL SCREEN 100. "呼叫屏幕
*&---------------------------------------------------------------------*
*& Form SETFIELDS
*&---------------------------------------------------------------------*
* 設置欄位
*----------------------------------------------------------------------*
FORM SETFIELDS.
PERFORM SETFIELD USING 'CARRID' '航線承運人ID' 3.
PERFORM SETFIELD USING 'CONNID' '航班連接 Id' 4.
PERFORM SETFIELD USING 'FLDATE' '航班日期' 8.
PERFORM SETFIELD USING 'PRICE' '航空運費' 15.
ENDFORM. "SETFIELDS
*&---------------------------------------------------------------------*
*& Module DISPLAY_ALV OUTPUT
*&---------------------------------------------------------------------*
* 在PBO裏面傳入內表內容以ALV展現
*----------------------------------------------------------------------*
MODULE DISPLAY_ALV OUTPUT.
PERFORM DISPLAY_ALV USING IT_SFLIGHT[].
ENDMODULE. " DISPLAY_ALV OUTPUT
*&---------------------------------------------------------------------*
*& Form GETDATA
*&---------------------------------------------------------------------*
* 讀取數據
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GETDATA .
DATA:SET_COLOR TYPE I.
SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_SFLIGHT FROM SFLIGHT
WHERE CARRID IN S_CARRID
AND CONNID IN S_CONNID
AND FLDATE IN S_FLDATE
AND PRICE IN S_PRICE.
DESCRIBE TABLE IT_SFLIGHT LINES DECI_COUNT. "獲取記錄數
LOOP AT IT_SFLIGHT.
SET_COLOR = SY-TABIX MOD 2.
IF SET_COLOR = 0.
IT_SFLIGHT-COLOR = 'C500'. "設置顏色
ELSE.
CLEAR IT_SFLIGHT-COLOR.
ENDIF.
MODIFY IT_SFLIGHT.
ENDLOOP.
TMP_TITLE = 'ALV面向對象測試'. "報表名稱
ENDFORM. " GETDATA
7、OK,一切完畢之後激活,運行:
如此,ALV就實現了。接下來我們來分析一下它的性能:
8、輸入SE30:
點擊Execute,系統會跑一次報表,退出之後,點擊下面的Evaluate:
很直觀可以看出該報表之行的情況。如果跟調用function:REUSE_ALV_GRID_DISPLAY 對比起來就會發現用OO的形式來做性能會更好的。