1. 程式人生 > >alv被display後隨資料的變化隨時重新整理

alv被display後隨資料的變化隨時重新整理

建立一個report顯示alv,在gui上提供一個按鈕,更改資料
image
點選按鈕後的效果如下
image
如上面2圖所示,實時依據按鈕的觸發,重新整理alv上的資料,將最新的資料內容顯示出來。
report中的alv表格顯示的內容是自定義的內表中的資料,如果希望alv顯示的內容及時進行重新整理,前提一定是有兩個:
1.內表被修改了(而不僅僅是修改了透明表,必須內表也對應被修改)
2.在i_callback_user_command中將配置ls_selfield-refresh = 'X'
下面具體描述一下這個report中為了實現上述效果所需要新增的程式碼。
1.為alv所顯示的內表新增紅綠燈欄位

TYPES:BEGIN OF itab_DATA,
        ICON_MARK  TYPE icon-internal,  "icon標記
        SEL(1),     "多選用的灰色方塊
      END OF itab_DATA.

上述ICON_MARK欄位,用於顯示alv表格最左側的紅綠燈。
紅綠燈圖片的來源就是透明表icon,如下圖
image
2.建立紅綠燈的全域性靜態變數,用它們為內表的ICON_MARK進行賦值

INCLUDE <icon>.
CONSTANTS: light_r LIKE icon-internal VALUE '@[email protected]',"紅燈
           light_y LIKE icon-internal VALUE '@[email protected]',"黃燈
           light_g  LIKE icon-internal VALUE '@
[email protected]
',"綠燈 light_non LIKE icon-internal VALUE '@[email protected]'."全熄滅

觸發alv表格中最左側紅綠燈變化的事件是,alv的gui上的按鈕,點選按鈕的本質是去修改某個透明表中某個欄位的資料。記清楚哦,點選按鈕的本質目的是修改透明表,只是我們為了便於觀察修改的結果,所以順帶修改了alv上與透明表相對應的內表的對應欄位。
3.新增gui及按鈕(略)
image
4.為CHANGE按鈕新增程式碼
GUI上的更改按鈕,點選後,會觸發修改去修改比如MARC這樣的SAP標準透明表的某個欄位的值,相當於直接修改資料庫。
因此,按鈕所執行的程式碼中,需要去呼叫相應的BAPI完成對於物料主資料的修改。修改完成後,基於BAPI的執行結果(成功or失敗)來修改alv的ICON_MARK欄位,體現在alv上的紅綠燈顯示哪種顏色。對於SAP中標準的透明表的修改一定要藉助於BAPI,而不能自己寫程式碼去update資料庫中的表。
5.修改透明表的BAPI的呼叫

    LW_HEADER-MATERIAL            =  LDATA-MATNR.     "物料號
    LW_HEADER-IND_SECTOR          =  LDATA-MBRSH.     "行業領域
    LW_HEADER-MATL_TYPE           =  LDATA-MTART.     "物料型別
    LW_MARC-PLANT                 =  LDATA-WERKS.     "工廠
    LW_MARCX-PLANT                =  LDATA-WERKS.     "工廠
    LW_MARC-PUR_STATUS            =  '99'.          "特定工廠狀態
    LW_MARCX-PUR_STATUS           =  'X'.

CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
      EXPORTING
        HEADDATA   = LW_HEADER
        PLANTDATA  = LW_MARC
        PLANTDATAX = LW_MARCX
      IMPORTING
        RETURN     = LW_RETURN.
    IF LW_RETURN-TYPE = 'E'.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
    ENDIF.

上述BAPI的名字叫做BAPI_MATERIAL_SAVEDATA,至於我怎麼知道自己需要去使用這個BAPI,我怎麼使用這個BAPI,我在哪裡找到這個BAPI的使用方法的,我也不知道。
上述BAPI的呼叫過程,簡單解釋一下:
EXPORTING部分提供了三個輸入引數,但是這裡可能出現N多個輸入引數,只是我們的程式碼簡化了。因為我們只打算去修改MARC中的一個欄位的內容。
BAPI的IMPORTING部分提供了1個輸出引數,也就是相當於方法返回值吧。這個輸出引數是一個名為LW_RETURN的變數,我們通過LW_RETURN的值來判斷,BAPI的執行結果。因為呼叫BAPI不一定會成功,也可能失敗呀。
上述程式碼分別對兩種可能的結果,進行了處理。完成事務或者回滾事務。
好的,終於我們的alv的gui上的按鈕呼叫BAPI修改了物料主資料,下面終於可以解釋有關於alv重新整理和紅綠燈顯示的內容了。
6.ALV自動重新整理的配置
在上一步中,我們已經通過BAPI修改了透明表MARC的內容,下面我們需要把這種變化,體現在ALV上。也就是說既然透明表都修改了,我們的ALV要把剛剛點選按鈕修改資料的情況,體現出來。
ALV顯示的資料,雖然來源於透明表,但是它的直接資料來源,其實是內表。我們之前只是用BAPI修改了透明表,現在我們需要,通過程式碼的賦值,修改內表資料。

    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA' "呼叫BAPI修改透明表
      EXPORTING
        HEADDATA   = LW_HEADER
        PLANTDATA  = LW_MARC
        PLANTDATAX = LW_MARCX
      IMPORTING
        RETURN     = LW_RETURN.
    IF LW_RETURN-TYPE = 'E'.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      GS_DATA-MMSTA = R_MMSTA.  "修改內表
      MODIFY GT_DATA FROM GS_DATA. "修改內表
    ENDIF.

上述程式碼補充了修改內表的程式碼,其實只是一個賦值語句,修改了內表中的對應資料。
但是通過上述程式碼,還不能實現alv的自動重新整理,原因是需要在alv的顯示語句上動動手腳
我們先看看alv呼叫的語句

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        i_callback_program       = sy-repid
        i_callback_pf_status_set = 'SET_PF_STATUS'
        i_callback_user_command  = 'USER_COMMAND'
        is_layout                = gs_layout
        it_fieldcat              = gt_fieldcat[]
        i_save                   = 'A'
      TABLES
        t_outtab                 = gt_data[]
      EXCEPTIONS
        program_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.

上述語句中i_callback_user_command中傳遞來的引數,是一個form的名字,form是一個子例程,其實就是一個方法。
我們需要在這個方法中,新增一些語句,才能讓alv本身具備【當內表被修改,alv的顯示跟隨重新整理】的效果。

FORM user_command USING uv_ucomm TYPE sy-ucomm
      ls_selfield TYPE slis_selfield.
..........
  ls_selfield-refresh = 'X'.
..........
ENDFORM.

上述,一方面修改了內表內容,另一方面為user_command添加了必要語句。當我們的alv的GUI的按鈕觸發了BAPI的呼叫,並且觸發了內表的修改,然後提交了BAPI的事務以後,我們的ALV就會自動刷新出最新的顯示資料。