OOALV data_changed 與data_changed_finished事件

2023-11-08

data_changed在可編輯字段的數據發生變化時才會觸發。可用來檢查輸入數據的正確性。
data_changed_finished在回車時和可編輯字段數據發生變化后,光標移動時觸發,如果可編輯字段數據檢查失敗,則不會觸發此事件。
這兩個事件都需要調用方法才能觸發。

    call METHOD g_grid01->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_enter.//回車觸發事件
    call METHOD g_grid01->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.//修改觸發事件

下面是個完整例子,屏幕就只有一個customer control:

REPORT Z_TALV.

data: gv_repid TYPE sy-repid,
      gv_sname TYPE sy-dynnr.
DATA: gs_data TYPE spfli.

DATA: gt_data LIKE TABLE OF gs_data.

DATA: g_con01  TYPE REF TO cl_gui_custom_container.

DATA: g_grid01 TYPE REF TO cl_gui_alv_grid.

DATA: gs_fieldcat TYPE lvc_s_fcat.
DATA: gt_fieldcat TYPE lvc_t_fcat.
data: ok_code type sy-ucomm,
      save_ok type sy-ucomm.
CONSTANTS: g_cus01 TYPE scrfname VALUE 'CUS01'.

*----------------------------------------------------------------------*
*       CLASS cl_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_event_receiver DEFINITION.
  PUBLIC SECTION.
    " 声明Toolbar事件方法
    METHODS handle_toolbar
      FOR EVENT toolbar OF cl_gui_alv_grid
      IMPORTING e_object e_interactive.
    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.
    METHODs handle_data_changed_finished
      for EVENT data_changed_finished of cl_gui_alv_grid
      IMPORTING
        e_modified
        et_good_cells.
ENDCLASS.                    "cl_event_receiver DEFINITION

*----------------------------------------------------------------------*
*       CLASS cl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_event_receiver IMPLEMENTATION.
  " 实现Toolbar事件方法
  METHOD handle_toolbar.
    DATA: ls_toolbar TYPE stb_button.
    CLEAR: ls_toolbar.
    ls_toolbar-butn_type = 3. " 分隔符
    APPEND ls_toolbar TO e_object->mt_toolbar.
    CLEAR: ls_toolbar.
    ls_toolbar-function = 'RESH'.    " 功能码
    ls_toolbar-icon = icon_REFRESH.  " 图标名称
    ls_toolbar-quickinfo = 'Refresh'.   " 图标的提示信息
    ls_toolbar-disabled = ''.        " X表示灰色,不可用
    ls_toolbar-text = ''.       " 按钮上显示的文本
    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
  METHOD handle_data_changed.
    PERFORM handle_data_changed using er_data_changed.
  ENDMETHOD.
  METHOD handle_data_changed_finished.
    MESSAGE 'it is work' TYPE 'I'.
  ENDMETHOD.
ENDCLASS.                    "cl_event_receiver IMPLEMENTATION
DATA: event_receiver TYPE REF TO cl_event_receiver.

START-OF-SELECTION.
  PERFORM get_data.

  CALL SCREEN 100.

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text  获取数据
*----------------------------------------------------------------------*
FORM get_data.
  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE gt_data
    UP TO 30 ROWS
    FROM spfli.

ENDFORM.                    "GET_DATA

*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text  ALV显示字段文本
*----------------------------------------------------------------------*
FORM set_fieldcat.
  CLEAR: gt_fieldcat[].
  DEFINE macro_fieldcat.
    clear gs_fieldcat.
    gs_fieldcat-fieldname = &1.
    gs_fieldcat-coltext   = &2.
    gs_fieldcat-hotspot   = &3.
    append gs_fieldcat to gt_fieldcat.
  END-OF-DEFINITION.

  macro_fieldcat 'CARRID'     '航线代码'   'X'.
  macro_fieldcat 'CONNID'     '航班连接Id' ''.
  macro_fieldcat 'COUNTRYFR'  '起飞国家'   ''.
  macro_fieldcat 'CITYFROM'   '起飞城市'   ''.
  macro_fieldcat 'AIRPFROM'   '起飞机场'   ''.
  macro_fieldcat 'COUNTRYTO'  '目标国家'   ''.
  macro_fieldcat 'CITYTO'     '目标城市'   ''.
  macro_fieldcat 'AIRPTO'     '目标机场'   ''.
  macro_fieldcat 'FLTIME'     '航班时间'   ''.
  macro_fieldcat 'DEPTIME'    '启程时间'   ''.
  macro_fieldcat 'ARRTIME'    '到达时间'   ''.
  macro_fieldcat 'DISTANCE'   '距离'       ''.

ENDFORM.                    "SET_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  SET_LAYOUT
*&---------------------------------------------------------------------*
*       text  布局
*----------------------------------------------------------------------*
*      -->P_LAYOUT   text
*----------------------------------------------------------------------*
FORM set_layout CHANGING p_layout TYPE lvc_s_layo.
  p_layout-cwidth_opt = 'X'.   " 自动调节字段长度
  p_layout-sel_mode   = 'D'.   " 选择模式,可选择多行
  p_layout-zebra      = 'X'.   " 颜色交替显示
  p_layout-edit = 'X'.
ENDFORM.                      "SET_LAYOUT

*&---------------------------------------------------------------------*
*&      Module  INIT_CON  OUTPUT
*&---------------------------------------------------------------------*
*       text  创建ALV
*----------------------------------------------------------------------*
MODULE init_con OUTPUT.

  DATA: ls_layout TYPE lvc_s_layo.

  IF g_con01 IS INITIAL.
    PERFORM set_fieldcat.
    PERFORM set_layout CHANGING ls_layout.

    " 创建SAP容器实例
    CREATE OBJECT g_con01
      EXPORTING
        container_name              = g_cus01 " 自定义控件名称
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    " 创建GRID实例
    CREATE OBJECT g_grid01
      EXPORTING
        i_parent          = g_con01
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 4
        OTHERS            = 5.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    CREATE OBJECT event_receiver.
    " 注册事件handler方法
    SET HANDLER event_receiver->handle_toolbar FOR g_grid01.
    set HANDLER event_receiver->handle_data_changed for g_grid01.
    set HANDLER event_receiver->handle_data_changed_finished FOR g_grid01.
    call METHOD g_grid01->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_enter."回車觸發事件
    call METHOD g_grid01->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified."修改完成后光標移動觸發事件,但修改完后,data_changed檢查輸入錯誤,就不會走這個事件
    " 调用ALV 显示方法
    CALL METHOD g_grid01->set_table_for_first_display
      EXPORTING
*       i_structure_name              = 'SPFLI' " 参照表结构字段显示
        is_layout                     = ls_layout " 布局
      CHANGING
        it_fieldcatalog               = gt_fieldcat " 显示字段
        it_outtab                     = gt_data[]
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.

  ENDIF.

ENDMODULE.                 " INIT_CON  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'S0001'.
IF gv_repid is INITIAL.
  gv_repid = 'Z_TALV'.
  gv_sname = '0101'.
ENDIF.
ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_EXIT_0100  INPUT
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
MODULE user_exit_0100 INPUT.
  save_ok = ok_code.
  clear ok_code.
  case save_ok.
    when 'BACK'.
      leave program.
    when 'BTN'.
      MESSAGE 'btn' TYPE 'I'.
  endcase.
ENDMODULE.                 " USER_EXIT_0100  INPUT

form handle_data_changed using
                  p_er_data_changed  TYPE ref to cl_alv_changed_data_protocol.
  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 = 'CONNID'.
    IF strlen( wa_mod_data-value ) > 4.
      call METHOD p_er_data_changed->add_protocol_entry
        EXPORTING
          i_msgid = '00'
          i_msgty = 'E'
          i_msgno = '001'
          i_msgv1 = 'length is too long'
          i_fieldname = wa_mod_data-fieldname.
    ENDIF.
  ENDLOOP.
ENDFORM.

data_changed事件觸發
data_changed_finshed事件光標移動觸發

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OOALV data_changed 與data_changed_finished事件 的相关文章

  • ABAP OPEN SQL详解

    本章目录 概要 OPEN SQL 读取数据 1 概要 1 1 R 3体系结构 学习SQL之前先了解一下R 3体系结构 如 图1 所示 SAP R 3一共分为三层结构 其中应用层和数据库层由单独的系统构成 1 表示层 表示层 Presenta
  • sap doi技术操作excel的方法

    OLE是和微软OFFICE做接口 比较老的技术 DOI是SAP自己搞的 相对是后出来的技术 同样可以操作EXCEL 有一些方法 get sheets select range cell format set ranges format 等等
  • 创建计划行确认数量为0的销售订单

    需求 通过BAPI函数创建销售订单 并且计划行里的确认的数量为0 解决方法 使用BAPI BAPI SALESORDER CREATEFROMDAT2创建SO后 再使用函数 SD BACKORDER UPDATE 对确认的数量进行修改 ti
  • ABAP DOI详解

    导语 DOI是SAP与Office集成的一种技术 是早期OLE的升级版本 把Excel嵌套在程序当中进行展示 需要提前上传模板 在Excel模板中 可以事先设计好公式 在SAP将数据写入Excel中之后会自动用公式进行计算 对于习惯于用Ex
  • ALV 中颜色、强调、下划线的样式

    我们正在尝试操作 alv 网格类来获得像 Sap Agenda SSC1 tcode 中那样的结果 即合并列和行 我们发现该类cl calendar control schedule用方法display处理这个问题 我们正在努力理解这个方法
  • 如何在列表框中设置值?

    我在选择屏幕中定义了一个列表框 如下所示 SELECTION SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE ALTITLE1 SELECTION SCREEN BEGIN OF LINE SELECTI
  • CNS0项目创建交货单增加销售办事处

    1 业务需求 1 1 销售办事处介绍 销售办事处是指在企业中负责销售活动的区域性单位或部门 在SD模块中 可以表示企业的不同销售地点 销售办公室 分销中心或分公司 销售办事处扮演着多种角色和职责 例如 销售活动管理 销售办事处负责管理和监控
  • 配置SAP用户密码策略(不用重启服务器的方法)

    最近公司审计 给我们提出了要优化密码策略的建议 原因是我们的密码策略太简单了 我稍稍研究了一下 之前是通过RZ10来配置 但是这种方法需要重启服务器 这就比较麻烦 其实有一种方法是通过配置密码策略 不要要重启的方法 事务代码 SECPOL
  • 使用正则表达式替换 CSV 中引号之间的逗号

    例如 我们有一个像这样的字符串 COURSE 247 28 4 2016 12 53 Europe Brussels 1 Verschil tussen merk product en leveranciersverantwoordelij
  • 除了锁定的对象之外,我还可以将对象更改保存到另一个 TR 中吗?

    当我尝试切换到报告源的编辑模式时 会出现一个弹出窗口告诉我 将为用户XXX的以下请求创建一个新任务 还提出了运输请求 但是 我不想在此请求中保存我的更改 而是在另一个现有请求中保存更改 我不知道我的系统中正在实施任何版本控制系统 也不知道如
  • ALV 列表中的两级列标题

    我想添加一个标题行来对列标题进行分组 Departure Arrival lt This row is what I want to add Airport Gate Date Airport Gate Date O Hare A10 10
  • 通过静态构造函数创建 ALV 时的 NULL 对象引用。为什么?

    我正在尝试运行从教程复制的这个程序 但我在这一行得到 Null 异常 CALL METHOD list gt SET TABLE FOR FIRST DISPLAY 我的理解是列表对象应该在类构造函数中创建 Method CLASS CON
  • ALV 报告填补了文档之间的空白

    我试图挑战自己制作一份按公司代码显示所有数据的 ALV 报告 但有些文件编号有差距 我想填补缺失号码之间的空白 例如 最后索引值 20012 那么下一个值是 20014 如果报表使用内表中存在的所有数据 如何在网格中插入 20013 Tha
  • 更新标准表中的字段 LIPS-LFIMG 时出现问题

    所有的流程看起来都不错 但是当通过调用函数时 更新也失败 需要更新的字段没有更新 不知道问题出在哪里 有人可以帮我解决这个问题吗 我错过了什么步骤吗 错误消息登录 LT PROT DATA LT PROT LIKE PROTT OCCURS
  • 如何将大量代码复制到不同的公司

    我在一家公司的服务器上有一组 ZBAPI 结构 我们在该公司开发并安装了自定义应用程序 我必须在不同公司的同一应用程序中使用许多相同的 BAPI 是否有任何快速方法可以将结构 功能模块 业务对象和 BAPI 代码本身从一个 SAP 系统移动
  • SELECT 在 ON 子句中包含子字符串?

    我在ABAP中有以下选择语句 SELECT munic mandt VREFER BIS AB ZZELECDATE ZZCERTDATE CONSYEAR ZDIMO ZZONE M ZZONE T USAGE M USAGE T M2M
  • 标准程序的用途列表

    我正在搜索 SAP 表的使用 我想知道桌子在哪里S083用于 SAP 标准程序 我已经搜索过 使用地点 列表 但我只得到了自创程序 没有得到SAP标准程序 有人知道如何在 SAP 标准程序中搜索表使用吗 为了能够使用 SAP 标准编码的使用
  • 如何找到调用该方法的ABAP程序/FM?

    我是SAP SD模块专家 经常需要调试代码 有时我需要知道哪些程序 FM 地址特定的表 我用使用地点在 SE11 中的表中 它会找到寻址该表的类方法 但是当我使用使用地点对于类方法 系统找不到任何内容 你知道如何找到调用此方法的程序或FM吗
  • 将 JSON 反序列化为表

    我需要根据通过 API 接收的数据填充 ABAP 中的表 我正在使用以下 ABAP 函数从 json 填充现有的 ABAP 表 JSON 是正确的 表中包含相应的表 ui2 cl json gt deserialize EXPORTING
  • 在ABAP中显示消息语句内的变量

    如何在不使用消息类的情况下显示消息语句中的变量 IF acct bal lt min bal MESSAGE customer balance less than minimum Balance gt acct bal TYPE E END

随机推荐

  • iOS中的autorelease

    iOS中的autorelease是一种非常重要的内存管理机制 它可以自动释放对象 从而避免内存泄漏和内存溢出等问题 在本文中 我们将详细介绍iOS中的autorelease机制 包括它的原理 使用方法以及注意事项等内容 autoreleas
  • TCP、UDP、IP报头结构体分析

    TCP UDP IP报头结构体分析 TCP数据段格式 TCP是一种可靠的 面向连接的字节流服务 源主机在传送数据前需要先和目标主机建立连接 然后 在此连接上 被编号的数据段按序收发 同时 要求对每个数据段进行确认 保证了可靠性 如果在指定的
  • c盘哪些文件可以删除?正确答案在这里!

    当我们使用电脑时 经常下意识把各种文件数据保存在c盘 导致c盘的空间越来越小 想要清理电脑缓存 c盘哪些文件可以删除 注意 清理文件之前 记得要备份好重要的数据 下面一起来看看哪些c盘文件可以删除吧 操作环境 演示机型 华硕X8AE43In
  • Python下的图像处理库,你要选哪个?

    欢迎大家关注微信公众号 baihuaML 白话机器学习 码字不易 如转载请私信我 在这里 我们一起分享AI的故事 您可以在后台留言 关于机器学习 深度学习的问题 我们会选择其中的优质问题进行回答 在进行数字图像处理时 我们经常需要对图像进行
  • location.host 与 location.hostname 的区别

    location host 与 location hostname 的区别 location host 包含端口 端口是80的话 就不显示 location hostname 不包含端口 http localhost 8888 locati
  • webgl unity_Unity WebGL中的低级插件

    webgl unity Last year we launched a series of technical blog posts on WebGL starting with a couple of posts on memory No
  • nrm 的安装和使用

    NRM介绍 官方解释 开发的npm registry 管理工具 nrm 能够查看和切换当前使用的registry 换言之nrm的作用就是方便用户切换npm的镜像源地址 npm的原始镜像源地址是在国外 国内网络访问比较慢 因此国内的某些大佬机
  • jupyter生成视频动画video anmation

    本文介绍一个正弦余弦波案例来展示jupyter生成动画过程 首先电脑安装一个叫做ffmpeg的软件 只有40M 是一个关于网页制作动画的软件 安装过程见博客 15条消息 安装ffmpeg并写入jupyter matplotlib 山晨啊8的
  • 目录遍历的三种方法

    1 目录的遍历 递归函数 def visitDir path li os listdir path for p in li pathname os path join path p if not os path isfile pathnam
  • Docker与容器的基本概念

    本文主要对Docker和容器的一些基本概念进行一个总结 一 容器与虚拟机 1 什么是容器 Docker官方对容器的解释 一句话概括 容器 Container 就是将软件打包成标准化单元 以用于开发 交付和部署 容器是打包代码及其所有依赖的软
  • mesa图解

    http www sourcecodebrowser com mesa 7 8 2 state 8c html
  • C - Divisors of the Divisors of An Integer Gym - 102040C

    题目链接 题意 就是求n 中因子的因子的个数 题解 n 中某个因子的个数就是n x的累加 证明 其实就是每次褪一层 即每次除去能除于1个3的 依次两个3的 三个3的个数 最终也就能得到3的个数 这里没必要 整除 因为是阶乘 所以即使不能整除
  • Redis初级命令

    一 常用key命令 查看所有key keys 查看key的类型 type key 返回状态1 0 True False 当传入多个key时返回or的结果 即只要有一个存在就返回True exists key key 将key从当前db移动到
  • 学生成绩管理系统数据库设计--MySQL

    MySQL 数据库设计 学生成绩管理系统 设计大纲 友情链接 1 医疗信息管理系统数据库 MySQL 2 邮件管理数据库设计 MySQL 3 点餐系统数据库设计 SQL Server 4 商品管理系统数据库设计 SQL Server 5 S
  • JavaEE架构之传统三层架构,集群架构,分布式架构,微服务架构

    javaEE架构 1 传统三层架构 all in one项目 传统三层架构大致可以分为表现层 业务层和持久层 数据访问层 其中表现层负责接受请求和转发请求 业务层负责处理请求 注 事务管理 日志记录等AOP类型的操作均封装在这一层 持久层主
  • 将web项目导出到远程服务器的tomcat中

    将web项目导出到远程服务器的tomcat中 前期准备 步骤 前期准备 eclipse2017创建的web项目 阿里云服务器中存在tomcat 远程连接工具 windows自带 步骤 1 在eclipse上将完成好的web项目导出为war文
  • ubuntu linux安装pytorch和torchvision

    1 下载镜像 镜像网址 https download pytorch org whl torch stable html 假设你要下载torch1 4 0版本 cp36代表你的环境是python3 6 cu100代表的是你的cuda是10
  • C语言大作业学生成绩管理系统

    1 设计要求 利用所学的知识 理论和实际结合 利用资源 采用模块化的结构 使用模仿修改自主设计相结合的方法 锻炼学生综合分析解决实际问题的编程能力 通过C语言各个函数功能来实现对学生信息的管理 学生信息包括学生姓名 学号 各科成绩 管理方式
  • c++中的成员访问级别和派生继承方式

    1 一个类中的不同变量和函数的访问属性 总共有三种访问级别 public private protected 在类中定义的成员变量和成员函数的时候 如果不在变量前面加上访问级别修饰符 类中默认为私有成员变量或者私有成员函数 而在结构体中如果
  • OOALV data_changed 與data_changed_finished事件

    data changed在可編輯字段的數據發生變化時才會觸發 可用來檢查輸入數據的正確性 data changed finished在回車時和可編輯字段數據發生變化后 光標移動時觸發 如果可編輯字段數據檢查失敗 則不會觸發此事件 這兩個事件