在 ABAP 会话之间传递结构化数据?

Passing structured data between ABAP sessions?

众所周知,ABAP 内存 (EXPORT/IMPORT) 用于跨调用堆栈在 ABAP 会话中传递数据,而 SAP 内存 (SET/GET) 是会话独立的,对所有 ABAP 都有效用户会话的会话数。

这里的陷阱是 SET PARAMETER 只支持原始平面类型,否则会抛出错误:

"LS_MARA" must be a character-type field (data type C, N, D or T). by

ASSIGN '(PrgmName)Globalvariable' TO FIELD-SYMBOLS(<lo_data>). 这样的全局赋值并不总是一种方法,例如,如果想要将结构传递给某个局部方法变量。

创建 SHMA 共享内存对象对于简单的测试任务来说似乎有点矫枉过正。

到目前为止,我发现只有 this ancient thread 提出了问题,但那里的解决方案很愚蠢,代表了一个完美的例子,说明你不应该如何编写,一个完美的反模式。

如果我们想将结构或 table 传递给另一个 ABAP 会话,我们有什么选择(数据库除外)?

在同一个应用服务器中,您可以使用EXPORT/IMPORT ... SHARED BUFFER/MEMORY ...

您的要求的可能陈述:

EXPORT mara = ls_mara TO SHARED BUFFER indx(zz) ID 'MARA'.

在应用服务器之间,您可以使用ABAP Channels

像往常一样,桑德拉有一个很好的答案。

Export/Import To/From Shared buffer/Memory非常强大。 但是请明智地使用它并确保您了解它位于 1 个应用程序服务器上并且 是非持久性的。 如有必要,您可以使用 rfc 调用其他应用程序服务器以从其他服务器获取缓冲区。调用函数 xyz 目标 ''

参见函数 TH_SERVER_LIST。即您在 SM59 内部连接中看到的内容。

显然共享 buffer/memory 缺乏持久性是关键考虑因素。 但是,除非您仔细阅读文档,否则共享缓冲区管理器将如何根据缓冲区大小和可用内存放弃条目是不会立即显而易见的。您不能假设共享缓冲区条目在您访问它时就在那里。它很可能会,但它可以被“删除”,服务器可能会重新启动等。将它用作性能帮助工具,但始终假设该条目可能不存在。 共享内存与共享缓冲区不同,存在上限问题,需要在添加更多条目之前丢弃其他条目。两者各有利弊。

在 St02 中,在此处查找红色条目,已达到缓冲区限制。 查看当前参数按钮,它告诉您需要更改哪些配置文件参数。

此语言元素的一个重要用途是用于日志记录或用于可以重建的数据的高性能缓冲。它也非常适合 badis 等场景,如果你不能提交。您可以在不发出提交或数据库提交的情况下“保留”信息。 您甚至可以在不使用锁定的情况下更新/存储您的日志。 使用简单的原理当前工作进程没有。是独一无二的。

 CALL FUNCTION 'TH_GET_OWN_WP_NO'
  IMPORTING
    wp_index = wp_index.

使用索引号作为数据键的一部分。

如果您的内核是 7.40 或更高版本,请参阅 class CL_OBJECT_BUFFER 否则见函数 SBUF_OBJ_SHOW_OBJECT

玩得开心 Buffers/Memory。 与共享内存对象相比,共享缓冲区的一大优势是 ABAP 垃圾收集器。 SAPSYS 垃圾收集会咬你一口!