我想写一个导出引用表的方法。这是必需的,因为它的每一行都可能有自己的结构。所以我声明的类型是这样的:
... 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>.
对于"work">,我的意思是附加行的值确实发生了变化。如果像第二个例子中那样为<lfs_target>
分配一些东西,它会在结构本身中发生变化,但表中的不会。
显然,我正在用最后一个例子更改引用。但为什么它能与字段符号一起工作呢?
您的代码之所以使用字段符号而不使用数据对象,是因为这两者以不同的方式处理内存中的数据。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
中,从而覆盖对新表行的原始引用。