ABAP内存和SAP内存

一、ABAP内存和SAP内存定义

1、ABAP内存

定义:ABAP内存是ABAP程序内部的一种内存区域,用于在同一个用户会话中,存储和共享数据。它是程序中临时保存数据的地方,可以在不同的ABAP程序、函数模块、报告等之间进行数据传递。

生命周期:ABAP内存的生命周期通常限于用户的当前会话。当会话结束时,ABAP内存中的数据会被清除。(SAP通常一个会话对应一个窗口)

数据访问方式:可以使用EXPORTIMPORT语句将数据存入和从ABAP内存中取出。数据存放在一个全局内存区域中,所有同一会话的ABAP程序都可以访问。

使用场景:主要用于在同一会话中的不同程序、报告或者函数模块之间传递数据,避免重复的数据库查询,提高性能。

2、SAP内存

定义:SAP内存是SAP系统中的一个全局内存区域,所有的SAP系统用户和会话都可以访问。它用于在整个SAP系统范围内保存和共享数据。与ABAP内存不同,SAP内存不仅仅局限于ABAP程序,还可以被SAP系统的其他组件(如UI、RFC等)访问。

生命周期:SAP内存的生命周期是基于用户会话的,直到会话结束时,SAP内存中的数据才会被清除。不同用户的SAP内存是隔离的,因此一个用户会话中的数据对其他用户会话不可见。

数据访问方式:SAP内存数据的读写通常使用SETGET语句,数据存储在SAP的内存中,不仅限于ABAP程序,还可以通过RFC等进行访问。

使用场景:用于跨ABAP程序的数据传递。例如,用户在一个程序中设置某个值,在另一个程序中获取。

二、使用场景

1、ABAP内存中数据的读写

a、在程序ZVIA_MEMORY_SET中写语句。往ABAP内存中写入数据。

EXPORT 数据名 TO MEMORY ID ID名.

REPORT ZVIA_MEMORY_SET.

* 向ABAP内存写入数据 *
DATA lv_abapmmr TYPE string.
lv_abapmmr = 'ABAP MEMORY'.
EXPORT lv_abapmmr TO MEMORY ID 'VIA_ABAP_MEMORY'.
WRITE : 'ABAP内存写入成功'.
b、在程序ZVIA_MEMORY_GET中写语句。从ABAP内存中读取数据。

IMPORT 数据名 FROM MEMORY ID ID名.

注意这里的ID名要和需要读取的写入的ID名相同。数据名可以不同,按照当前程序的定义。

REPORT ZVIA_MEMORY_GET.

* 读取ABAP内存数据 *
DATA lv_abapmmr TYPE string.
IMPORT lv_abapmmr FROM MEMORY ID 'VIA_ABAP_MEMORY'.
WRITE : 'ABAP MEMORY:',lv_abapmmr.
c、运行两个程序。 
1)在不同的会话(不同的GUI窗口)中运行。

运行ZVIA_MEMORY_SET,写入成功。

另一个会话运行 ZVIA_MEMORY_GET。

在不同的会话中,读取不到ABAP内存中的数据。因为ABAP内存中的数据只能用于用户的同一个会话中,通常一个GUI窗口对应一个会话,在另一个GUI窗口时读取不到。

2)在同一个会话中(同一个GUI窗口中先运行SET完成后返回再运行GET)运行两个程序。

ZVIA_MEMORY_SET运行结果。

 ZVIA_MEMORY_GET运行结果。

在同一个会话中是可以读取到的。

2、SAP内存中数据的读写。

a、在程序ZVIA_MEMORY_SET中写语句。往SAP内存中写入数据。

SET PARAMETERS ID ID名 FIELD 数据名.

REPORT ZVIA_MEMORY_SET.

* 向SAP内存写入数据 *
DATA lv_sapmmr TYPE c LENGTH 25.
lv_sapmmr = 'SAP MEMORY'.
SET PARAMETER ID 'VIA_SAP_MEMORY' FIELD lv_sapmmr.
WRITE : / 'SAP内存写入成功'.
b、在程序ZVIA_MEMORY_GET中写语句。从SAP内存中读取数据。

GET PARAMETERS ID ID名 FIELD 数据名.

注意这里的ID名要和需要读取的写入的ID名相同。数据名可以不同,按照当前程序的定义。

REPORT ZVIA_MEMORY_GET.

* 读取SAP内存数据 *
DATA lv_sapmmr TYPE c LENGTH 25.
GET PARAMETER ID 'VIA_SAP_MEMORY' FIELD lv_sapmmr.
WRITE : / 'SAP MEMORY:',lv_sapmmr.
c、运行两个程序。 
1)在同一个会话中(同一个GUI窗口中先运行SET完成后返回再运行GET)运行两个程序。

ZVIA_MEMORY_SET运行结果。

ZVIA_MEMORY_GET运行结果。读取到了。

2)在不同的会话(不同的GUI窗口)中运行。

也是可以读取到的,因为 SAP内存的数据是全局内存,所有程序都可以进行访问。

3、下面的两个简单的程序演示了程序间怎么通过内存传递数据。可以运行了解。

*******SET*******
TABLES : ekpo.
PARAMETERS :
  p_bukrs TYPE ekpo-bukrs.

START-OF-SELECTION.

** 程序之间的调用 *
*  *
*SUBMIT zvia_memory_get_ekpo
*  "WITH p_bukrs = p_bukrs"传入参数值
*  VIA SELECTION-SCREEN"显示被调用程序的选择画面
*  AND RETURN."调用其他人的程序,在执行之后,返回继续执行当前程序
*WRITE : '执行完毕'.

** ABAP内存给参数 *
*  EXPORT p1 = p_bukrs TO MEMORY ID 'ZBUKRS'."传入数据
*  SUBMIT zvia_memory_get_ekpo
*  AND RETURN.
*  WRITE : '执行完毕'.

** SAP内存给参数 *
*  SET PARAMETER ID 'ZBUKRS' FIELD p_bukrs.
*  SUBMIT zvia_memory_get_ekpo
*   AND RETURN.
*  WRITE : '执行完毕'.
*******GET*******
TABLES : ekpo.
DATA :
  p_bukrs TYPE ekpo-bukrs.

INITIALIZATION.
  p_bukrs = '1000'.

START-OF-SELECTION.
** 从ABAP内存读参数 *
*  DATA : lv_bukrs TYPE ekpo-bukrs.
*  IMPORT p1 = lv_bukrs FROM MEMORY ID 'ZBUKRS'.
*  IF lv_bukrs IS NOT INITIAL.
*    p_bukrs = lv_bukrs.
*  ENDIF.
*  SELECT ebeln,ebelp,bukrs
*    FROM ekpo
*    INTO TABLE @DATA(lt_ekpo)
*    WHERE bukrs = @p_bukrs.
*  IF sy-subrc = 0.
*    cl_demo_output=>display( lt_ekpo ).
*  ENDIF.

** 从SAP内存读参数 *
*DATA : lv_bukrs TYPE ekpo-bukrs.
*GET PARAMETER ID 'ZBUKRS' FIELD lv_bukrs.
*IF lv_bukrs IS NOT INITIAL.
*  p_bukrs = lv_bukrs.
*ENDIF.
*  SELECT ebeln,ebelp,bukrs
*     FROM ekpo
*     INTO TABLE @DATA(lt_ekpo)
*     WHERE bukrs = @p_bukrs.
*  IF sy-subrc = 0.
*    cl_demo_output=>display( lt_ekpo ).
*  ENDIF.

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值