ALV面向對象方法研究:實現方法(一)

      ALV報表在SAP系統裏面幾乎隨處可見,只要跟報表有關的系統都會製作成ALV的形式。像SE11裏面查看錶格的內容,系統就以ALV的形式體現,在報表裏面可以對任何的欄位進行排序,還可以對任何的列進行篩選,也可以導出成Excel文檔,也能對數值列進行彙總。可以說ALV的報表在實際報表的開發中佔有非常重要的地位。學會它是每個ABAPer必須要經過的一關。

      目前實現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 .

*個人定義的變量
DATASET_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 .
      IF SY-SUBRC <> 0.
      ENDIF.
*刷新ALV
      CALL METHOD GR_ALVGRID->REFRESH_TABLE_DISPLAY
*      EXPORTING
*       IS_STABLE =
*       I_SOFT_REFRESH =
      EXCEPTIONS
        FINISHED 1
        OTHERS .
      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(4TYPE 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的形式來做性能會更好的。

發佈了82 篇原創文章 · 獲贊 7 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章