SALV的欄位功能主要是通過CL_SALV_COLUMN_TABLE和CL_SALV_COLUMNS_TABLE這兩個類的實現的。
SALV的欄位屬性的詳細功能包括異常狀態圖標、圖標、符號、復選框、按鈕、熱點、超鏈接、單元格類型、單元格顏色、某一欄位顏色、某一行顏色,欄位隱藏等。
關于顏色等樣式屬性,可以單獨設置,也可以通過單元格(cell)style去設置。可以查看接口IF_SALV_C_CELL_TYPE,如下:
具體實現方法如下:
在SALV的輸入參數內表中定義一個保存style的字段,字段類型為salv_t_int4_column,是個表類型,表類型中的結構(structure)定義如下,由一個列名和對應值組成。當不指定列名,只對value賦值,意味著整行的單元格都應用同一個style,如果指定列名,則對指定的與列名相同的應用style。設置好后要保存到內表中。
關于事件的實現,其中要能讀到內表,所以要將內表放到能調取到的地方。具體各種事件參見類,代碼以熱點及雙擊事件作為代表。
REPORT ZSALV02.
TABLES:VBAK.
TYPE-POOLS: ICON, SLIS,SYM.
CLASS SALV_DISPLAY DEFINITION.PUBLIC SECTION.METHODS:DATA_DISPLAY.PRIVATE SECTION.TYPES:BEGIN OF TY_DATA,CHECKBOX TYPE CHAR1,T_COLOR TYPE LVC_T_SCOL,T_CELLTYPE TYPE SALV_T_INT4_COLUMN,VBELN TYPE VBAK-VBELN,ERDAT TYPE VBAK-ERDAT,ERZET TYPE VBAK-ERZET,ERNAM TYPE VBAK-ERNAM,AUART TYPE VBAK-AUART,NETWR TYPE VBAK-NETWR,END OF TY_DATA.DATA:LT_DATA TYPE STANDARD TABLE OF TY_DATA,WA_DATA TYPE TY_DATA.DATA:S_ALV TYPE REF TO CL_SALV_TABLE.DATA:LR_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS,LR_EVENTS TYPE REF TO CL_SALV_EVENTS_TABLE,LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE,LR_COLUMN TYPE REF TO CL_SALV_COLUMN_TABLE,LR_FUNCTIONAL_SETTINGS TYPE REF TO CL_SALV_FUNCTIONAL_SETTINGS.DATA: G_COLOR TYPE LVC_S_COLO, "列顏色LS_COLOR TYPE LVC_S_SCOL,LT_COLOR TYPE LVC_T_SCOL. "行顏色及單元格顏色DATA: LT_CELLTYPE TYPE SALV_T_INT4_COLUMN.DATA: LS_CELLTYPE LIKE LINE OF LT_CELLTYPE.METHODS:COLUMN_SET CHANGING P_ALV TYPE REF TO CL_SALV_TABLE,ON_LINK_CLICK FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE IMPORTINGROW"事件觸發所在的行號COLUMN,"事件觸發所在的列名HOTPOT_CLICK FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE IMPORTINGROW "事件觸發所在的行號COLUMN,"事件觸發所在的列名DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_SALV_EVENTS_TABLE IMPORTINGROW "事件觸發所在的行號COLUMN."事件觸發所在的列名
ENDCLASS.CLASS SALV_DISPLAY IMPLEMENTATION.METHOD DATA_DISPLAY.DEFINE ADD_COLOR.CLEAR LS_COLOR.LS_COLOR-FNAME = &1.LS_COLOR-COLOR-COL = &2.LS_COLOR-COLOR-INT = 1.LS_COLOR-COLOR-INV = 0.LS_COLOR-NOKEYCOL = 'X'.APPEND LS_COLOR TO LT_COLOR.END-OF-DEFINITION.SELECT * FROM VBAK INTO CORRESPONDING FIELDS OF TABLE LT_DATA UP TO 20 ROWS.WA_DATA-NETWR = 2222222222.APPEND WA_DATA TO LT_DATA.CLEAR:WA_DATA.LOOP AT LT_DATA INTO WA_DATA.IF WA_DATA-NETWR > 1000."單元格顏色條件LS_COLOR-FNAME = 'NETWR'.LS_COLOR-COLOR-COL = '5'.LS_COLOR-COLOR-INT = '0'."加深LS_COLOR-COLOR-INV = '0'."前景背景顏色反轉APPEND LS_COLOR TO LT_COLOR.WA_DATA-T_COLOR = LT_COLOR.MODIFY LT_DATA FROM WA_DATA.CLEAR:LS_COLOR,LT_COLOR."注意每次刷新內表及工作區ENDIF.IF WA_DATA-AUART = 'ZCQ'.
* ADD_COLOR 'VBELN' 4."行顏色可以使用宏對每個單元格定義
* ADD_COLOR 'ERDAT' 4.
* ADD_COLOR 'ERZET' 4.
* ADD_COLOR 'ERNAM' 4.
* ADD_COLOR 'AUART' 4.
* ADD_COLOR 'NETWR' 4.LS_COLOR-COLOR-COL = COL_NEGATIVE."行顏色也可以不指定列名就是整行LS_COLOR-COLOR-INT = '0'."加深LS_COLOR-COLOR-INV = '0'."前景背景顏色反轉APPEND LS_COLOR TO LT_COLOR.WA_DATA-T_COLOR = LT_COLOR.MODIFY LT_DATA FROM WA_DATA.CLEAR:LS_COLOR,LT_COLOR."注意每次刷新內表及工作區ENDIF.
* ZZK的訂單類型單元格設定成按鈕IF WA_DATA-AUART = 'ZZK'.LS_CELLTYPE-COLUMNNAME = 'AUART'.LS_CELLTYPE-VALUE = IF_SALV_C_CELL_TYPE=>BUTTON.APPEND LS_CELLTYPE TO LT_CELLTYPE.WA_DATA-T_CELLTYPE = LT_CELLTYPE.MODIFY LT_DATA FROM WA_DATA.CLEAR:LS_COLOR,LT_COLOR,LS_CELLTYPE,LT_CELLTYPE."注意每次刷新內表及工作區ENDIF.
* 只有用戶名為80181007 ERNAM列設定hotspotIF WA_DATA-ERNAM = '80181007'.LS_CELLTYPE-COLUMNNAME = 'ERNAM'.LS_CELLTYPE-VALUE = IF_SALV_C_CELL_TYPE=>HOTSPOT.APPEND LS_CELLTYPE TO LT_CELLTYPE.WA_DATA-T_CELLTYPE = LT_CELLTYPE.MODIFY LT_DATA FROM WA_DATA.CLEAR:WA_DATA,LS_COLOR,LT_COLOR,LS_CELLTYPE,LT_CELLTYPE."注意每次刷新內表及工作區ENDIF.ENDLOOP.TRY .CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = S_ALV CHANGING T_TABLE = LT_DATA ).CATCH CX_SALV_MSG.ENDTRY."顯示ALV的標準功能LR_FUNCTIONS = S_ALV->GET_FUNCTIONS( ).LR_FUNCTIONS->SET_ALL( 'X' ).ME->COLUMN_SET( CHANGING P_ALV = S_ALV )."=====事件注冊
* DATA:HANDLER TYPE REF TO LCL_HANDLE_EVENTS.LR_EVENTS = S_ALV->GET_EVENT( )."注冊事件至類
* CREATE OBJECT HANDLER.SET HANDLER ME->HOTPOT_CLICK FOR LR_EVENTS.SET HANDLER ME->DOUBLE_CLICK FOR LR_EVENTS.SET HANDLER ME->ON_LINK_CLICK FOR LR_EVENTS.S_ALV->DISPLAY( ).ENDMETHOD.METHOD COLUMN_SET.LR_COLUMNS = P_ALV->GET_COLUMNS( ).
* LR_COLUMNS->SET_OPTIMIZE( 'X' )."設置全局列寬優化LR_COLUMNS->SET_HEADERS_VISIBLE( 'X' ). "設置標題欄是否可見LR_FUNCTIONAL_SETTINGS = S_ALV->GET_FUNCTIONAL_SETTINGS( ).TRY .LR_COLUMNS->SET_CELL_TYPE_COLUMN( 'T_CELLTYPE' ).LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'VBELN' ).LR_COLUMN->SET_MEDIUM_TEXT( '銷售訂單號2')."修改列名LR_COLUMN->SET_VISIBLE( 'X' )."可以設置列不可見LR_COLUMN->SET_OPTIMIZED( 'X' )."單獨設置列寬自適應LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'ERDAT' ).G_COLOR-COL = '6'.G_COLOR-INT = '1'.G_COLOR-INV = '0'.LR_COLUMN->SET_COLOR( G_COLOR )."設置列顏色LR_COLUMNS->SET_COLOR_COLUMN( 'T_COLOR' )."設置行顏色及單元格顏色"設置復選框欄位LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'CHECKBOX' ).LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>CHECKBOX_HOTSPOT ).LR_COLUMN->SET_LONG_TEXT( '選擇' )."設置熱點LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'VBELN' ).LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).CATCH CX_SALV_NOT_FOUND.CATCH CX_SALV_DATA_ERROR.CATCH CX_SALV_EXISTING.ENDTRY.ENDMETHOD.METHOD HOTPOT_CLICK.
* MESSAGE '你單擊了我' TYPE 'I'.READ TABLE ME->LT_DATA INTO WA_DATA INDEX ROW."讀當前行CASE COLUMN."取列名WHEN 'VBELN'.SET PARAMETER ID 'AUN' FIELD WA_DATA-VBELN.CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.ENDCASE.ENDMETHOD.METHOD DOUBLE_CLICK.
* MESSAGE '你雙擊了我' TYPE 'I'.READ TABLE ME->LT_DATA INTO WA_DATA INDEX ROW."讀當前行CASE COLUMN."取列名WHEN 'ERNAM'.SET PARAMETER ID 'XUS' FIELD WA_DATA-ERNAM.CALL TRANSACTION 'ZSD053' AND SKIP FIRST SCREEN.ENDCASE.ENDMETHOD.METHOD ON_LINK_CLICK."復選框選中操作READ TABLE ME->LT_DATA ASSIGNING FIELD-SYMBOL(<FS_DATA>) INDEX ROW."讀當前行IF <FS_DATA>-CHECKBOX EQ ''.<FS_DATA>-CHECKBOX = 'X'.ELSE.<FS_DATA>-CHECKBOX = ''.ENDIF.ME->S_ALV->REFRESH( ).ENDMETHOD.
ENDCLASS.START-OF-SELECTION.DATA:LR_DISPLAY TYPE REF TO SALV_DISPLAY.CREATE OBJECT LR_DISPLAY.LR_DISPLAY->DATA_DISPLAY( ).