SAP 内存和 ABAP 内存的区别

ABAP 程序和对象主要使用两种类型的内存:ABAP 内存SAP 内存。与 SAP 内存相比,ABAP 内存的范围非常有限,可以由一个主内部会话访问,而 SAP 内存可供主会话外部的程序或对象访问。ABAP 存储器是程序员可用于跨程序传输值的重要工具之一。它有助于最大限度地减少数据库使用,还有助于最大限度地提高应用程序的速度和效率。

SAP 内存的感念

SAP 内存是 SAP GUI 中所有主会话都能访问的内存区域。SAP 内存既可用于在会话中将数据从一个程序传递到另一个程序,也可用于将数据从一个会话传递到另一个会话。使用 SAP 内存的应用程序必须使用 SPA/GPA 参数(也称为 SET/GET 参数)。

可以使用 SET PARAMETER 语句为特定用户或特定程序设置这些参数。然后,其他 ABAP 程序可使用 GET PARAMETER 语句检索所设置的参数。SPA/GPA 参数最常用于填充屏幕上的输入字段。

语法结构:

ABAP 复制代码
SET PARAMETER ID '<parameter id>' FIELD <'value'/variable>.
GET PARAMETER ID '<parameter id>' FIELD <'value'/variable>.

SAP PARAMETER 通常用于将参数值存储在全局 SAP 内存中。ABAP 开发人员使用 SET PARAMETER ID 命令将参数值存储在 SAP 内存中。使用 GET PARAMETER ID 语句,可以轻松地将以前设置的参数值读入其他 ABAP 报告或程序中的局部变量中。

SAP 内存使用示例

目前,我用的最多的就是在 ALV 单元格中调用标准事务,比如在物料单元格一栏调用 MM03 就可以这样使用:

vbnet 复制代码
DATA l_matnr TYPE mara-matnr.

WHEN '&IC1'.                 "单击事件的功能
  CASE rs_selfield-fieldname.
    WHEN 'MATNR'.
      l_matnr = rs_selfield-value.
      SET PARAMETER ID 'MAT' FIELD l_matnr.
      CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
    WHEN OTHERS.
  ENDCASE.

只要单击物料单元格中的物料号,就能直接跳转到 MM03 屏幕进行查看。

也可以在一些自定义程序中进行变量传递,通过 SUBMIT 语句,

在程序 1 中写入如下代码:

ABAP 复制代码
REPORT zreport1.

DATA: para_string(20) TYPE c.

para_string = 'Hello, World!'.
* set parameter value
SET PARAMETER ID 'Z_MY_PARAMETER_1' FIELD para_string.

SUBMIT zreport2. " execute second ABAP program

然后,在设置参数后将执行的其他ABAP程序中,您可以使用 GET Parameter ID 命令读取先前设置的参数值。

程序 2 中的代码如下:

ABAP 复制代码
REPORT ZREPORT2.  
  
DATA get_param(20) TYPE c.  
* get parameter value, read from SAP parameter into local variable  
  
GET PARAMETER ID 'Z_MY_PARAMETER_1' FIELD get_param.  
WRITE get_param. " write parameter value on screen

然后我们回到程序 1 中进行执行,可以看到程序调用到 ZREPORT2 中进行打印输出:"Hello, World!"

ABAP 内存的概念

在 SAP 中,使用 ABAP 内存是一种在 SAP 应用程序中存储和共享数据的方法。它是使用 ABAP 语言开发的 SAP 应用程序中使用的内存区域。ABAP 内存允许临时存储来自不同程序或进程的数据,使其可供其他程序访问。

ABAP 内存是 ABAP 程序和对象使用的临时内存存储,这些程序和对象对所有活动使用相同的内部会话或相同的内存区域。与被视为全局内存的 SAP 内存相比,ABAP 内存是本地内存。ABAP 存储器独立于生成它的 ABAP 程序或对象,因此可以在不同的对象或程序之间传输值,而不管它们的特征如何。这对于在同一会话中实时运行的程序特别有用。

通过 ABAP 内存传输的值不会存储在任何 SAP 表中。要访问 ABAP 内存,使用关键字 Export to MemoryImport from Memory 语句。

  • Export to Memory 用于从 ABAP 内存读取数据
  • Import from Memory 用于从 ABAP 内存写入数据

语法结构:

ABAP 复制代码
EXPORT <variable/internal table> TO MEMORY ID 'idname'.
IMPORT <variable/internal table> FROM MEMORY ID 'idname'.

ABAP 内存使用场景

让我们用一个例子来说明这一点。想象一下,一个处理客户订单的 SAP 程序。该程序可以使用 ABAP 内存来临时存储订单。在整个程序执行过程中,订单将存储在 ABAP 内存中。除了这个程序之外,另一个程序可以从 ABAP 存储器访问这些订单以执行自己的操作。这样,不同程序之间的数据共享就得到了促进,防止了数据重复。

例如,如果需要为订单开票,开票程序可以从 ABAP 内存中检索订单信息并执行开票流程。这样,订单信息可以在不同的程序之间共享,从而确保数据的一致性。

由于 ABAP 内存用于临时数据存储,因此当系统关闭时,其中包含的数据将丢失。数据传输只能在同一会话中进行。

ABAP 内存使用示例

在物料屏幕中,如果是自定义字段,这个程序的保存可以做在屏幕中,但是这种处理方式会导致(在屏幕中进行操作就会)频繁的写入数据库,此时就可以传到 ABAP 内存中,让用户出口 ZXMG0U02 来接受,这种只有在用户点击保存事件时才会触发。

在自定义屏幕中写入如下程序:

ABAP 复制代码
APPEND ls_basic3 TO lt_zmmt_basic3.

" 传递给ZXMG0U02去保存
EXPORT zmmt_basic3 = lt_zmmt_basic3 TO MEMORY ID 'MERY_ZMMT_BASIC3'.

然后在 ZXMG0U02 中进行接收和处理:

ini 复制代码
IF sy-tcode <> 'MM03' AND ( sy-ucomm = 'BU' OR sy-ucomm = 'YES' OR sy-ucomm = 'ENSURE' OR sy-ucomm = 'ENTR').
  DATA: lt_zmmt_basic3 TYPE TABLE OF zmmt_basic3.

  IMPORT zmmt_basic3 = lt_zmmt_basic3 FROM MEMORY ID 'MERY_ZMMT_BASIC3'.
  
  IF lt_zmmt_basic3[] IS NOT INITIAL.
    DELETE FROM zmmt_basic3 WHERE matnr = wmara-matnr.
    MODIFY zmmt_basic3 FROM TABLE lt_zmmt_basic3[].
    IF sy-subrc = 0.
      COMMIT WORK AND WAIT.
    ELSE.
      ROLLBACK WORK.
    ENDIF.
    
  ENDIF.
ENDIF.

SAP 内存和 ABAP 内存的区别

  1. 读取和使用方式不同
  • SAP 内存使用 SET/GET parameters 方法
  • ABAP 内存使用 EXPORTIMPORT 方法
  1. 共享范围不同
  • SAP 内存可以被所有的主 Session 访问,内存数据可以在同一个 Session 中不同程序之间,或者不同 Session 之间
  • ABAP 只能在同一个 Session 的不同程序之间共享数据
  1. 作用范围不同
  • SAP 内存在整个终端 Session 时间内都有效
  • ABAP 内存只能在一个 Session 时间内有效
  1. 使用一般原则
  • SAP 内存用于屏幕默认值输入
  • ABAP 内存用于模块之间传递数据

总结

ABAP 内存只能在程序中使用,程序结束时清空。SAP 内存可供登录的所有程序使用,只有在退出登录时才会被清除。

具体使用请结合世界业务需求进行使用,建议使用完内存进行清理释放:FREE MEMORY ID 'MERY_ZMMT_BASIC3'.

相关推荐
Lynko5 分钟前
C语言指针高阶
后端
the局外人6 分钟前
学习 FastAPI 的 Day 2:用异步 ORM 完成增删改查
后端·python·fastapi
SamDeepThinking11 分钟前
if嵌套最好控制在3层以内
java·后端·程序员
苏渡苇13 分钟前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
java·后端·spring·spring cloud·springboot·性能监控
tonydf14 分钟前
AI驱动历史项目安全审查
后端·ai编程
她的男孩30 分钟前
同一个接口,为什么销售只看到自己的订单?我拆了 681 行数据权限拦截器的源码
java·后端·架构
元界metalite32 分钟前
SpringBoot接口通用响应对象设计 - 一个 Resp 管理五种责任
后端
对象存储与RustFS35 分钟前
把 RustFS 跑在 Kubernetes 上:官方 Helm Chart 从单机到分布式
后端·rust·开源
SimonKing1 小时前
将cURL 命令直接变成 Java 代码?用JQuick-Curl搞起来
java·后端·程序员
大牧师1 小时前
Nest.js 微服务入门教程
开发语言·javascript·后端·微服务·node.js·nest.js·nest