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'.

相关推荐
小_太_阳40 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
搬码后生仔2 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net
凡人的AI工具箱2 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
Lx3523 小时前
Pandas数据重命名:列名与索引为标题
后端·python·pandas
小池先生3 小时前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
百罹鸟3 小时前
【vue高频面试题—场景篇】:实现一个实时更新的倒计时组件,如何确保倒计时在页面切换时能够正常暂停和恢复?
vue.js·后端·面试
小蜗牛慢慢爬行4 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
wm10435 小时前
java web springboot
java·spring boot·后端
龙少95437 小时前
【深入理解@EnableCaching】
java·后端·spring