当程序在 SAP ECC 中运行时,“系统堆栈”存储所有全局变量,无论在该单个 session 中调用什么模块/程序。
当调用支持 RFC 的功能模块 (FM) 时,会在被调用系统中创建一个新的系统堆栈,并且当被调用 FM 完成时,只能在 ECC 中检索被调用 FM 中定义的导出参数。
有没有办法在ABAP中访问另一个系统堆栈的全局变量?
例如,就我而言:
- ECC 系统中的 FM
BAPI_MATERIAL_AVAILABILITY
通过 RFC 调用 APO 系统中的 FMBAPI_APOATP_CHECK
。 - 当 APO FM 完成时,除了 APO RFC 功能模块中定义的参数之外,我还想访问 APO 系统堆栈的一些全局变量。我需要访问ECC系统中的GTC对象引用。
PS:通常我们使用下面的ABAP语句来访问同一个堆栈中的内存,但是当内存位于另一个系统中时它不起作用:
ASSIGN '(PrgmName)Globalvariable' TO FIELD-SYMBOLS(<lo_data>).
最佳答案
由于 RFC 连接在调用后不会自动关闭,因此在调用之后,用户 session 的内存将被保留,因此您可以调用在 APO 系统中创建的自定义启用 RFC 的功能模块,该模块访问您想要的内存并返回其值。请注意,对象引用无法通过 RFC 传递。
为了让您更好地理解,我改编了 official figure about memory areas显示当 2 个 ABAP 系统之间的连接未关闭时 RFC 调用如何重用内存:
图例(箭头“1”和“2”):
- 在第一次 RFC 调用时,会打开一个连接,创建一个新的用户 session 、ABAP session 和内部 session 。全局变量存储在内部 session 内名为“(数据)对象”的 block 中。调用结束时,连接将被保留,包括第一个内部 session 及其全局变量。
- 在使用相同连接的下一个 RFC 调用(现有连接被重用)时,用户 session 被重用(连同其 ABAP 和内部 session )来执行功能模块,因此它可以访问前一个的全局变量调用。
关于abap - 访问 RFC 调用系统的堆栈内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57231124/