gpt4 book ai didi

dynamic - 在运行时从另一个程序读取非全局变量

转载 作者:行者123 更新时间:2023-12-04 00:03:12 24 4
gpt4 key购买 nike

当我处于堆栈的第 11 级时,我想从第 5 级访问一个变量。

两个级别属于不同的程序:

lvl    type       event              program                 include 
11 METHOD SET_PERNRS_TAB <my_program> <my_include>.
...
05 FORM PUT_PERNR <ldb_program> <ldb_include>.
04 FORM %_ROOT <ldb_program> <ldb_include>.
...

这就是我目前的做法:

constants lc_ldb_pernr_tab   type string value `(LDB_PROGRAM)INDEX[]`.
field-symbols <lt_pernr_tab> type any table.

assign (lc_ldb_pernr_tab) to <lt_pernr_tab>.

现在我可以使用 <lt_pernr_tab> ,它是变量 index[] 的“副本”来自 LDB,在另一个程序中。

这里的问题是它只适用于某些变量,但不适用于其他变量...请在 ldb 程序内的两个变量的声明下方找到。

我试图从我的程序中获得它们的值(value),但只有一个有效。

  1. 有效的,index :
DATA: BEGIN OF COMMON PART $pnp-index$.
DATA: BEGIN OF index OCCURS 1000,
pernr LIKE pernr-pernr,
END OF index.
DATA: END OF COMMON PART.
  1. 没有的,index_all :
  DATA: index_all TYPE t_t_pernr.

这意味着(program)variable的这个进程仅适用于由 ldb 声明为“common part”的变量?

也就是说,无法获取index_all的内容当我在我的程序中时来自 LDB 程序,因为它不是“common part”?

-> 提供一点上下文,index_all有我需要的所有条目,而 index只是 index_all 的一个分区. ldb 遍历 index完成后,它会使用 index_all 的下一个索引对其进行更新.

最佳答案

我认为 documentation说明一切:

For internal use only, the name in name can also have the form "(PROG)DOBJ", where "PROG" is the name of an ABAP program and "DOBJ" the name of a global data object of this program (these names are not case-sensitive). If the program "PROG" is loaded into the same internal session as the current program when the statement ASSIGN is executed, the data object "DOBJ" is found in this program and the field symbol points to this data object if the assignment was successful.

注意“仅供内部使用”,即这种特殊形式的 ASSIGN 可能会在任何 future 的 ABAP 版本中被删除(但我怀疑)。

因此,您可能想要访问一个不是全局的变量,即本地、实例属性或私有(private)/ protected 静态属性...

ASSIGN ('PROG(DOBJ)')common part 一起使用因为它具有全局范围。请注意,通过声明“公共(public)部分”的相同名称,属于同一“组”(1)的其他程序也可以在没有 ASSIGN 的情况下使用公共(public)部分。

如果您可以调整程序(因为它是自定义的),最好稍微重构一下,以便可以从外部访问数据,而不是使用以下技巧。

如果您无法调整程序(因为它是标准的),有以下解决方法来访问本地数据对象

假设这个程序是“PROG”,它包含过程“X”,其中包含您要读取的本地数据对象“LOCVAR”。您可以使用 Enhancement Framework要做到这一点。因此,要使其可从外部程序访问:

  • 在 PROG 中,声明一个全局数据引用变量 (2),例如 DATA ZZ_REF_LOCVAR TYPE REF TO DATA (建议:前缀为“ZZ”以限制与程序 future 补丁的冲突)
  • 在过程“X”的开头,用代码ASSIGN ('LOCVAR') TO FIELD-SYMBOL(<zz_locvar>). zz_ref = ref #( <zz_locvar> ).初始化ZZ_REF_LOCVAR (3)
  • 在您自己的程序中,如果过程“X”当前在调用堆栈中,您可以使用类 CL_ABAP_GET_CALL_STACK 进行检查,您现在可以使用以下代码访问指向局部变量的全局数据引用:FIELD-SYMBOLS <ref_locvar> TYPE REF TO DATA. FIELD-SYMBOLS <locvar>. ASSIGN ('(PROG)ZZ_REF_LOCVAR') TO <ref_locvar>. ASSIGN <ref_locvar>->* TO <locvar> .
  • 这个解决方案的一个小变种是声明 ZZ_REF_LOCVAR作为自定义类池中的静态公共(public)属性,并从标准程序 PROG 和您自己的代码中访问它。

小心,如果 future 的补丁删除了局部变量,它可能不再起作用。无论如何,这句话对全局变量也有效。


(1) 注意:“group”的程序是由通过 PERFORM IN PROGRAM 或 PROG 调用 SUBSCREEN 调用的程序组成的,它们有一个名为“interface work area”的公共(public)内存区域。

(2) 注意:我建议使用全局数据引用变量而不是全局字段符号,因为字段符号不能在类池等程序中全局声明。

(3) 注意:过程“X”开头的隐式增强不能通过命名直接访问局部变量,因为它们的DATA是在增强之后;解决方法是在运行时使用字段符号访问局部变量。

关于dynamic - 在运行时从另一个程序读取非全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55734178/

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