OO SALV的栏位功能
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( ).