ABAP ALV 可编辑单元格更新

ALV是可编辑的,可进行增加、删除、复制及编辑功能,用户删除了几行数据之后直接点击保存按钮,保存完成之后,被删除的几行又还原出来了。

奇怪的是通过选中行项目,点击“删除行”按钮可正常删除,可选中之后直接按下“Del”键删除后保存完成了又显示回来了。

其实这里只需要用到下面的这个方法就可以很好的解决上面的问题:

  call method po_grid->check_changed_data
    importing
      e_valid = l_valid.

获取画面数据改变的事件,并把相应的数据修改到内表。

具体代码如下:
 

types: begin of y_stat,
         type type bapi_mtype, 
         text type bapi_msg,   
       end of y_stat.
 
data: gs_stat  type y_stat.


*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
module user_command_0200 input.
 
  save_ok = ok_code.
  clear ok_code.
 
  clear: gs_stat.
  perform check_changed_data using go_grid changing gs_stat-type.
  if gs_stat-type = gc_e. exit. endif.
 
  case save_ok.
    when 'BACK'.
      leave to screen 0.
    when 'SAVE'.
      perform check_data.
      perform save_data.
  endcase.
 
endmodule.                 " USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*&      Form  CHECK_CHANGED_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GO_GRID  text
*      <--P_GS_STAT  text
*----------------------------------------------------------------------*
form check_changed_data  using    po_grid type ref to cl_gui_alv_grid
                         changing p_type.
  data: l_valid type c.
  clear: l_valid.
  call method po_grid->check_changed_data
    importing
      e_valid = l_valid.
  if l_valid is initial.
    p_type = gc_e.
  endif.
endform.                    " CHECK_CHANGED_DATA

 

<think>我们正在讨论SAPABAPOOALV(面向对象的ALV)中设置单元格可编辑状态的问题。用户的问题是如何配置ALVGrid的编辑模式,特别是设置单个单元格可编辑状态。在OOALV中,我们可以使用CL_GUI_ALV_GRID类。要设置单元格可编辑,需要以下几个关键步骤:1.在字段目录(FieldCatalog)中为需要编辑的字段设置可编辑属性。2.设置ALVGrid的整体编辑模式(例如允许内联编辑、允许快速编辑等)。3.如果需要即时验证,可能需要注册编辑事件(如DATA_CHANGED事件)并实现验证逻辑。注意:用户的问题中提到了“单元格”,所以我们需要设置特定字段为可编辑,而不是整个网格。具体步骤:-定义字段目录时,将需要编辑的字段的`editable`属性设置为`ABAP_TRUE`(或者常量`CELL_EDITABLE`)。-在显示ALV之前,设置Grid的编辑模式属性。例如,通过方法`set_ready_for_input`来启用输入准备状态(传递参数1表示启用)。-另外,还可以通过布局(Layout)设置整体编辑模式,如设置`edit`属性为`'X'`(表示可编辑模式),但通常与字段目录中的设置结合使用。下面是一个示例代码片段:```abapDATA:lt_fieldcatTYPElvc_t_fcat,ls_fieldcatTYPElvc_s_fcat."假设我们需要编辑的字段名为'MATNR'ls_fieldcat-fieldname='MATNR'.ls_fieldcat-edit=abap_true."设置可编辑APPENDls_fieldcatTOlt_fieldcat."创建ALVGrid对象DATA:go_gridTYPEREFTOcl_gui_alv_grid.CREATEOBJECTgo_gridEXPORTINGi_parent=cl_gui_custom_container=>screen0."设置字段目录go_grid->set_table_for_first_display(EXPORTINGis_layout=VALUE#(edit='X')"设置整体布局为可编辑模式CHANGINGit_fieldcatalog=lt_fieldcatit_outtab=gt_data)."开启输入准备go_grid->set_ready_for_input(1)."如果需要处理数据检查事件,需要注册事件SETHANDLERhandle_data_changedFORgo_grid.```在上述代码中,我们:1.为字段目录中需要编辑的字段(例如'MATNR')设置`edit=abap_true`。2.在布局参数(`is_layout`)中设置`edit='X'`,这表示整个ALV网格处于编辑模式。3.调用`set_ready_for_input(1)`来启用输入准备状态。注意:当用户编辑单元格时,会触发`DATA_CHANGED`事件,我们需要在该事件中进行数据校验等操作。另外,关于编辑模式,ALV提供了几种不同的编辑模式:-整行编辑(通过双击行进入编辑模式)-内联编辑(直接在单元格中编辑)-快速编辑(类似于内联编辑,但可以同时编辑多个单元格)在上面的例子中,我们使用的是内联编辑模式(因为设置了字段的`edit`属性)。如果需要特定单元格的编辑(比如根据条件设置某些单元格可编辑),我们可以在字段目录中设置`editable`为不可编辑(即默认值),然后在`data_changed`事件中动态改变编辑状态,或者通过实现动态编辑控制(使用可编辑字段的变式)来实现。不过,标准做法是直接在字段目录中定义。如果需要更细粒度的控制(例如,根据行的不同,同一个字段在某些行可编辑,在某些行不可编辑),那么需要使用单元格编辑控制。这需要在输出数据内表中包含一个类型为LVC_STYLE的字段(通常命名为CELLSTYLE),并在字段目录中设置该字段,然后为每个单元格设置样式(包括编辑控制)。但是,这种方法较为复杂。根据用户的问题,他主要想设置单元格可编辑,所以我们提供了基础方法。相关问题:用户如果对编辑事件处理或单元格级别控制感兴趣,我们可以进一步说明。因此,生成的相关问题如下:§§相关问题§§1.在OOALV中如何实现数据编辑的即时校验?2.如何根据条件设置OOALV中某些单元格可编辑而其他不可编辑?3.OOALV有哪些不同的编辑模式?它们有什么区别?</think> ### OOALV中设置单元格可编辑状态的配置方法 在SAP ABAP OOALV中实现单元格可编辑状态,需要以下关键配置步骤: #### 1. **字段目录属性设置** 在定义字段目录时,为需要可编辑的字段添加`edit`属性: ```abap ls_fieldcat-edit = 'X'. "设置字段可编辑 ``` #### 2. **布局控制配置** 在`layout`结构中设置编辑模式: ```abap gs_layout-edit = 'X'. "启用网格编辑模式 gs_layout-stylefname = 'STYLE'. "指定样式控制字段 ``` #### 3. **样式控制字段** 在输出表内表中添加样式控制字段: ```abap TYPES: BEGIN OF ty_data, matnr TYPE matnr, werks TYPE werks_d, style TYPE lvc_t_styl, "样式控制字段 END OF ty_data. ``` #### 4. **注册编辑事件** 实现数据更改事件处理方法: ```abap METHODS: handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid. ``` #### 5. **完整配置示例** ```abap DATA: go_grid TYPE REF TO cl_gui_alv_grid, gt_fieldcat TYPE lvc_t_fcat, gs_layout TYPE lvc_s_layo. " 1. 准备字段目录 ls_fieldcat-fieldname = 'MATNR'. ls_fieldcat-edit = 'X'. "物料字段可编辑 APPEND ls_fieldcat TO gt_fieldcat. " 2. 配置布局 gs_layout-edit = 'X'. gs_layout-stylefname = 'STYLE'. "绑定样式字段 gs_layout-cwidth_opt = 'X'. "优化列宽 " 3. 创建ALV实例 CREATE OBJECT go_grid EXPORTING i_parent = cl_gui_custom_container=>default_screen. " 4. 注册事件 SET HANDLER handle_data_changed FOR go_grid. " 5. 显示ALV go_grid->set_table_for_first_display( EXPORTING is_layout = gs_layout CHANGING it_fieldcatalog = gt_fieldcat it_outtab = gt_data ). ``` #### 6. **单元格级控制** 通过`STYLE`字段动态控制编辑状态: ```abap LOOP AT gt_data ASSIGNING <fs_data>. IF <fs_data>-werks = '1000'. "仅特定工厂可编辑 ls_style-fieldname = 'MATNR'. ls_style-style = cl_gui_alv_grid=>mc_style_enabled. INSERT ls_style INTO TABLE <fs_data>-style. ENDIF. ENDLOOP. ``` #### 7. **保存配置确认** 需在程序顶部添加编辑确认控制: ```abap CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = go_grid. go_grid->set_ready_for_input( 1 ). "激活编辑模式 ``` > **注意事项**: > - 编辑后需实现`handle_data_changed`方法进行数据校验 > - 使用`CHECK_CHANGED_DATA`方法显式保存修改 > - 若需要行级编辑,设置`gs_layout-sel_mode = 'D'`[^1] [^1]: SAP官方文档《ALV Grid Control Programming Guide》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值