gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:21:58 25 4
gpt4 key购买 nike

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

... 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>.

对于“工作”,我的意思是附加行的值确实发生了变化。如果我将某些内容分配给 <lfs_target>就像我在第二个例子中所做的那样,它改变了结构本身 - 但是 不是 table 里面。

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

最佳答案

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

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

现在在您的 第一个例子 您创建了字段符号,它什么都不做:

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

关于abap - 通过引用修改表行时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41585410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com