一、要做回车后校验(网上)。

将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. \

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. \ ENDCLASS. \

*&---------------------------------------------------------------------* *& 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. \ 附:

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 新插入的行信息

二、回车后控制数据变化(网上)

6. 控制数据变化

我们可以设置alv处于可编辑状态,当然ALV也提供给我们控制数据的输入。Alv grid

有两个事件:data_changed和data_changed_finished.第一个事件在可编辑字段的数据发生变化时触发,可用来检查数据的输入,第二个事件是当数据修改完成后触发。

我们可以通过方式REGISTER_EDIT_EVENT来设置,如何触发数据改变事件.2种方式:

1.按回车触发: i_event_id = cl_gui_alv_grid=>mc_event_enter 2.单元格失去焦点: i_event_id = cl_gui_alv_grid=>mc_event_modifies

必须设置一种方式,要不然数据变化事件不会被触发.

为了获取ALV里字段修改的一些信息,DATA_CHANGED事件会把参考

CL_ALV_CHANGED_DATA_PROTOCOL创建的实例通过参数ER_DATA_CHANGED传递给ALV.通过这个参数我们可以知道哪些单元格被修改了,修改了什么值.下面是类CL_ALV_CHANGED_DATA_PROTOCOL的一些方法: Get_cell_value Modify_cell Add_protocol_entry Protocol_is_visible Refresh_protocol 通过这个类的属性,我们可以查到一些修改信息: MT_MOD_CELLS MT_MOD_ROWS MT_GOOD_CELLS MT_DELETED_ROWS Contains address of modified cells with rowed and field name Contain modified rows Its type is genric Contain cells have proper values Contain rows deleted from the list 获取单元格的值 修改单元格 增加日志记录 是否允许错误表可见 刷新日志记录 MT_INSERTED_ROWS

下面是一段示例代码:

Contain rows deleted from the list 通过上述一系列方式和属性,可以获取修改的值,而进行一些输入的检查.

FORM handle_data_changed USING ir_data_changed

TYPE REF TO cl_alv_changed_data_protocol. DATA: ls_mod_cell TYPE lvc_s_modi, Lv_value TYPE lvc_value.

SORT ir_data_changed->mt_mod_cells BY row_id. LOOP AT ir_data_changed->mt_mod_cells INTO ls_mod_cell

WHERE fieldname = 'SEATSMAX'.

CALL METHOD ir_data_changed->get_cell_value EXPORTING i_row_id = ls_mod_cell-row_id I_fieldname = 'CARRID' IMPORTING e_value = lv_value.

IF lv_value = 'THY' AND ls_mod_cell-value > '500'. CALL METHOD ir_data_changed->add_protocol_entry EXPORTING I_msgid = 'SU' I_msgno = '000' I_msgty = 'E'

I_msgv1 = 'This number can not exceed 500 for ' I_msgv2 = lv_value

I_msgv3 = 'The value is et to ''500''' I_fieldname = ls_mod_cell-fieldname I_row_id = ls_mod_cell-rowid.

CALL METHOD ir_data_changed->modify_cell EXPORTING i_row_id = ls_mod_cell-row_id I_fieldname = ls_mod_cell-fieldname I_value = '500'. ENDIF. ENDLOOP. ENDFORM.

三、新增行项目,回车后根据KEY带出其他字段值(自己实践 ZMMRP099)

定义,实现,注册方法和事件

CLASS cl_grid_event 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. \

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

* CLASS cl_grid_event IMPLEMENTATION

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

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

CLASS cl_grid_event IMPLEMENTATION.

METHOD handle_data_changed.\修改后事件扑捉

PERFORM handle_data_changed USING er_data_changed . ENDMETHOD. \ ENDCLASS. \

注册方法:

SET HANDLER cl_grid_eventobj->handle_data_changed FOR grid1. CALL METHOD grid1->register_edit_event \注册更新事件 EXPORTING

i_event_id = cl_gui_alv_grid=>mc_evt_enter.

实现方法里的子函数PERFORM handle_data_changed USING er_data_changed . *&---------------------------------------------------------------------*

*& Form HANDLE_DATA_CHANGED

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

* text

alv回车_CQ-OO ALV 回车 -相关推荐

  1. OO ALV中的data_changed、data_changed_finished事件介绍

    Alv grid/OO ALV中有两个事件(Event):data_changed和ata_changed_finished. 第一个事件在可编辑字段的数据发生变化时触发,可用来检查数据的输入正确性, ...

  2. OO ALV简单报表之DOCKING容器实现

    OO ALV报表实现 后面再说其他的 由简入繁助于理解 下面介绍一下OO ALV的灵魂 两个类(SE24查看): CL_GUI_ALV_GRID CL_GUI_DOCKING_CONTAINER 介绍 ...

  3. abap oo alv

    OO ALV 1.相关类 CL_GUI_ALV_GRID CL_GUI_CUSTOM_CONTAINER CL_GUI_DOCKING_CONTAINER CL_GUI_SPLITTER_CONTAI ...

  4. 【ABAP】OO ALV 概述

    •OO ALV,是指通过面向对象(Object-Oriented)的方式实现的ALV输出 •基本使用原理: –通过界面调用,在界面的Customer Control控件中,输出ALV •CLASS A ...

  5. OO ALV 工具栏对于的功能码

    原文地址:OO ALV 工具栏对于的功能码作者:Lemon 图标与对应的 功能码 明细 &DETAIL 检查 &CHECK 刷新 &REFRESH 剪切 &LOCAL& ...

  6. OO ALV 设置搜索帮助的三种方式 ONF4 EVENT

    一.在 FIELDCAT 中设置参照 二.CALL FUNCTION  'F4IF_INT_TABLE_VALUE_REQUEST ' 三.CALL FUNCTION ' HELP_VALUES_GE ...

  7. FM ALV和OO ALV的区别

    1.OO ALV的屏幕需要自己创建生成,FM ALV的屏幕已经包含在函数中: 2.OO ALV更灵活,通过类的方法对ALV执行操作,比如,一个屏幕可以放多个ALV,而FM ALV不能: 3.OO AL ...

  8. OO ALV checkbox更新的问题

    OO ALV在CHECKBOX的处理与FUNCTION ALV有稍微的不同,在调用set_table_for_first_display后需要加上以下语句才能实现点击后自动更新内表. CALL MET ...

  9. SAP ABAP OO ALV全屏显示

    通过CL_GUI_SPLITTER_CONTAINER拆分容器,实现OO ALV全屏幕显示. 1.创建屏幕0100 . 代码实现如下: DATA SPLITTER TYPE REF TO CL_GUI ...

  10. ABAP - OO ALV基本实现步骤

    ABAP - OO ALV基本实现步骤 新建程序 定义屏幕 PBO实现 PAI实现 完整代码 新建程序 使用T-code:SE38 新建Report: ZOOALV 为新建的Report分配一个pac ...

最新文章

  1. UI设计培训之如何将设计理论与实践相结合
  2. WCF Data Service 的.NET Client 的不支持原生类型服务操作的解决方法
  3. gcc与__cplusplus宏
  4. 卸载shockwave flash插件
  5. 成功解决Error while trying to retrieve text for error ORA-12154
  6. 【AI不惑境】数据压榨有多狠,人工智能就有多成功
  7. iterator and iterable
  8. linux下添加用户的命令--useradd
  9. RPC、RMI与MOM与组播 通信原理 .
  10. mysqldump 导出数据库出错
  11. 第一次 Zul'grub
  12. matlab从入门到放弃~
  13. android 热更新jar,Android热更新之so库的热更新
  14. linux网络适配器驱动程序怎么安装,如何安装网卡驱动_如何重新安装网卡驱动
  15. 谷歌浏览器访问端口限制
  16. setoolkit进行钓鱼攻击
  17. 设置vlan虚拟局域网
  18. 语音交互设计的一点认知
  19. 能ping通不能上网,可以用手机拨号上网
  20. 在国企的日子(第二章 入职)

热门文章

  1. amr怎么转换成mp3,amr转mp3步骤
  2. Python+HTML随机点名抽奖源码模板
  3. C++ constexpr 常量表达式
  4. 视觉配合机械手大视野定位案例(多目标带角度抓取)
  5. 什么浏览器好用啊(浏览器排行榜前十名)
  6. 中国移动网站怎么开通4g服务器,2021年怎样正确设置dns?-中国移动4gapn设置.docx...
  7. 《京韵大鼓——红梅阁》(唱词文本)(骆玉笙演出本)
  8. python queryset_Django之querySet如何解析使用
  9. SolidWorks弯曲的波纹管制作教程
  10. 数组 (Array)