说明:项目中和涉及到一些关于OOALV的需求,其中有一个就是业务顾问希望可以让用户编辑指定的单元格,而不是所有的单元格,降低一下用户操作中的风险,所以这里就涉及到了【指定单元格可编辑】。
以下示例为实现内表中选中行的【新物料描述】,【新旧物料号】这两列可编辑。
首先,在定义内表的时候添加一个定义,我这里习惯用【celtab】
DATA :BENGIN OF GS_OUT,
SEL TYPE C, "选中框
MATNR TYPE MATNR, "物料编码
MAKTX TYPE MAKT-MAKTX, "物料描述
MAKTX_NEW TYPE MAKT-MAKTX, "新物料描述
BISMT TYPE MARA-BISMT_NEW,"旧物料号
BISMT_NEW TYPE MARA-BISMT_NEW,"新旧物料号
celtab TYPE lvc_t_styl, "控制字段可编辑的参数
END OF GS_OUT.
然后在layout中也添加一个赋值
gs_layout-stylefname = 'CELTAB'.
最后在你希望的条件下写代码来实现,这里我喜欢用perfrom,这样简洁一点。
编辑状态 【Edit】
LOOP AT GT_OUT INTO GS_OUT WHERE SEL = 'X'.
PERFORM frm_set_cell_en USING 'MAKTX_NEW' CHANGING lw_out.
PERFORM frm_set_cell_en USING 'BISMT_NEW' CHANGING lw_out..
MODIFY GT_OUT FROM GS_OUT.
ENDLOOP.
"from内容
FORM frm_set_cell_en USING pv_fname
CHANGING ps_data LIKE lw_out.
DATA : lv_type TYPE raw4,
ls_cellattr TYPE lvc_s_styl.
CLEAR : lv_type.
lv_type = cl_gui_alv_grid=>mc_style_enabled.
CLEAR: ls_cellattr.
ls_cellattr-fieldname = pv_fname.
ls_cellattr-style = lv_type.
INSERT ls_cellattr INTO TABLE ps_data-celtab.
ENDFORM.
显示状态【Display】
LOOP AT GT_OUT INTO GS_OUT WHERE SEL = 'X'.
PERFORM frm_set_cell_dis USING 'EAN11_NEW' CHANGING lw_out.
PERFORM frm_set_cell_dis USING 'MSTAE_NEW' CHANGING lw_out.
MODIFY GT_OUT FROM GS_OUT.
ENDLOOP.
"from内容
FORM frm_set_cell_dis USING pv_fname
CHANGING ps_data LIKE lw_out.
DATA : lv_type TYPE raw4,
ls_cellattr TYPE lvc_s_styl.
CLEAR : lv_type.
lv_type = cl_gui_alv_grid=>mc_style_disabled.
CLEAR: ls_cellattr.
ls_cellattr-fieldname = pv_fname.
ls_cellattr-style = lv_type.
INSERT ls_cellattr INTO TABLE ps_data-celtab.
ENDFORM.
**注意:**调用完perfrom后一定要【modify内表】
MODIFY lt_out FROM lw_out.
注意:如果是uesr_command事件触发的,就要刷新一下ALV,才会改变编辑状态。
CALL METHOD g_grid->refresh_table_display..
提示:最重要的是在OOALV展示下,有以下设置,不然以上所有的设置都不会生效
CALL METHOD g_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
作者:小飞猪猪猪猪猪猪猪–CSDN
注意:转发请注明作者