开发做多了,什么BUG都可能遇到。
这次的BUG是MOVE-CORRESPONDING语法,众所周知,此语法对于结构,会将相应的字段按名字匹配。
但是看如下代码:
MOVE-CORRESPONDING ls_1 TO ls_2. ls_2-from = ls_1-from.
是不是认为第二句毫无用处?因为按语法设定,此时第二句的效果,应该已经产生了,但是事实上...并没有...
产生这种奇怪的现象的原因是什么呢?
在于from这个字段的特殊性--在第一个结构ls_1里,它不是一个常规字段,它包含了两个字段,也就是说,它也是一个结构,定义如下:
TYPES: BEGIN OF ts_1, key TYPE c, from TYPE eedmdatefrom, END OF ts_1.
EEDMDATEFROM的定义如下:
此时,FROM会被识别成一个字段,该字段为一个结构,此时如果要访问具体的字段,写法应该是ls_1-from-datefrom, 而不是ls_1-datefrom(会报错)。
那么 ls_2呢,它是直接通过DB table定义的结构,table关于这个的定义如下:
我们可以看到,这是在DB里直接append了一个结构,并设置了GROUP为FROM,此时ls_2如果要访问具体的字段,ls_2-from-datefrom,ls_2-datefrom 都是可以的。
那么此时大家已经可以预见到问题了,这两个from的设定其实是不同的,但是名字以及访问方式,可以完全一样。
所以MOVE-CORRESPONDING的时候,FROM这个‘字段’并没有成功的move过去,从而导致了BUG的产生(以秉都被坑哭了。)
分析至此,我们会想到,其实还有一种定义的方式,
TYPES BEGIN OF ts_3, key TYPE c, include TYPE eedmdatefrom. TYPES END OF ts_3.
那么通过这种方式定义的结构怎么访问具体字段呢?
答案是:ls_3-datefrom和ls_3-from都会报错。(没错就是这么的坑)。那么怎么才能访问呢,经过探索...ls_3-include-datefrom是可行的,但是就是很奇怪...从此ls_3被我们抛弃了。
于是我们不定义type,直接定义结构呢?
DATA: BEGIN OF ls_4, key TYPE c. INCLUDE TYPE eedmdatefrom. DATA END OF ls_4.
此时我们有了第四个结构ls_4,这时候ls_4-datefrom是可以的,但是ls_4-from就会报错,但是如果定义的时候在后面加上 as from,那么两种形式都可以访问。
那么此时的MOVE-CORRESPONDING的表现形式是怎么样的呢?
MOVE-CORRESPONDING ls_1 TO ls_2. MOVE-CORRESPONDING ls_1 TO ls_4. MOVE-CORRESPONDING ls_2 TO ls_1. MOVE-CORRESPONDING ls_2 TO ls_4. MOVE-CORRESPONDING ls_4 TO ls_1. MOVE-CORRESPONDING ls_4 TO ls_2.
测试如下:1->2&1->4失败, 2->1失败,2->4成功,4->1失败,4->2成功。
关于group,很多人其实没用过这个东西,这是在se11创建结构或者表的时候,如果附加了一个结构,可以在后面填写group字段,然后就可以进行写批量的操作。
综上,这些语法的设计上来说,确实有些问题。
非要给一个合理的解释的话,那就是该语法完全基于可以直接访问的字段的值,而不关注group以及as的别名,由于ls_1不能直接访问到具体字段,所以不能互相转换。