選中DEMO的效果:
用戶在ALV 控件最左邊選中一行,然後點自定義的button, 程序知道用戶選中了這一行:
內存中的數據狀態其實是這樣的:
一、ALV控件的工具條上加一個自定義按鈕:
SE38中新建一個程序ZALV_SELECT,這個程序一開始只有代碼,但是我們的ALV控件工作起來,其實有一個工具條。
而且這個工具條,需要我們自己定義一個按鈕。這個工具條怎麼來呢?其實拷貝來改改最方便:
1、SE80中選SLVC_FULLSCREEN函數組
2、點右鍵複製,目前程序填上我們的程序名ZALV_SELECT,搞定。
3、我們的程序中打開工具條,加上我們的自定義按鈕,完成。最後注意工具條要激活!
二、重點說明:
1、選中的狀態其實是在一個僅一個字節的字段中打一個X,保留原表的結構,加一個選中字段,注意看GT_TABLE的GS_USR21是怎麼申明的。
2、ALV有2個關鍵的參數,FILEDCAT是字段參數、LAYOUT是佈局參數。
FILEDCAT字段參數是給一張數據表,而佈局參數只是一行數據結構。
注意是在LAYOUT佈局參數中申明存放選中的字段: GS_LOUT-BOX_FNAME = 'SELXXX'.
3、用戶在ALV控件的行選中,對應的內存中【SELXXX】字段會被打上X。 然後用戶再點一下BUTTON,程序執行到我們的回調函數:ALV_USER_COMMAND;在回調函數中,我們遍歷【SELXXX】字段,找到有X的行,完成對用戶選中的識別。
三、完整的DEMO代碼:
*&---------------------------------------------------------------------*
*& REPORT ZALV_SELECT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALV_SELECT.
DATA: GT_FCAT TYPE LVC_T_FCAT.
DATA: GS_LOUT TYPE LVC_S_LAYO.
DATA BEGIN OF GS_USR21.
INCLUDE STRUCTURE USR21.
DATA SELXXX TYPE C. "用來記錄行選擇的字段
DATA END OF GS_USR21.
DATA GT_TABLE LIKE TABLE OF GS_USR21.
START-OF-SELECTION.
SELECT * INTO TABLE GT_TABLE FROM USR21.
END-OF-SELECTION.
PERFORM FM_INIT_ALV.
PERFORM FM_SHOW_ALV TABLES GT_TABLE
USING GT_FCAT
GS_LOUT.
FORM FM_INIT_ALV .
"===============FIELDCAT字段參數===================
PERFORM ADD_FIELD_LVC TABLES GT_FCAT
USING 'BNAME' '' '' '' '' '編號' '' '' '' '' ''.
PERFORM ADD_FIELD_LVC TABLES GT_FCAT
USING 'PERSNUMBER' '' '' '' '' '編號' '' '' '' '' ''.
"===============LAYOUT 佈局參數===================
GS_LOUT-BOX_FNAME = 'SELXXX'.
GS_LOUT-ZEBRA = 'X'.
GS_LOUT-CWIDTH_OPT = 'X'.
GS_LOUT-STYLEFNAME = 'EDIT_T_STYLE'. "指定編輯狀態的字段名,還需要把某列先打開爲可編輯
ENDFORM.
FORM ADD_FIELD_LVC TABLES GT_FIELDCAT_LVC STRUCTURE LVC_S_FCAT
USING I_FIELDNAME TYPE LVC_RFNAME
I_REF_FIELD TYPE LVC_RFNAME
I_REF_TABLE TYPE LVC_TNAME
I_KEY TYPE C
I_QFIELDNAME TYPE LVC_QFNAME
I_TEXT TYPE STRING
I_EDIT TYPE C
I_NZERO TYPE C
I_F4 TYPE C
I_BOX TYPE C
I_ICON TYPE C
.
DATA GS_FIELDCAT_LVC TYPE LVC_S_FCAT.
CLEAR GS_FIELDCAT_LVC.
GS_FIELDCAT_LVC-FIELDNAME = I_FIELDNAME.
GS_FIELDCAT_LVC-REF_FIELD = I_REF_FIELD.
GS_FIELDCAT_LVC-REF_TABLE = I_REF_TABLE.
GS_FIELDCAT_LVC-KEY = I_KEY.
GS_FIELDCAT_LVC-QFIELDNAME = I_QFIELDNAME.
GS_FIELDCAT_LVC-COLDDICTXT = 'L'.
GS_FIELDCAT_LVC-SCRTEXT_L = I_TEXT.
GS_FIELDCAT_LVC-EDIT = I_EDIT.
GS_FIELDCAT_LVC-NO_ZERO = I_NZERO.
GS_FIELDCAT_LVC-F4AVAILABL = I_F4.
GS_FIELDCAT_LVC-CHECKBOX = I_BOX. "搞成CHECKBOX
GS_FIELDCAT_LVC-ICON = I_ICON.
"設置字段的顏色
IF I_FIELDNAME = 'BNAME'.
GS_FIELDCAT_LVC-EMPHASIZE = 'C700'.
ENDIF.
IF I_FIELDNAME = 'SELXXX'.
"GS_FIELDCAT_LVC-CHECKBOX = 'X'.
"GS_FIELDCAT_LVC-FIX_COLUMN = 'X'.
ENDIF.
APPEND GS_FIELDCAT_LVC TO GT_FIELDCAT_LVC.
ENDFORM. "ADD_FIELD_LVC
FORM FM_SHOW_ALV TABLES IT_OUTTAB
USING IT_FIELDCAT TYPE LVC_T_FCAT
I_LAYOUT TYPE LVC_S_LAYO.
DATA GS_EVENT TYPE SLIS_ALV_EVENT.
DATA GT_EVENT TYPE SLIS_T_EVENT.
GS_EVENT-NAME = 'PF_STATUS_SET'.
GS_EVENT-FORM = 'ALV_STATUS_SET'.
APPEND GS_EVENT TO GT_EVENT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-CPROG
" I_CALLBACK_PF_STATUS_SET = I_STATUS
IT_EVENTS = GT_EVENT "我們加了
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND' "我們加了
" I_CALLBACK_TOP_OF_PAGE = I_TITLE
IS_LAYOUT_LVC = I_LAYOUT
IT_FIELDCAT_LVC = IT_FIELDCAT
I_SAVE = 'A'
TABLES
T_OUTTAB = GT_TABLE
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.
ENDFORM. "SUB_CALL_ALV
"------------加載STATUS的FORM--------------------
FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
CLEAR: PT_EXTAB[].
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
"------------點了ALV工具條的按鈕--------------------
FORM ALV_USER_COMMAND USING P_UCOMM LIKE SY-UCOMM P_SELFIELD TYPE SLIS_SELFIELD. "P_SELFIELD 用戶鼠標選擇的一個字段
"應用方法將修改ALV的數據保存到內表中
DATA LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA L_TABIX LIKE SY-TABIX. "系統參數 行號
"此處代碼將用戶輸入讀入內表(這一步不可少)
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "自動刷新數據
IMPORTING
E_GRID = LR_GRID.
CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
P_SELFIELD-REFRESH = 'X'. "此處代碼阻止'REUSE_ALV_GRID_DISPLAY創建新的屏幕,造成屏幕多層
P_SELFIELD-ROW_STABLE = 'X'. "保證行、列位置在自動刷新時不變
P_SELFIELD-COL_STABLE = 'X'.
CASE P_UCOMM.
WHEN 'B1'.
DATA:L_COUNT TYPE N,
L_MSG TYPE CHAR100.
LOOP AT GT_TABLE TRANSPORTING NO FIELDS WHERE SELXXX = 'X'.
L_COUNT = L_COUNT + 1.
ENDLOOP.
CONCATENATE 'SELECT'
L_COUNT
'ROWS'
INTO L_MSG
SEPARATED BY SPACE.
MESSAGE L_MSG TYPE 'I'.
WHEN 'B2'.
ENDCASE.
ENDFORM.