通过引用修改表行时的奇怪行为

时间:2017-01-11 07:52:10

标签: sap abap

我想编写一个导出引用表的方法。这是必需的,因为它的每一行都可以有自己的结构。所以我宣布这样的类型:

... TYPE STANDARD TABLE OF REF TO data.

我认为如果我可以立即修改最后一行的表而不是单独的工作区来附加,那将是一个很好的想法。

为什么这样做......

FIELD-SYMBOLS: <lfs_struct> TYPE REF TO DATA.
" ...    
APPEND INITIAL LINE TO ei_lines ASSIGNING <lfs_struct>.
CREATE DATA <lfs_struct> TYPE (<lfs_field>-segnam).
ASSIGN <lfs_struct>->* TO <lfs_target>.

......但这不是吗?

DATA: lo_struct TYPE REF TO data.
" ...    
APPEND INITIAL LINE TO ei_lines REFERENCE INTO lo_struct.
CREATE DATA lo_struct TYPE (<lfs_field>-segnam).
ASSIGN lo_struct->* TO <lfs_target>.

使用&#39; work&#39; 我的意思是附加行的值确实会发生变化。如果我像第二个示例中那样为<lfs_target>分配内容,则会改变结构本身 - 但在表格中

显然我正在使用最后一个示例更改引用。但是为什么它与Field-Symbols一起使用呢?

1 个答案:

答案 0 :(得分:5)

您的代码使用字段符号而不是数据对象的原因是因为这两个代码以不同的方式处理内存中的数据。在C ++中有类似的概念,即使在习惯使用C ++时ABAP中的命名有点令人困惑:

在ABAP中,字段符号有点像C ++中的引用(或者像SAP所说的那样取消引用C ++指针)。它不为自己的数据分配内存,而是指某些现有的字段/数据对象。将数据对象分配给字段符号后,如果通过字段符号访问该数据对象,则不会直接与字段符号本身对话,而是直接与数据对象进行对话! (这是你个案中的关键部分,正如我们稍后所见。

现在,在第一个示例中,您可以创建字段符号,该符号尚未执行任何操作:

FIELD-SYMBOLS: <lfs_struct> TYPE REF TO DATA.

只有在为内部表创建新行并将新分配的内存分配给字段符号<lfs_struct>后,字段符号才会指向某些数据(表格行)。然后动态分配更多内存:

CREATE DATA <lfs_struct> TYPE (<lfs_field>-segnam).

现在,您的内部表ei_lines指向新附加的表行(内存地址),字段符号也是如此。该内存地址又指向CREATE DATA新创建的数据。需要注意的重要一点是,如上所述,您不会访问字段符号本身,而是访问它引用的内存!

第二个示例中,您首先为新数据对象分配内存:

DATA: lo_struct TYPE REF TO data.

然后再为新表行(APPEND)分配新内存,并将对该内存地址的引用放入数据对象lo_struct。现在有趣的部分:您动态创建另一个数据(对象)并将指向新数据的指针保存到lo_struct。因此现在lo_struct不再引用新的表格行,而是引用CREATE DATA中新创建的数据。

TL; DR 在第一个示例中,您CREATE DATA并将对该数据的引用保存到您的字段符号<lfs_struct>所引用的对象中,这是新表ei_lines中的一行。但是,在第二个示例中,您还创建了一个新的表格行,并通过lo_struct引用它,但是当您CREATE DATA之后,您再次将对该新数据的引用存储到lo_struct ,从而覆盖对新表格行的原始引用。