1. 程式人生 > >修改ALV 工具條--新增、刪除按鈕,按鈕響應事件

修改ALV 工具條--新增、刪除按鈕,按鈕響應事件

以下針對於FM:REUSE_ALV_GRID_DISPLAY的ALV,以新增一個按鈕為例,修改OO ALV工具條的方式大致相同。

第一步:建立我們的測試report : ztest09並實現的顯示。程式碼如下所示:

REPORT  ZTEST09.
TYPE-POOLS: slis.

"(1)定義內表及工作區
DATA: gt_alv_data TYPE STANDARD TABLE OF sflight,
      lt_alv_data TYPE sflight.

DATA: lt_fieldcat   TYPE slis_t_fieldcat_alv.

"(2)初始化內表中的資料
SELECT

* INTO TABLE gt_alv_data FROM sflight .

"(3)獲得sflight中的欄位結構 ,儲存到內表lt_fieldcat中

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_structure_name       = 'SFLIGHT'
  CHANGING
    ct_fieldcat            = lt_fieldcat
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2
    OTHERS                
= 3.
"(4)使用第(3)步得到的 fieldcat第二步得到的內表資料,展示這個ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
    IT_FIELDCAT                       = lt_fieldcat
  TABLES
    t_outtab                          = gt_alv_data.

第二步:為程式ztest09建立一個GUI status。

一般是在標準工具條基礎上進行修改,可以到函式組SALV中copy標準GUI status到自己的程式下,假如copy過來名字改為0100。這一步可以在在t-code:se41 中

COPY PROGRAMM :SAPLKKBL STATUS :STANDARD_FULLSCREEN中到需要程式ztest09的STATUS中。

1-1.png

1-1.png
根據需要,新增自定義按鈕、相應ICON和功能碼BUTTON1,也可刪除某些按鈕不需要的按鈕,儲存啟用。

刪除不需要的按鈕,可以通過直接修改GUI status進行,也可以通過SET PF-STATUS ... EXCLUDING ...的方式進行。

第三步:找到我們新copy過來的GUI status 0100,它的application toolbar的內容,如下圖所示

1-1.png

比如我們需要刪除1-1.png這個按鈕,只需要將它的fcode清除掉即可。增加PDF按鈕,清除1-1.png按鈕後,

GUI status的內容如下所示:

1-1.png

然後,儲存並激活我們這個GUI status。

第四步:在程式碼中應用這個GUI status。

REPORT  ZTEST09.
TYPE-POOLS: slis.

"(1)定義內表及工作區
DATA: gt_alv_data TYPE STANDARD TABLE OF sflight,
      lt_alv_data TYPE sflight.

DATA: lt_fieldcat   TYPE slis_t_fieldcat_alv.

"(2)初始化內表中的資料
SELECT * INTO TABLE gt_alv_data FROM sflight .

"(3)獲得sflight中的欄位結構 ,儲存到內表lt_fieldcat中

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_structure_name       = 'SFLIGHT'

  CHANGING
    ct_fieldcat            = lt_fieldcat
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2
    OTHERS                 = 3.
"(4)使用第(3)步得到的 fieldcat第二步得到的內表資料,展示這個ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING

    IT_FIELDCAT                       = lt_fieldcat
    i_callback_program             =  sy-repid "必須設定這個引數,才能讓程式找到需要的form
    i_callback_pf_status_set      = 'SET_PF_STATUS'
  TABLES
    t_outtab                          = gt_alv_data.

FORM set_pf_statusUSING rt_extabTYPE slis_t_extab.
SET PF-STATUS'0100' .
ENDFORM.

程式執行後的效果如下圖所示:

1-1.png

也就是說,在call function REUSE_ALV_GRID_DISPLAY時,傳入引數I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'中,'SET_PF_STATUS'是一個Form的名字,可以任意寫,然後在程式中新增'SET_PF_STATUS'這個Form,這其實是PBO過程,程式碼很簡單,如下
*&--------------------------------------------------------------------*
*& Form set_pf_status
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS '0100' .
ENDFORM. "set_pf_status
其實如果在GUI status中,沒有刪除按鈕,而又不想顯示出來的話,還可以在這個form中寫程式碼濾掉,如下意思是不顯示排序的兩個按鈕。
*&--------------------------------------------------------------------*
*& Form set_pf_status
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
DATA: BEGIN OF EX_TAB OCCURS 0,
FCODE LIKE SY-UCOMM,
END OF EX_TAB.
EX_TAB-FCODE = '&ODN'. APPEND EX_TAB.”升序
EX_TAB-FCODE = '&OUP'. APPEND EX_TAB.”降序
SET PF-STATUS 'STANDARD' EXCLUDING EX_TAB.
ENDFORM. "set_pf_status
需要注意的是,需要傳入引數I_CALLBACK_PROGRAM =sy-repid "否則的話,系統找不到'SET_PF_STATUS'這個form,也就無法執行這個Form了。
3、新增一個按鈕,肯定要新增按鈕事件在call function REUSE_ALV_GRID_DISPLAY時,傳入引數I_CALLBACK_USER_COMMAND= 'USER_COMMAND'
同樣USER_COMMAND這是個Form名字,可以任意取名,是個PAI的事件響應Form,在程式碼中實現這個form,可如下
*&--------------------------------------------------------------------*
*& Form user_command
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN ‘PDF'."是那個自定義按鈕的功能碼。
PERFORM FRM_button1."執行相應處理