ALV OO检查单元格更新数据

ABAP ALV DATA_CHANGE事件应用
本文介绍如何在ABAP中使用ALV的DATA_CHANGE事件来高效地验证和更新表格中的单元格数据。通过注册事件并实现处理方法,可以在用户输入数据后立即进行校验并给出反馈。

 

原文地址: http://blog.youkuaiyun.com/bobking1983/archive/2007/04/23/1575361.aspx

ALV单元格设置为可输入后,通常我们需要对单元格输入的值做一个检查,一般来说用循环内表的方法可以实现上述操作,不过如果ALV中有大量数据,而我们只更新了少量的单元格数据,这样检查显得非常的麻烦,而且效率低下

ALV OO中我们可以通过DATA_CHANGE事件得到被修改的单元格的信息,利用这些信息我们可以很方便的对所填数据做检查,别且可以给用户相应的错误提示,以及自动修改单元格数据

1.       我们需要在处理事件的类中添加一个处理DATA_CHANGE事件的方法

Eg

CLASS lcl_alv_receiver DEFINITION DEFERRED.

 

CLASS lcl_alv_receiver DEFINITION.

  PUBLIC SECTION.

    ……..

    METHODS:

    handle_data_changed

        FOR EVENT data_changed OF cl_gui_alv_grid

            IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.

ENDCLASS.                    "lcl_event_receiver DEFINITION

 

2.       初始化ALV后为lcl_alv_receiver类注册一个DATA_CHANGED事件

Eg

CALL METHOD g_grid->set_table_for_first_display

    EXPORTING

      i_save          = x_save

      is_variant       = ls_layout

      is_layout        = is_layout

    CHANGING

      it_fieldcatalog   = it_fieldcat

      it_outtab       = lt_zqsdmx[].

SET HANDLER g_alv_application->handle_data_changed FOR g_grid.

CALL METHOD g_grid->register_edit_event  注册更新事件

    EXPORTING

      i_event_id = cl_gui_alv_grid=>mc_evt_enter .

其中i_event_id = cl_gui_alv_grid=>mc_evt_enter 表示在单元格修改后回车或者执行其他操作时触发事件,此类型可用于多个单元格修改后一起检查修改的值

i_event_id = cl_gui_alv_grid=>mc_evt_modified 表示单光标焦点移开被修改单元格后既触发事件,此类型可用于每个每个单元个的实时更新检查

  3.实现lcl_alv_receiver类的handle_data_changed方法,其中一些常用的一些属性方法我会在后附表列出

Eg

CLASS lcl_alv_receiver IMPLEMENTATION.

  METHOD handle_toolbar.

    METHOD handle_data_changed.

    PERFORM handle_data_changed USING er_data_changed.

  ENDMETHOD.                    "handle_data_changed

ENDCLASS.               "lcl_ALV_event_receiver

 

*&---------------------------------------------------------------------*

*&      Form  handle_data_changed

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_ER_DATA_CHANGED  text

*----------------------------------------------------------------------*

FORM handle_data_changed  USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

*如果更新的reason字段长度小于10为则提示用户填入字符数不能低于10

  DATA:mod_data TYPE lvc_t_modi,

       wa_mod_data TYPE lvc_s_modi.

  mod_data = p_er_data_changed->mt_mod_cells.

  LOOP AT mod_data INTO wa_mod_data WHERE fieldname = 'ZRESON'.

    IF STRLEN( wa_mod_data-value ) < 10.

      CALL METHOD p_er_data_changed->add_protocol_entry

        EXPORTING

          i_msgid     = '00'

          i_msgty     = 'E'

          i_msgno     = '001'

          i_msgv1     = '长度必须大于10 '

          i_fieldname = wa_mod_data-fieldname.

 

*如果长度小于10,则将字段内容更新为长都无法确定

      CALL METHOD p_er_data_changed->modify_cell

        EXPORTING

          i_row_id    = wa_mod_data-row_id

          i_fieldname = wa_mod_data-fieldname.

    ENDIF.

  ENDLOOP.

ENDFORM.                    " handle_data_changed

附:

DATA_CHANGED 事件ER_DATA_CHANGED参数的常用方法和属性一览表

方法

名称

用途

modify_cell

修改指定位置单元格的值

add_protocol_entry

弹出一个消息,必须使用系统标准的消息类

protocol_is_visible

是否显示错误信息提示

refresh_protocol

删除错误消息

属性

名称

用途

MT_MOD_CELLS

更新的单元格信息

MP_MOD_ROWS

更新的行信息

MT_GOOD_CELLS

更新的单元格信息,系统按照标准格式对字段内容转换后的值

MT_DELETED_ROWS

被删除的行信息

MT_INSERTED_ROWS

新插入的行信息

 

修改单元格

 

由于输入长度限制小于10,弹出提示窗口,并且自动更新单元格内容

 

<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、付费专栏及课程。

余额充值