我想写一个导出引用表的方法.这是必需的,因为它的每一行都可以有自己的结构.所以我宣布这样的类型:
... TYPE STANDARD TABLE OF REF TO data.
我认为如果我可以立即修改最后一行的表而不是单独的工作区来附加,那将是一个很好的想法.
为什么这样做......
FIELD-SYMBOLS:TYPE REF TO DATA. " ... APPEND INITIAL LINE TO ei_lines ASSIGNING . CREATE DATA TYPE ( -segnam). ASSIGN ->* TO .
......但这不是吗?
DATA: lo_struct TYPE REF TO data. " ... APPEND INITIAL LINE TO ei_lines REFERENCE INTO lo_struct. CREATE DATA lo_struct TYPE (-segnam). ASSIGN lo_struct->* TO .
使用'work'我的意思是附加行的值确实会改变.如果我
在第二个例子中分配了类似的东西,它会改变结构本身 - 但不会在表格内部.
显然我正在用最后一个例子改变参考.但是为什么它与Field-Symbols一起使用呢?
您的代码使用字段符号而不是数据对象的原因是因为这两个代码以不同的方式处理内存中的数据.在C++中有类似的概念,即使在习惯使用C++时ABAP中的命名有点令人困惑:
在ABAP中,字段符号有点像C++中的引用(或者像SAP所说的那样取消引用的C++指针).它不为自己的数据分配内存,而是指某些现有的字段/数据对象.将数据对象分配给字段符号后,如果通过字段符号访问该数据对象,则不会直接与字段符号本身对话,而是直接与数据对象进行对话!(正如我们稍后看到的那样,这是你案件的关键部分.)
现在,在第一个示例中,您将创建字段符号,该符号尚未执行任何操作:
FIELD-SYMBOLS:TYPE REF TO DATA.
只有在为内部表创建新行并将新分配的内存分配给字段符号后
,字段符号才会指向某些数据(表格行).然后动态分配更多内存:
CREATE DATATYPE ( -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
将对该数据的引用保存到字段符号所
引用的对象中,即新的表格行ei_lines
.但是,在第二个示例中,您还创建了一个新的表格行并通过它来引用它lo_struct
,但CREATE DATA
之后,您再次将对该新数据的引用存储到其中lo_struct
,从而覆盖对新表格行的原始引用.