abap 單元格級別的操作ALV.

單元格級別的操作ALV.

帶表頭的ALV使用結構如下:

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      I_LIST_TYPE = 0
    IMPORTING
      ET_EVENTS   = I_EVENTS.

  READ TABLE I_EVENTS
       WITH KEY NAME = SLIS_EV_TOP_OF_PAGE
       INTO W_EVENTS.

  IF SY-SUBRC = 0.
    MOVE 'ALV_TOP_OF_PAGE' TO W_EVENTS-FORM.
    MODIFY I_EVENTS FROM W_EVENTS INDEX SY-TABIX.
  ENDIF.

 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'SET_STATUS'
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
      IS_LAYOUT_LVC            = GD_LAYOUT
      IT_FIELDCAT_LVC          = IT_FIELDCAT
      IT_EVENTS                = I_EVENTS
      I_SAVE                   = 'X'
      IT_SORT_LVC              = IT_SORT
    TABLES
      T_OUTTAB                 = GT_ALV
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

一,定義部分。

TYPE-POOLS: SLIS.

1. 定義顯示字段宏

DATA: IT_FIELDCAT TYPE LVC_T_FCAT,     "slis_t_fieldcat_alv WITH HEADER LINE,
      WA_FIELDCAT TYPE LVC_S_FCAT.
DEFINE ALV_INIT.
  WA_FIELDCAT-FIELDNAME   = &1.
  WA_FIELDCAT-SCRTEXT_M   = &2.
  WA_FIELDCAT-EDIT        = &3.
  WA_FIELDCAT-OUTPUTLEN   = &4.
  APPEND WA_FIELDCAT TO IT_FIELDCAT.
  CLEAR WA_FIELDCAT.
END-OF-DEFINITION.

2.定義排序定義

DATA: IT_SORT TYPE LVC_T_SORT.
 DATA: WA_SORT TYPE LVC_S_SORT.

3.定義顯示參數

DATA  GD_LAYOUT    TYPE LVC_S_LAYO. 

4.表頭定義

  DATA   I_EVENTS        TYPE SLIS_T_EVENT,

       W_EVENTS        LIKE LINE OF I_EVENTS.

  DATA   I_LIST_COMMENTS TYPE SLIS_T_LISTHEADER,

         W_LIST_COMMENTS LIKE LINE OF I_LIST_COMMENTS .

5.單元格可編輯狀態設置

在定義的輸出結構中添加

  TYPES: BEGIN OF TYP_SAMPLE.

 .......

  TYPES: 測試字段名稱 TYPE 測試類型.

  TYPES: SEL   TYPE C.                 "爲設置多選狀態預留

TYPES: FIELD_STYLE  TYPE LVC_T_STYL. "爲設置單元格狀態預留

TYPES: ROWCOLOR     TYPE CHAR30.     "爲添加某行數據整體顏色預留

  TYPES: END OF TYP_SAMPLE.

二、ALV FM 動態程序出口格式:

1.ALV PAI事件出口格式:

FORM USER_COMMAND USING RF_UCOMM    LIKE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD.

1).使用整體設置,只要有OK_CODE就會刷新

RS_SELFIELD-REFRESH = 'X'.

2).不同按鈕條件下的刷新

CASE RF_UCOMM.

WHEN 'SAVE'."SAVE爲狀態欄按鈕

"只在點擊SAVE(按鈕名稱)按鈕時候纔會自動刷新

RS_SELFIELD-REFRESH = 'X'.

WHEN OTHERS.

ENDCASE.

ENDFORM.    

2.表頭出口實例:

FORM ALV_TOP_OF_PAGE.
  CLEAR: I_LIST_COMMENTS[].
  W_LIST_COMMENTS-TYP  = 'H'. "H=Header, S=Selection, A=Action
  W_LIST_COMMENTS-KEY  = ''.
  CONCATENATE  ' ' '直髮銷售訂單取消審批流程' INTO W_LIST_COMMENTS-INFO.
  APPEND W_LIST_COMMENTS TO I_LIST_COMMENTS.
**組織機構
  CLEAR W_LIST_COMMENTS.
  W_LIST_COMMENTS-TYP  = 'S'. "H=Header, S=Selection, A=Action
  W_LIST_COMMENTS-KEY  = ''.
  CONCATENATE  '雙擊報表中的銷售訂單那列可以進入顯示銷售訂單界面,查看銷售訂單詳細情況。'
  W_LIST_COMMENTS-INFO INTO W_LIST_COMMENTS-INFO.
  APPEND W_LIST_COMMENTS TO I_LIST_COMMENTS.
** 時間範圍
  CLEAR W_LIST_COMMENTS.
  W_LIST_COMMENTS-TYP  = 'S'. "H=Header, S=Selection, A=Action
  W_LIST_COMMENTS-KEY  = ''.
  CONCATENATE  '統計日期:' SY-DATUM INTO W_LIST_COMMENTS-INFO.
  APPEND W_LIST_COMMENTS TO I_LIST_COMMENTS.
  CLEAR W_LIST_COMMENTS.
*調撥ALV的功能
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = I_LIST_COMMENTS.
ENDFORM.                  "alv_top_of_page

3.狀態欄出口實例

FORM SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.

ENDFORM.   

三 ALV整體設置以及相關功能。

1). GD_LAYOUT-BOX_FNAME  = 'SEL'.       “設置多選按鈕名稱     (定義字段)
  GD_LAYOUT-STYLEFNAME = 'FIELD_STYLE'. ”設置單元格選擇名稱 (定義字段)
  GD_LAYOUT-INFO_FNAME = 'ROWCOLOR'.   “設置顏色名稱        (定義字段)

單元格設置爲不可編輯狀態設置:(WA_FIELDCAT-EDIT = 'X' 要操作的列 必須設爲可編輯狀態 )

      LS_STYLEROW-FIELDNAME = '測試字段名稱' .
       LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "set field to disabled
       CLEAR  GT_ALV-FIELD_STYLE.
       APPEND LS_STYLEROW TO  GT_ALV-FIELD_STYLE.

注:通過LOOP ALV要顯示的內表 可以根據SEL的‘X’或者其他字段的狀態值,動態設置可編輯還是不可編輯狀態

單元格設置爲可編輯狀態設置:

      LS_STYLEROW-FIELDNAME = '測試字段名稱' .
      LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. "set field to disabled
      CLEAR  GT_ALV-FIELD_STYLE.
      APPEND LS_STYLEROW TO  GT_ALV-FIELD_STYLE.

注:通過LOOP ALV要顯示的內表 可以根據SEL的‘X’或者其他字段的狀態值,動態設置可編輯還是不可編輯狀態

實例備忘代碼:

  LOOP AT  GT_ALV WHERE SQYY NE ''. "SQYY 申請原因 STAT 申請狀態
    IF GT_ALV-STAT IS NOT INITIAL.
      LS_STYLEROW-FIELDNAME = 'SQYY' .
      LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "set field to disabled
      CLEAR  GT_ALV-FIELD_STYLE.
      APPEND LS_STYLEROW TO  GT_ALV-FIELD_STYLE.
      MODIFY GT_ALV.
      CLEAR LS_STYLEROW.
      CLEAR GT_ALV.
    ELSE.
      LS_STYLEROW-FIELDNAME = 'SQYY' .
      LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. "set field to disabled
      CLEAR  GT_ALV-FIELD_STYLE.
      APPEND LS_STYLEROW TO  GT_ALV-FIELD_STYLE.
      MODIFY GT_ALV.
      CLEAR LS_STYLEROW.
      CLEAR GT_ALV.
    ENDIF.

2).   設置排序字段代碼示例

  WA_SORT-SPOS = '01'.
  WA_SORT-FIELDNAME = '測試字段名稱'.
  WA_SORT-UP = 'X'.     "升序排列  WA_SORT-DOWN = ‘X’降序排列
  APPEND WA_SORT TO IT_SORT.
  CLEAR WA_SORT.

 

四 ALV中 PAI事件塊的操作。

 1).由於單元格可編輯狀態,故要讓後臺獲取前臺(顯示層)所操作的數據,需要調用一個函數。

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = ALV_GRID.

分析:調用這個函數的其實是獲取 調用標準FM ALV的屏幕號已經屏幕上的CONTROL(C)控件名稱,並將所有的屬性賦值給定義好的實例ALV_GRID,然後通過ALV_GRID 調用相關的方法。

  CALL METHOD ALV_GRID->CHECK_CHANGED_DATA.  在裏面的最重要的一句代碼就是

CALL METHOD CL_GUI_CFW=>FLUSH.這句代碼是將前臺屏幕所輸入的信息 同步到後臺CFW 服務器,然後使用ABAP代碼獲取所需要的操作信息。 CFW : CONTROL FRAMEWORK  控件架構 在SAP 的前臺中有個SAP GUI SERVICES (AUTOMATION HANDLER) 應用層的是 (CONTROL FRAMEWORK SERVICES) 就是使用該語句進行同步刷新的 。

代碼示例如下:

  FORM USER_COMMAND USING RF_UCOMM    LIKE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD.

                        RS_SELFIELD TYPE SLIS_SELFIELD.
  RS_SELFIELD-REFRESH = 'X'.  "防止雙擊刷新
  CASE RF_UCOMM .
    WHEN 'APPROVE'.“審批

   DATA ALV_GRID TYPE REF TO CL_GUI_ALV_GRID.
  DATA LT_ZHGXS_ZFSP TYPE TABLE OF ZHGXS_ZFSP.
  DATA LS_ZHGXS_ZFSP TYPE ZHGXS_ZFSP.
  DATA L_SIGN TYPE C.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = ALV_GRID.
  CALL METHOD ALV_GRID->CHECK_CHANGED_DATA.

”僞代碼如下:

LOOP ALV輸出內表 WHRER SEL = 'X' 被選中的行

 IF  測試定義字段  IS INITIAL.

ELSE.

   結構賦值.

添加內表.

 ENDIF.

使用更新內表更新數據庫。

IF 返回值 = 0.

COMMIT WORK .提交數據庫,數據將不能被回滾.(數據層執行UPDATE隊列。調用相關FM寫入數據庫。)

ELSE.

ROLLBACK WORK . 數據庫回滾,只要有一條數據出錯,所有的數據將不能被寫入數據庫

ENDLOOP

 ......

      WHEN OTHERS.

    ENDCASE.

  ENDFORM.    

2) 單行添加顏色。

 已設置好的字段

  TYPES: BEGIN OF TYP_SAMPLE.

 .......

TYPES: ROWCOLOR     TYPE CHAR30.     "爲添加某行數據整體顏色預留

  TYPES: END OF TYP_SAMPLE.

 GD_LAYOUT-INFO_FNAME = 'ROWCOLOR'.   “設置顏色名稱        (定義字段)

 PAI 出口中

如果遇到特定的提示情況,將值 C100  C200  .... C600 等等值付給ROWCOLOR. ALV自動就會輸出顏色行。

 五、雙擊單元格控制。

在ALV函數的PAI出口中。

雙擊 是OKCODE爲空時候 默認響應事件。

所以實例代碼如下:

  FORM USER_COMMAND USING RF_UCOMM    LIKE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD.
  RS_SELFIELD-REFRESH = 'X'.  "防止雙擊刷新
  CASE RF_UCOMM .
    WHEN 'APPROVE'.
      PERFORM  SUB_APPROVE_DATA TABLES GT_ALV.   "提交申
    WHEN 'REFRESH'.
      PERFORM SUB_GET_DATA.
      PERFORM SUB_SET_ALV.
    WHEN OTHERS.
      "雙擊
      IF  RS_SELFIELD-SEL_TAB_FIELD EQ '1-VBELN'.
        READ TABLE GT_ALV INTO GS_ALV INDEX RS_SELFIELD-TABINDEX.
        SET PARAMETER ID 'AUN' FIELD GS_ALV-VBELN.
        CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
      ELSEIF RS_SELFIELD-SEL_TAB_FIELD EQ '1-SQYY'.
        READ TABLE GT_ALV INTO GS_ALV INDEX RS_SELFIELD-TABINDEX.
        IF SY-SUBRC EQ 0.
          CALL SCREEN 9000 STARTING AT 60   6
                           ENDING   AT 102  19  .
          MODIFY GT_ALV FROM GS_ALV INDEX  RS_SELFIELD-TABINDEX.
        ENDIF.
      ENDIF.
  ENDCASE.
  CLEAR SY-UCOMM.
ENDFORM.    

其中           RS_SELFIELD-SEL_TAB_FIELD EQ '1-測試字段名稱' 

解釋如下:1 就是數字1. - 連接符-   後面就是VBELN.

1可以理解爲 列的意思,雙擊哪一列的哪個格。

RS_SELFIELD-TABINDEX 是系統結構的內表INDEX.

六。自定義輸入 輸入編輯文本框。自己畫好屏幕(憑感覺畫)然後畫一個控件CONTROL 命名爲G_CONTAINER

9000屏幕流  9000屏幕屬性 :方式對話框

  PROCESS BEFORE OUTPUT.
 MODULE STATUS_9000.
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_9000.

屏幕代碼:

  MODULE STATUS_9000 OUTPUT.
  SET PF-STATUS 'S9000'.
  CLEAR GT_SQYY[].
  APPEND GS_ALV-SQYY TO GT_SQYY.
  DATA L_SIGN TYPE C.
  IF GS_ALV-STAT NE ''.
    L_SIGN = 'X'.

  ENDIF.
  CALL FUNCTION 'RH_EDITOR_SET'
    EXPORTING
      REPID          = SY-REPID
      DYNNR          = '9000'
      CONTROLNAME    = 'G_CONTAINER'
      MAX_COLS       = 43
      SHOW_STATUS    = 'X'
      DISPLAY_MODE   = L_SIGN
    TABLES
      LINES          = GT_SQYY[]
    EXCEPTIONS
      CREATE_ERROR   = 1
      INTERNAL_ERROR = 2
      OTHERS         = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  CLEAR L_SIGN.
ENDMODULE.                 " STATUS_9000  OUTPUT

  MODULE USER_COMMAND_9000 INPUT.
  DATA L_SQYY TYPE CHAR200.
  CASE SY-UCOMM.
    WHEN  'EXIT' OR 'BACK' OR 'CANCLE'.
      LEAVE TO SCREEN 0.
    WHEN 'SAVE'.
      CLEAR GT_SQYY[].
      CALL FUNCTION 'RH_EDITOR_GET'
        EXPORTING
          CONTROLNAME    = 'G_CONTAINER'
        TABLES
          LINES          = GT_SQYY[]
        EXCEPTIONS
          INTERNAL_ERROR = 1
          OTHERS         = 2.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      LOOP AT GT_SQYY.
        CONCATENATE  L_SQYY GT_SQYY INTO L_SQYY .
        CONDENSE L_SQYY NO-GAPS .
        CLEAR GT_SQYY.
      ENDLOOP.
      GS_ALV-SQYY = L_SQYY.
      CLEAR L_SQYY.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_9000  INPUT

這樣效果就是雙擊可編輯單元格就會出現一個可編輯文本框,定義一個對話框屬性的狀態欄 定義兩個按鈕 SAVE 和 BACK。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章