一般而言,alv某列可编辑,就是如下:
it_fieldcatalog
TYPE lvc_t_fcat.
"显示数据列内表
wa_fieldcatalog-edit
= 'X'.
"可编辑
IF -CARRID = 'LH3'.
LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. " 设置为可编辑状态
ELSE.
LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 设置为可编辑状态
ENDIF.
IF
&1
EQ
'CARRID'
.
LW_FIELDCAT
-
EDIT
=
'X'
.
ENDIF
.
DATA: wa_fieldcatalog
TYPE lvc_s_fcat,
"显示数据列内表工作区域
if &1 eq 'AAA'.
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
=
2
.
IF SY
-SUBRC
<>
0
.
* Implement suitable error handling here
ENDIF
.
*&
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT
DATA : BEGIN
DATA :
"alv数据变量
DATA :
DATA :
"alv变量
DATA :
DATA :
FIELD-SYMBOLS 《L_DATA》
DEFINE
*
END-OF-DEFINITION .
START-OF-SELECTION .
*
*
这里说明下:
我最开始的时候,没有加下面这句话
* "设置复选框可编辑
IF
&1
EQ
'CARRID'
.
LW_FIELDCAT
-
EDIT
=
'X'
.
ENDIF
.
而是直接使用的
发现没起到作用,所有单元格都是不可编辑的
应该是
LW_STYLELIN-STYLE
=
CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
"
设置为可编辑状态
这句话没起到作用。
具体我没有细研究。
目前测试,把
让该列所有单元格可编辑,然后使用
LW_STYLELIN
-
STYLE
=
CL_GUI_ALV_GRID
=>
MC_STYLE_DISABLED
.
是可以控制不需要编辑的。
这种是可以实现的。