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 Memory
和 Import 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 内存的区别
- 读取和使用方式不同
- SAP 内存使用
SET/GET parameters
方法 - ABAP 内存使用
EXPORT
和IMPORT
方法
- 共享范围不同
- SAP 内存可以被所有的主 Session 访问,内存数据可以在同一个 Session 中不同程序之间,或者不同 Session 之间
- ABAP 只能在同一个 Session 的不同程序之间共享数据
- 作用范围不同
- SAP 内存在整个终端 Session 时间内都有效
- ABAP 内存只能在一个 Session 时间内有效
- 使用一般原则
- SAP 内存用于屏幕默认值输入
- ABAP 内存用于模块之间传递数据
总结
ABAP 内存只能在程序中使用,程序结束时清空。SAP 内存可供登录的所有程序使用,只有在退出登录时才会被清除。
具体使用请结合世界业务需求进行使用,建议使用完内存进行清理释放:FREE MEMORY ID 'MERY_ZMMT_BASIC3'.
。