abap - 访问 RFC 调用系统的堆栈内存

标签 abap saprfc

当程序在 SAP ECC 中运行时,“系统堆栈”存储所有全局变量,无论在该单个 session 中调用什么模块/程序。

当调用支持 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>).

最佳答案

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

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

Memory Areas within RFC client and server ABAP systems

图例(箭头“1”和“2”):

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

关于abap - 访问 RFC 调用系统的堆栈内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57231124/

相关文章:

abap - 当你有 "char"类型时,为什么 ABAP 中有这么多 "string"类型?

abap - ABAP 保护的类型名称列表

python - sapnwrfc 调用总是返回 None/NULL

node.js - 如何设置node-rfc的SNC参数?

abap - 通过 RFC 返回动态类型的表行?

include - 创建包含文件时出错 缺少 REPORT/PROGRAM 语句

abap - SELECT 到具有 ABAP CDS 关联的结构化对象

abap - 如何使用动态 FM 创建创建源代码

asp.net - ABAP RFC 调试

php - 配置 SAPRFC + PHP5 失败