ABAP开发奇葩BUG记录: MOVE-CORRESPONDING的值没有自动匹配

开发做多了,什么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不能直接访问到具体字段,所以不能互相转换。

 

原文地址:https://www.cnblogs.com/yibing-jia/p/12696241.html