从另一个程序中读取变量

时间:2019-04-17 18:48:38

标签: sap abap

当我处于堆栈的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程序内的两个变量的声明下面找到。

我正试图从我的节目中获得他们的价值,但只有一部作品有用。

  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”的变量?

换句话说,当我进入程序内部时,不可能从LDB程序中获取index_all的内容,因为它不是“ common part”吗?

->给出一些上下文,index_all包含了我需要的所有条目,而index只是index_all的一个分区。 ldb遍历index,完成后,它将使用下一个索引index_all更新它。

1 个答案:

答案 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来做到这一点。因此,要使其可从外部程序访问:

  • 在PROG中,声明一个全局数据引用变量(2),例如DATA ZZ_REF_LOCVAR TYPE REF TO DATA(建议:在其前面加上“ ZZ”以限制与程序的将来补丁程序的冲突)
  • 在过程“ X”的开头,通过代码ASSIGN ('LOCVAR') TO FIELD-SYMBOL(<zz_locvar>). zz_ref = ref #( <zz_locvar> ).(3)初始化ZZ_REF_LOCVAR
  • 在您自己的程序中,如果过程“ 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声明为静态公共属性,并从标准程序PROG和您自己的代码中对其进行访问。

请注意,如果以后的补丁程序删除了本地变量,它可能不再起作用。无论如何,此注释也适用于全局变量。


(1)注意:程序的“ Enhancement Framework”由通过PERFORM IN PROGRAM调用或PROG的CALL SUBSCREEN调用的程序组成,并且它们具有称为“ group”的公共存储区。 / p>

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

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