• 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不能直接访问到具体字段,所以不能互相转换。

     

  • 相关阅读:
    家庭记账本安卓版开发:第六天
    django-自定义过滤器
    django-标签语法
    django-url的分发, 2)起别名, 3)根目录,4)rediect跳转函数:
    django-MTV基础篇
    django-第一天
    jquery---响应式方面应用
    css-基础知识
    HTML--第一章的基本知识
    003
  • 原文地址:https://www.cnblogs.com/yibing-jia/p/12696241.html
Copyright © 2020-2023  润新知