访问称为RFC的系统的堆栈内存

时间:2019-07-27 10:12:17

标签: sap abap

当程序在SAP ECC中运行时,“系统堆栈”存储所有全局变量,而与在单个会话中调用哪些模块/程序无关。

在调用启用RFC的功能模块(FM)时,将在被调用系统中创建一个新的系统堆栈,并且在被调用FM完成后,只能在ECC中检索被调用FM中定义的导出参数。

是否可以在ABAP中访问另一个系统堆栈的全局变量?

例如,在我的情况下:

  • ECC系统中的FM BAPI_MATERIAL_AVAILABILITY通过RFC调用APO系统中的FM BAPI_APOATP_CHECK
  • 当APO FM完成时,除了APO RFC功能模块中定义的参数外,我想访问APO系统堆栈的某些全局变量。我需要在ECC系统中访问GTC对象引用。

PS:通常我们使用下面的ABAP语句从同一堆栈访问内存,但是当内存在另一个系统中时,它将不起作用:

ASSIGN '(PrgmName)Globalvariable' TO FIELD-SYMBOLS(<lo_data>).

1 个答案:

答案 0 :(得分:3)

由于在调用后RFC连接没有自动关闭,因此用户会话的内存将在调用后立即保留,因此您可以调用在APO系统中创建的自定义启用RFC的功能模块,该模块可以访问您想要的内存并返回其值。请注意,对象引用不能通过RFC传递。

为了使您更好地理解,我改编了official figure about memory areas,以显示在两个ABAP系统之间未关闭连接时RFC调用如何重用内存:

Memory Areas within RFC client and server ABAP systems

传奇(箭头“ 1”和“ 2”):

  1. 在第一个RFC调用中,打开一个连接,创建一个新的用户会话,ABAP会话和内部会话。全局变量存储在内部会话内部名为“(数据)对象”的块中。在呼叫结束时,将保留连接,包括第一个内部会话及其全局变量。
  2. 在使用相同连接的下一个RFC调用中(现有连接被重用),用户会话被重用(连同其ABAP和内部会话)以执行功能模块,因此,它可以访问前一个的全局变量电话。