SAP editing function is activated to modiy table content.

本文介绍如何通过在命令对话框中输入T_code:SE16N并附加&sap_edit来激活SAP系统的编辑功能,进而实现对表格内容的编辑。

T_code: SE16N

Input "&sap_edit" in the command dialog box, the SAP editing function is activated, so we could edit the table content.

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/167898/viewspace-1030144/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/167898/viewspace-1030144/

<think>我们正在解决两个问题:1.错误'ET_GOOD_CELLS'不是内部表2.在OOALV中获取正在编辑的行号首先,关于错误'ET_GOOD_CELLS'不是内部表:这个错误通常发生在使用OOALV的事件处理时,特别是在处理`DATA_CHANGED`事件时。在`DATA_CHANGED`事件中,系统会传递一个`ER_DATA_CHANGED`对象,该对象有几个重要的内部表属性,如`MT_GOOD_CELLS`、`MT_MOD_CELLS`等。注意:事件参数中并没有`ET_GOOD_CELLS`,而是`MT_GOOD_CELLS`(M表示成员变量,T表示表)。因此,错误可能是因为误写了参数名。正确的应该是`ER_DATA_CHANGED->MT_GOOD_CELLS`(或`MT_MOD_CELLS`)。其次,获取正在编辑的行号:在`DATA_CHANGED`事件中,我们可以通过循环`ER_DATA_CHANGED->MT_MOD_CELLS`来获取所有被修改的单元格,每个单元格信息中包含行号(`ROW_ID`)。下面详细说明步骤:1.**定义事件处理类**:创建一个类来处理事件,其中包含处理`DATA_CHANGED`事件的方法。2.**在类中实现`HANDLE_DATA_CHANGED`方法**:在方法中,通过`ER_DATA_CHANGED`对象访问`MT_MOD_CELLS`(存储修改的单元格)或`MT_GOOD_CELLS`(存储验证通过的单元格)内部表。注意:`MT_MOD_CELLS`是在数据修改时触发的,而`MT_GOOD_CELLS`则是在数据验证后触发的(如果使用了验证)。3.**获取行号**:遍历内部表,从每一行中取出`ROW_ID`,这个就是行索引(注意:行索引是从1开始,并且是相对于当前ALV显示的行,不是内表的绝对行号)。4.**映射到内表行号**:如果对ALV进行了排序、筛选,则需要将显示的行号映射回内表的行号。可以使用`GET_ROW_FROM_INDEX`方法。具体代码示例:首先,定义事件接收器类:```abapCLASSlcl_event_receiverDEFINITION.PUBLICSECTION.METHODS:handle_data_changedFOREVENTdata_changedOFcl_gui_alv_gridIMPORTINGer_data_changed.ENDCLASS.CLASSlcl_event_receiverIMPLEMENTATION.METHODhandle_data_changed.DATA:lt_mod_cellsTYPElvc_t_modi."获取修改的单元格lt_mod_cells=er_data_changed->mt_mod_cells."循环获取每一修改行LOOPATlt_mod_cellsINTODATA(ls_mod_cell).DATA(lv_row_index)=ls_mod_cell-row_id."这是ALV中的行索引"如果需要获取内表的实际行号(考虑排序、筛选等)DATA:lv_row_idTYPElvc_roid.DATA:lv_tab_rowTYPEsy-tabix."将行索引转换为行ID(行索引是显示的行号,行ID是内表的行号)CALLMETHODgo_alv_grid->get_row_from_indexEXPORTINGi_index=lv_row_indexIMPORTINGe_row=lv_row_id."得到内表行号lv_tab_row=lv_row_id.WRITE:/'当前编辑行在内表中的行号:',lv_tab_row.ENDLOOP.ENDMETHOD.ENDCLASS.```然后,在显示ALV之前注册事件:```abapDATA:go_event_receiverTYPEREFTOlcl_event_receiver.CREATEOBJECTgo_event_receiver."创建ALV网格对象DATA(go_alv_grid)=NEWcl_gui_alv_grid(...)."注册事件SETHANDLERgo_event_receiver->handle_data_changedFORgo_alv_grid."重要:启用编辑事件go_alv_grid->register_edit_event(i_event_id=cl_gui_alv_grid=>mc_evt_modified).```关于错误`'ET_GOOD_CELLS'不是内部表`:请检查你的代码中是否出现了`ET_GOOD_CELLS`。在事件`DATA_CHANGED`中,参数是`ER_DATA_CHANGED`,它是一个对象,其属性有`MT_GOOD_CELLS`、`MT_MOD_CELLS`等。因此,你应该使用:-`er_data_changed->mt_mod_cells`获取修改的单元格-`er_data_changed->mt_good_cells`获取验证通过的单元格例如,如果你在代码中写了:LOOPATet_good_cells...应改为:LOOPATer_data_changed->mt_good_cells...总结:1.错误是因为使用了错误的事件参数名,应使用`ER_DATA_CHANGED->MT_GOOD_CELLS`或`MT_MOD_CELLS`。2.获取编辑行号:通过`MT_MOD_CELLS`中的`ROW_ID`,然后调用`GET_ROW_FROM_INDEX`得到内表实际行号。如果还有问题,请检查事件注册和编辑激活是否正确。注意:在事件`DATA_CHANGED`中,`MT_MOD_CELLS`和`MT_GOOD_CELLS`都是内部表类型`LVC_T_MODI`(结构是`LVC_S_MODI`)。另外,如果不需要映射到内表行号(即内表就是显示的顺序),可以直接使用`ROW_ID`作为内表索引(但要注意索引从1开始)。相关问题:1.在OOALV的`DATA_CHANGED`事件中,`ER_DATA_CHANGED`对象有哪些属性?[^1]2.如何将ALV的行索引转换为内表的行号?[^2]3.在OOALV中如何启用编辑功能?[^3]引用说明:[^1]:引用中关于字段目录和布局的内容与当前问题无关,可以忽略。我们主要关注事件处理。[^2]:输出表字段的参考DDIC信息,但我们这里的问题是关于事件处理的。</think> ### 解决 SAP ABAP OOALV 中 `ET_GOOD_CELLS` 错误和获取编辑行号 #### 1. **`ET_GOOD_CELLS` 不是内部表的错误分析** 此错误通常是由于事件参数名错误或对象访问方式不正确导致。在 OOALV 的 `DATA_CHANGED` 事件中: - **正确参数名**:`ER_DATA_CHANGED->MT_GOOD_CELLS` 或 `ER_DATA_CHANGED->MT_MOD_CELLS`(而非 `ET_GOOD_CELLS`) - **对象类型**:`ER_DATA_CHANGED` 是 `REF TO CL_ALV_CHANGED_DATA_PROTOCOL` 对象 **修复方案**: ```abap METHOD handle_data_changed. DATA: lt_cells TYPE lvc_t_modi. " 正确声明内部表 " ✅ 正确访问属性 lt_cells = er_data_changed->mt_mod_cells. " 修改的单元格 " lt_cells = er_data_changed->mt_good_cells. " 验证通过的单元格 LOOP AT lt_cells INTO DATA(ls_cell). DATA(lv_editing_row) = ls_cell-row_id. " 获取行号 ENDLOOP. ENDMETHOD. ``` **常见错误原因**: 1. 误用 `ET_GOOD_CELLS` 代替 `MT_GOOD_CELLS` 2. 未正确定义内部表类型 `LVC_T_MODI` 3. 事件注册未激活:缺少 `REGISTER_EDIT_EVENT()` #### 2. **完整示例:获取编辑行号** ```abap " 1. 定义事件处理器 CLASS lcl_events DEFINITION. PUBLIC SECTION. METHODS: handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed. ENDCLASS. CLASS lcl_events IMPLEMENTATION. METHOD handle_data_changed. " 获取所有修改的单元格 DATA(lt_mod_cells) = er_data_changed->mt_mod_cells. " 遍历获取行号 LOOP AT lt_mod_cells INTO DATA(ls_mod). DATA(lv_row_index) = ls_mod-row_id. " ALV 显示行号(从1开始) " 映射到内表实际行号 DATA: lv_row_id TYPE lvc_roid. go_alv_grid->get_row_from_index( EXPORTING i_index = lv_row_index IMPORTING e_row = lv_row_id ). WRITE: / '实际数据行:', lv_row_id-row_id. ENDLOOP. ENDMETHOD. ENDCLASS. " 2. ALV 初始化 DATA: go_events TYPE REF TO lcl_events. CREATE OBJECT go_events. " 3. 注册事件 go_alv_grid->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_modified ). SET HANDLER go_events->handle_data_changed FOR go_alv_grid. ``` #### 3. **关键注意事项** 1. **行号映射**: - `ROW_ID` 是 ALV 显示行号(从1开始) - 使用 `GET_ROW_FROM_INDEX()` 转换为内表索引 - 过滤/排序时需使用 `GET_FILTERED_ENTRIES()`[^1] 2. **事件激活**: ```abap " 必须激活编辑事件 go_alv_grid->register_edit_event( cl_gui_alv_grid=>mc_evt_modified ). ``` 3. **数据类型**: ```abap TYPES: lvc_t_modi TYPE TABLE OF lvc_s_modi. " 单元格修改结构 ``` ### 相关问题 1. 在 `DATA_CHANGED` 事件中如何实现单元格实时验证?[^1] 2. 当 ALV 启用筛选或排序时,如何正确获取数据行的实际索引?[^2] 3. OOALV 的 `MT_MOD_CELLS` 和 `MT_GOOD_CELLS` 有什么区别?[^2] [^1]: ABAP OOALV 的事件处理需通过类方法实现,字段目录定义需注意数据类型匹配。 [^2]: ALV 的单元格修改数据通过结构化内部表传递,需正确声明 `LVC_S_MODI` 类型结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值