ABAP:ONCHANGEOF的坑

2023-10-26


 

以下文章来源于ABAPer孙亮 ,作者孙小亮

ABAPer孙亮

绝对“有用 实用”的ABAP与Excel“原创”干货,不定期发布!可加vx: 286503700交流

(1/7)背景


由于AT NEW field会判断field和它前面的所有字段,而ON CHANGE OF没有这个要求,所以后者就有了登上舞台的空间。


(2/7)正常情况


现在有一个内表GT_TAB,包括一个字段FIELD1,内容如下:


FIELD1的值
1 1
2 1
3
2

LOOP GT_TAB时,ON CHANGE OF GT_TAB-FIELD1会在第一和第三行被触发。


(3/7)非正常情况


GT_TAB内容如下:


FIELD1的值
1 1
2 1

没有疑问,第一次LOOP GT_TAB时,ON CHANGE OF GT_TAB-FIELD1会在第一行被触发。


可是,如果第二次LOOP呢?


答案是:不会触发ON CHANGE OF。

而且,即便你清空GT_TAB的内表或工作区再重新赋值,都没有用。


(4/7)示例说明


为此我做了一个示例,包含的功能如下:

(连续的两次循环时,内表的值都是无重复的,我们重点关注第二次循环是否触发ON CHANGE OF的情况)

操作
内表 是否触发
构建新内表,首次循环 全局内表

触发


第二次循环
全局内表 不触发
清空内表后重新赋值并循环
全局内表 不触发
清空工作区后重新循环
全局内表 不触发
清空内表 工作区后重新赋值并循环
全局内表 不触发
调用FORM循环局部内表
局部内表

触发

再次调用FORM循环局部内表
局部内表

不触发

换一个FORM2,同名局部内表
局部内表

触发

再次调用FORM2循环局部内表
局部内表

不触发


这是一个比较隐蔽的坑,因为在某些情况下,我们不能预知GT_TAB-FIELD1会不会一定都是多个值的。如果某一次循环的时候,我们判断的字段没有重复值,那么下次循环的时候,如果内表中的首条记录恰巧与我们上一次循环的值相同,ON CHANGE OF就不会被触发。


而且,不管是全局变量还是局部变量,都有这样的情况。


(5/7)示例代码


有兴趣的同学,可以自己修改代码以测试一下这样的情况:

1、首次循环,内表中是1 1两条数据;

2、再次循环,内表中是1 2 两条数据


 

REPORT ztest_abap_ll.
SELECTION-SCREEN PUSHBUTTON /10(40) clear1 USER-COMMAND clear1.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /10(40) clear2 USER-COMMAND clear2.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /10(40) create USER-COMMAND create.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /10(40) loop1 USER-COMMAND loop1.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /10(40) loop2 USER-COMMAND loop2.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN PUSHBUTTON /10(40) loop3 USER-COMMAND loop3.
TYPES:BEGIN OF ty_tab,
        field1 TYPE string,
      END OF ty_tab,
      tyt_tab TYPE TABLE OF ty_tab.
DATA: gt_tab TYPE tyt_tab WITH HEADER LINE,
      g_msg TYPE string,
      g_msgty TYPE c.
INITIALIZATION.
  clear1 = '清空内表'.
  clear2 = '清空工作区'.
  create = '向内表中插入两条数据'.
  loop1 = '循环全局内表'.
  loop2 = '全局内表放入局部内表后再循环'.
  loop3 = '全局内表放入另一个FORM的同名局部内表后再循环'.
AT SELECTION-SCREEN.
  CASE sy-ucomm.
    WHEN 'CLEAR1'.
      CLEAR: gt_tab[].
    WHEN 'CLEAR2'.
      CLEAR: gt_tab.
    WHEN 'CREATE'.
      "插入两条数据
      gt_tab-field1 = '1'.
      APPEND gt_tab.
      APPEND gt_tab.
    WHEN 'LOOP1'.
      PERFORM loop1.
    WHEN 'LOOP2'.
      PERFORM loop2.
    WHEN 'LOOP3'.
      PERFORM loop3.
  ENDCASE.
FORM loop1.
  LOOP AT gt_tab.
    ON CHANGE OF gt_tab-field1.
      g_msg = '当前索引' && sy-tabix && ',触发了ON CHANGE OF'.
      g_msgty = 'S'.
    ELSE.
      g_msg = '当前索引' && sy-tabix && ',没有触发ON CHANGE OF'.
      g_msgty = 'E'.
    ENDON.
    MESSAGE g_msg TYPE 'I' DISPLAY LIKE g_msgty.
  ENDLOOP.
ENDFORM.
FORM loop2.
  DATA: lt_tab TYPE tyt_tab WITH HEADER LINE.
  lt_tab[] = gt_tab[].
  LOOP AT lt_tab.
    ON CHANGE OF lt_tab-field1.
      g_msg = '当前索引' && sy-tabix && ',触发了ON CHANGE OF'.
      g_msgty = 'S'.
    ELSE.
      g_msg = '当前索引' && sy-tabix && ',没有触发ON CHANGE OF'.
      g_msgty = 'E'.
    ENDON.
    MESSAGE g_msg TYPE 'I' DISPLAY LIKE g_msgty.
  ENDLOOP.
ENDFORM.
FORM loop3.
  DATA: lt_tab TYPE tyt_tab WITH HEADER LINE.
  lt_tab[] = gt_tab[].
  LOOP AT lt_tab.
    ON CHANGE OF lt_tab-field1.
      g_msg = '当前索引' && sy-tabix && ',触发了ON CHANGE OF'.
      g_msgty = 'S'.
    ELSE.
      g_msg = '当前索引' && sy-tabix && ',没有触发ON CHANGE OF'.
      g_msgty = 'E'.
    ENDON.
    MESSAGE g_msg TYPE 'I' DISPLAY LIKE g_msgty.
  ENDLOOP.
ENDFORM.
(6/7)原因分析ABAP:ONCHANGEOF的坑

根据F1里的说明,可以看到对于ON CHANGE OF的事件,在系统里是有一个类似于帮助变量的东西在支撑的,而且这个帮助变量的生命周期是比我们的FORM、FUNCTION等代码块的周期更长的。

F1里面没有提到的是,它的生命周期与全局变量的生命周期谁更长。不过实践证明了,除非程序退出,否则这个帮助变量是不会消失的。


(7/7)如何规避


个人觉得,用ON CHANGE OF,不如自己定义一个变量,记录一下上次循环的值,当本次的值与上次不一致时,即形同ON CHANGE OF的事件。

如下:

DATA: l_field1 type string.

loop at gt_tab.

if l_field1 <> gt_tab-field1.

"形同ON CHANGE OF

else.

l_field1 = gt_tab-field1.

endif.

endloop.


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

ABAP:ONCHANGEOF的坑 的相关文章

随机推荐

  • 【科技英雄传】华为背后的任正非

    惶者才能生存 偏执才能成功 任正非 江湖中曾有这样的传闻 有一年华为的销售人员拜会边疆某地电信局领导 聊天中 对方颇多感慨 说十年前你们华为就有人来过这里 那个人背着军绿色旧书包 敲开门问我们买不买交换机 这位销售带着故事回到总部 讲给上年
  • ubuntu使用记录(4)使用xshell5连接跳板机,出现问题: “服务器发送了一个意外的数据包”received:3,expected:20...

    xshell5访问报错 服务器发送了一个意外的数据包 received 3 expected 20 1 排除了网络 防火墙等因素 2 查看sshd服务状态 3 在 etc ssh sshd config配置文件最后面添加下面一行 KexAl
  • 清华大学:人工智能之知识图谱(附PPT)

    来源 笑看国际风云 导读 知识图谱 Knowledge Graph 是人工智能重要分支知识工程在大数据环境中的成功应用 知识图谱与大数据和深度学习一起 成为推动互联网和人工智能发展的核心驱动力之一 基于此背景 人工智能之知识图谱 Resea
  • 什么是频率响应

    频率响应 系统信号的振幅和相位受频率变化而变化的特性就叫频率响应 由定义可知 频率响应由幅频特性和相频特性组成 幅频特性 表示增益的增减同信号频率的关系 相频特性 表示不同信号频率下的相位畸变关系 频率响应的作用 根据频率响应可以比较直观地
  • YARN详解(ResourceManager/ApplicationMaster/NodeManager/Container)

    一 YARN基本思想 YARN是Hadoop2 0中的资源管理系统 它的基本思想是将JobTracker的两个主要功能 资源管理和作业调度 监控 分离 主要方法是创建一个全局的ResourceManager RM 和若干个针对应用程序的Ap
  • jmeter+ant+jenkins接口自动化测试框架

    大致思路 Jmeter可以做接口测试 也能做压力测试 而且是开源软件 Ant是基于Java的构建工具 完成脚本执行并收集结果生成报告 可以跨平台 Jenkins是持续集成工具 将这三者结合起来可以搭建一套Web HTTP接口测试的持续构建环
  • 超详细的Docker常用命令演示步骤和说明

    文章目录 一 帮助命令 二 镜像命令 三 容器命令 四 常用其他命令 五 常用命令图解 六 命令练习 Docker安装Nginx Docker安装Tomcat 一 帮助命令 docker version 显示docker的版本信息 dock
  • 纹理(Textures)

    纹理 Textures 原文 Textures 作者 JoeyDeVries 翻译 Django 校对 Geequlim BLumia 我们已经了解到 我们可以为每个顶点使用颜色来增加图形的细节 从而创建出有趣的图像 但是 如果想让图形看起
  • [MysSQL8笔记]-Access denied; you need (at least one of) the PROCESS privilege(s) for this opera

    出现这个原因是 当前用户没有PROCESS权限 使用root用户给当前用户授予PROCESS权限即可 以root身份登录 root centos01 mysql uroot p Enter password Welcome to the M
  • 【无标题】

    这里写自定义目录标题 怎么清除掉Excel图表的边框线 怎么清除掉Excel图表的边框线 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页
  • 【C++刷题笔记】函数指针与仿函数:自定义排序规则

    C 刷题笔记 函数指针与仿函数 自定义排序规则 方法一 传函数指针的方式 方法二 传仿函数的方式 自带的less和greater priority queue的情况 C 中的sort函数性能十分强大 有时我们需要自定义排序方式 sort的第
  • 单片机软件系统框架和多任务调度

    这里我用的单片机算是中颖的 芯片 UART底层驱动相关函数 UART相关寄存器初始化 void Uart Init void PCON 0x00 选择SSTAT0 SCON 0x50 01000000 方式一 SBRTL u8int SBR
  • 顺序表的C语言实现

    头文件 SeqList h pragma once include
  • 正大国际期货:期货市场到底难在哪儿?

    正大国际金融控股有限公司 简称 正大国际 成立于2019年11月4日 为香港证监会辖下之持牌法团 证监会中央编号 BOP620 从事第2类及第5类受规管活动及期货合约交易及就期货合约提供意见 主要从事商品期货经纪 金融期货经纪业务 致力于提
  • 程序员如何晋级管理层

    在技术领域 程序员们往往是团队中的核心力量 但是 在职场上 技术过硬并不意味着可以永远待在技术岗位上 程序员们很可能在职场中遇到瓶颈 希望获得更高的职位 那么 作为一名程序员 如何晋升到管理层呢 加强团队合作想要晋升管理层 首先需要具备团队
  • hadoop遇到的问题: org.apache.hadoop.ipc.Client: Retrying connect to server异常的解决

    今天在用pig脚本在hadoop运行时 出现如下错误 前提 hadoop能正常启动 pig的参数也正常配置好了 但是运行脚本就出现org apache hadoop ipc Client Retrying connect to server
  • 中国开源走向第二梯队!

    作者 彭慧中 责编 屠敏 出品 CSDN ID CSDNnews 开源已成为迄今为止最先进 最广泛 最活跃的协同创新模式 近年来 中国开源的发展已成为全球最快 中国在国际社区中的贡献度日益提升 在国际开源生态中的影响力日渐增强 在蓬勃发展之
  • 蒙特卡洛量化分析方法

    蒙特卡洛方法主要思想 对于一个随机系统 输出随输入变化是随机的 那么通过重复采样的方法可以得到输出的具体分布 进而再对输出分布形式进行分析 大数定律 当在试验不变的条件下 重复试验多次 随机事件的频率近似于它的概率 将上述思想用于量化分析
  • 常见国内镜像源地址

    常见国内镜像源地址 常见的pip后面的镜像源地址 常见国内镜像源地址 常见的pip后面的镜像源地址 清华大学 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun co
  • ABAP:ONCHANGEOF的坑

    以下文章来源于ABAPer孙亮 作者孙小亮 ABAPer孙亮 绝对 有用 实用 的ABAP与Excel 原创 干货 不定期发布 可加vx 286503700交流 1 7 背景 由于AT NEW field会判断field和它前面的所有字段