一般而言,alv某列可编辑,就是如下:
DATA: wa_fieldcatalog TYPE lvc_s_fcat, "显示数据列内表工作区域
it_fieldcatalog TYPE lvc_t_fcat. "显示数据列内表
if &1 eq 'AAA'.
wa_fieldcatalog-edit = 'X'. "可编辑
endif.
然后有时候需要的是,某行的某列数据为特定值的时候才可以编辑,其他时候不可编辑。
这里说明一下是:REUSE_ALV_GRID_DISPLAY是细化不到具体单元格的,
使用REUSE_ALV_GRID_DISPLAY_LVC可以
其实思想跟table control 单元格控制思想差不太多;
都是循环数据内表,等数据满足时,去修改显示的属性;
table control 单元格级别控制可见:
http://blog.sina.com.cn/s/blog_c0978c9b0101gbsu.html
此处大概写下alv的单元格级别控制
*&---------------------------------------------------------------------*
*& Report YLM_0003
*& http://blog.sina.com.cn/sapliumeng
*&---------------------------------------------------------------------*
*& created by lium
*& ALV单元格控制
*&---------------------------------------------------------------------*
REPORT YLM_0003 .
DATA : BEGIN OF GS_DATA .
INCLUDE STRUCTURE SPFLI .
DATA : CELL_STYLE TYPE LVC_T_STYL , "为内表添加设置编辑状态所需的字段
END OF GS_DATA .
"alv数据变量
DATA : LT_DATA LIKE TABLE OF GS_DATA .
DATA : LW_DATA LIKE LINE OF LT_DATA .
"alv变量
DATA :
LT_FIELDCAT TYPE LVC_T_FCAT , "显示数据列内表
LW_FIELDCAT LIKE LINE OF LT_FIELDCAT , "显示数据列内表工作区域
L_LAYOUT TYPE LVC_S_LAYO .
DATA : LW_STYLELIN TYPE LVC_S_STYL .
FIELD-SYMBOLS 《L_DATA》 LIKE LINE OF LT_DATA . “因英文版单括号会被html误解析,特使用《》
DEFINE MAC_FIELDLOG .
LW_FIELDCAT -FIELDNAME = &1 . "字段名称
LW_FIELDCAT -REPTEXT = &2 . "标题
* "设置复选框可编辑
IF &1 EQ 'CARRID' .
LW_FIELDCAT - EDIT = 'X' .
ENDIF .
APPEND LW_FIELDCAT TO LT_FIELDCAT .
CLEAR LW_FIELDCAT .
END-OF-DEFINITION .
START-OF-SELECTION .
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE LT_DATA .
MAC_FIELDLOG :
'CARRID ' '航线承运人ID ' ,
'CONNID ' '航班连接 Id ' ,
'COUNTRYFR ' '国家键值 ' ,
'CITYFROM ' '起飞城市 ' ,
'AIRPFROM ' '起飞机场 ' .
LOOP AT LT_DATA ASSIGNING 《L_DATA》 .
LW_STYLELIN -FIELDNAME = 'CARRID' . " 需要编辑的列名
IF 《L_DATA》 -CARRID = 'LH3' .
* LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. " 设置为可编辑状态
ELSE .
LW_STYLELIN -STYLE = CL_GUI_ALV_GRID =>MC_STYLE_DISABLED . " 设置为可编辑状态
ENDIF .
APPEND LW_STYLELIN TO 《L_DATA》 -CELL_STYLE .
CLEAR LW_STYLELIN .
ENDLOOP .
L_LAYOUT -STYLEFNAME = 'CELL_STYLE' . " 将内表中的字段名存入显示格式
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' "调用函数
EXPORTING
IT_FIELDCAT_LVC = LT_FIELDCAT
IS_LAYOUT_LVC = L_LAYOUT
TABLES
T_OUTTAB = LT_DATA
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS
*& Report YLM_0003
*& http://blog.sina.com.cn/sapliumeng
*&---------------------------------------------------------------------*
*& created by lium
*& ALV单元格控制
*&---------------------------------------------------------------------*
REPORT YLM_0003 .
DATA : BEGIN OF GS_DATA .
INCLUDE STRUCTURE SPFLI .
DATA : CELL_STYLE TYPE LVC_T_STYL , "为内表添加设置编辑状态所需的字段
END OF GS_DATA .
"alv数据变量
DATA : LT_DATA LIKE TABLE OF GS_DATA .
DATA : LW_DATA LIKE LINE OF LT_DATA .
"alv变量
DATA :
LT_FIELDCAT TYPE LVC_T_FCAT , "显示数据列内表
LW_FIELDCAT LIKE LINE OF LT_FIELDCAT , "显示数据列内表工作区域
L_LAYOUT TYPE LVC_S_LAYO .
DATA : LW_STYLELIN TYPE LVC_S_STYL .
FIELD-SYMBOLS 《L_DATA》 LIKE LINE OF LT_DATA . “因英文版单括号会被html误解析,特使用《》
DEFINE MAC_FIELDLOG .
LW_FIELDCAT -FIELDNAME = &1 . "字段名称
LW_FIELDCAT -REPTEXT = &2 . "标题
* "设置复选框可编辑
IF &1 EQ 'CARRID' .
LW_FIELDCAT - EDIT = 'X' .
ENDIF .
APPEND LW_FIELDCAT TO LT_FIELDCAT .
CLEAR LW_FIELDCAT .
END-OF-DEFINITION .
START-OF-SELECTION .
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE LT_DATA .
MAC_FIELDLOG :
'CARRID ' '航线承运人ID ' ,
'CONNID ' '航班连接 Id ' ,
'COUNTRYFR ' '国家键值 ' ,
'CITYFROM ' '起飞城市 ' ,
'AIRPFROM ' '起飞机场 ' .
LOOP AT LT_DATA ASSIGNING 《L_DATA》 .
LW_STYLELIN -FIELDNAME = 'CARRID' . " 需要编辑的列名
IF 《L_DATA》 -CARRID = 'LH3' .
* LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. " 设置为可编辑状态
ELSE .
LW_STYLELIN -STYLE = CL_GUI_ALV_GRID =>MC_STYLE_DISABLED . " 设置为可编辑状态
ENDIF .
APPEND LW_STYLELIN TO 《L_DATA》 -CELL_STYLE .
CLEAR LW_STYLELIN .
ENDLOOP .
L_LAYOUT -STYLEFNAME = 'CELL_STYLE' . " 将内表中的字段名存入显示格式
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' "调用函数
EXPORTING
IT_FIELDCAT_LVC = LT_FIELDCAT
IS_LAYOUT_LVC = L_LAYOUT
TABLES
T_OUTTAB = LT_DATA
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS