首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ABAP:ON CHANGE OF的坑

(1/7)背景

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

(2/7)正常情况

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

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

(3/7)非正常情况

GT_TAB内容如下:

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

可是,如果第二次LOOP呢?

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

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

(4/7)示例说明

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

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

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

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

(5/7)示例代码

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

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

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

(6/7)原因分析

根据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.

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201120A00WAS00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券