当我处于堆栈的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>
,它是来自LDB的变量index[]
的“副本”。
这里的问题是,它仅适用于某些变量,而不适用于其他变量...请在ldb程序内的两个变量的声明下面找到。
我正试图从我的节目中获得他们的价值,但只有一部作品有用。
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.
index_all
: DATA: index_all TYPE t_t_pernr.
这意味着(program)variable
的此过程仅适用于被ldb声明为“ common part
”的变量?
换句话说,当我进入程序内部时,不可能从LDB程序中获取index_all
的内容,因为它不是“ common part
”吗?
->给出一些上下文,index_all
包含了我需要的所有条目,而index
只是index_all
的一个分区。 ldb遍历index
,完成后,它将使用下一个索引index_all
更新它。
答案 0 :(得分:6)
我认为documentation可以说明一切:
仅供内部使用,名称中的名称也可以采用“(PROG)DOBJ”格式,其中“ PROG”是ABAP program的名称,“ DOBJ”是{{3}的名称}此程序的数据对象(这些名称不区分大小写)。如果在执行语句ASSIGN时将程序“ PROG”加载到与当前程序相同的global中,则在该程序中找到数据对象“ DOBJ”,并且如果赋值,则字段符号指向该数据对象那是成功的。
请注意“仅供内部使用”,即ASSIGN的这种特殊形式可能会在以后的任何ABAP版本中删除(但我对此表示怀疑)。
因此,您可能想访问不是全局的变量,即本地,实例属性或私有/受保护的静态属性...
ASSIGN ('PROG(DOBJ)')
与common part
一起使用,因为它具有 global 范围。注意,通过声明“公共部分”的相同名称,也可以在不使用ASSIGN的情况下使用属于同一“组”(1)的其他程序使用公共部分。
如果您可以修改程序(因为它是自定义的),则最好对其进行一些重构,以便可以从外部访问数据,而不是使用以下技巧。
如果您无法适应该程序(因为它是标准程序),则可以采用以下变通办法访问本地数据对象。
让我们说这个程序是“ PROG”,它包含过程“ X”,该过程包含要读取的本地数据对象“ LOCVAR”。您可以使用internal session来做到这一点。因此,要使其可从外部程序访问:
DATA ZZ_REF_LOCVAR TYPE REF TO DATA
(建议:在其前面加上“ ZZ”以限制与程序的将来补丁程序的冲突)ASSIGN ('LOCVAR') TO FIELD-SYMBOL(<zz_locvar>). zz_ref = ref #( <zz_locvar> ).
(3)初始化ZZ_REF_LOCVAR 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
声明为静态公共属性,并从标准程序PROG和您自己的代码中对其进行访问。请注意,如果以后的补丁程序删除了本地变量,它可能不再起作用。无论如何,此注释也适用于全局变量。
(1)注意:程序的“ Enhancement Framework”由通过PERFORM IN PROGRAM调用或PROG的CALL SUBSCREEN调用的程序组成,并且它们具有称为“ group”的公共存储区。 / p>
(2)注意:我建议使用全局数据引用变量而不是全局字段符号,因为不能在类池之类的程序中全局声明字段符号。
(3)注意:过程“ X”开头的隐式增强不能通过命名它们直接访问局部变量,因为它们的DATA
在增强之后;解决方法是在运行时使用字段符号访问局部变量。