二维码

[基础语法] SAP内存(memory)和ABAP内存的区别

Twilight发表于 2014-04-28 15:57Twilight 最后回复于 2014-04-28 15:57 [复制链接] 8083 0

以前做enhancement的时候用过parameter id 和 memory id, 但很多其他语法用法我是没接触过的, 今天看了Palm同鞋做的文档SAP Memory & ABAP Memory, 做了一些测试, 本文几乎所有内容来自Palm同鞋的文档.

1、先弄清External Session 和Internal Session区别:

External Session:
当user登陆SAP后, 就开启了一个userlogon session。当user退出所有sap window, 就结束了这个user logon session。一个userlogon session最多有6个external session(即main session,对应有6个窗口).

Internal Session:
在一个external session内调用其它程序将会生成新的internal session, 比如call FM, call transaction或是submit*** and return等方式。 当关掉这个external session时,也就结束了external session下的所有internal session。一个External session最多有20个Internal session.

对于上面这几个session之间的关系可以这么简单概括:User session > external session > internal session。

SAP memory类似于全局变量,用于Externalsession间的通信,不同的externalsession都可以访问,当退出userlogon session时将清空SAPmemory(不同user对应的SAPmemory不同)。

ABAP memory类似于局部变量,用于同一externalsession下internalsession间的通信,不同的externalsession有不同的ABAPmemory,同一个externalsession里的internalsession只能访问相应session的ABAP memory。


2、网上写的两者几个不同点:

1). 使用的语句不同
SAP memory使用SET/GET parameters;
SPA:SET PARAMETER ID 'MAT' FIELD p_matnr.
GPA:GET PARAMETER ID 'MAT' FIELD p_matnr.

2).ABAP Memory使用EXPORT 和IMPORT :
EXPORT p_matnr = p_matnr TO MEMORY ID 'ZTESTMAT'.
EXPORT p_matnr = p_matnr FROM MEMORY ID 'ZTESTMAT'

FREE MEMORY ID 'ZTESTMAT'.                     清空指定的ABAPmemory
FREE MEMORY.                                               清空externalsession内的所有ABAPmemory

3)、共享范围不同
SAP memory用于所有external session间,ABAP memory用于同一个external session的internal session间。

4)、作用范围不同(就是生存期)
SAP memory在登陆到退出这期间一直有效。
ABAP memory只在同一个session(window) 内有效。

3、SAP Memory:

1). 给SAP Memory赋值
创建程序ZTEST_SET_SAP_MMR给‘SAP_MMR'赋值'12345'.

2).获取SAP Memory 的值并显示在选择屏幕
创建另一个程序ZTEST_GET_SAP_MMR,并为PR_TEST指定Memory ID ,这样SAP_MMR的值将会作为默认值显示在selection screen上。

运行结果,默认值显示在屏幕上:
因为field与SAP Memory绑定了,在selection screen上如果修改对应的值,比如将'12345'改成'123'后按F8,也将修到SAP memory的值.重新运行程序如下:

3). Dialog获取SAPMemory方式
在dialog 屏幕上建一个input field, 然后Parameter ID属性与'SAP_MMR'绑定,并打上2个勾。
Set Parameter: 允许将屏幕值返回给SAP Memory (类似于执行SET PARAMETER ID语句)
Get Parameter: 允许读取SAP Memory的值并默认显示(类似于执行GET PARAMETER ID语句).

Dialog获取SAPMemory.png
在程序里声明该变量:
给程序创建一个T-code
运行结果(勾上set parameter后,当修改屏幕上的数值时也会反映到SAP memory里):

备注:在Data Element里有一个地方可以填Parameter ID(这个方法好无聊,但SAP可能为了规范参照同一data element的parameter ID,就用了这方法....我只想到这用法,这优点).

创建一个Data Element,并创建一个Parameter ID(存在表TPARA里,以Z或Y打头)
Data Element创建一个Parameter ID.png
绑定给table或structure:
绑定给table或structure.png
在Dialog里输入table-field名字时,会提示是否参照Dictionary.
是否参照Dictionary.png
选是了后会自动带出Parameter ID.
自动带出Parameter ID.png
此时需要勾上Set Parameter和Get Parameter并在代码里声明ZTESTTEST才有效

注:选择屏幕中的参数选项 MEMORY ID的作用就等同于对话屏幕中的SET/GET Parameter,它们是作用是相同的(都是针对SAP Memory),只不过一个用于选择屏幕中,一个用于对话屏幕。

4). 通过Get parameter ID语句获取SAP memory的值,并赋给LV_TEST
如果SET Parameter ID后退出所有sessions,SAP memory将被清空,重新登陆Get Parameter ID将取到空值。
如果SET Parameter ID后其它user用Get Parameter ID也取不到相应的值。

5). TCODE SU3设置PARAMETER ID
在TCODE SU3设置了PARAMETER ID后, 运行语句GET PARAMETER ID 后就能读到设置的相关PARAMETER ID的值. 它的功能相当于SET PARAMETER ID.
SU3.png

4、ABAP Memory:

1).建了个程序和FM:
将数据丢到ABAP内存'ABAP_MMR',被调用的FM是在internal session内运行(或是用submit和call transaction)。
程序代码:(类的方法里不能使用这种语法,只能用下面的第二、三种)
程序代码.png
FM代码:
FM代码.png
运行结果,FM里可以取到ABAP memory的值。
在程序里取'ABAP_MMR'的值,调用同一个FM取值。

2).程序代码:
程序代码1.png
如果跑完第一步的程序后不关闭窗口再跑这个程序,那么可以成功读到LV_TEST的值。

FM:如果跑第一步的程序后用另一窗口(external session)跑第二步程序,将读取不到数值。
运行结果:
FM.png
3).如果export和import的参数名字不同,则需要指定对应参数名(很纠结的,被赋值的Lv_test_2要放在 = 右边,但用 to的话会比较直观)。
程序代码2.png

4). Export多个数据放到ABAP memory里。
Export多个数据放到ABAP memory.png
debug.png

5). Free Memory:会清空该external session内所有的ABAP Memory.
程序:ZTEST_SET_ABAP_MMR_4
用了Free Memory ID后'ABAP_MMR_1'和'ABAP_MMR_2'都为空,无法用import取值.
Free Memory.png

6). Free Memory ID: 清空指定ABAP Memory ID的内容, 其它的ID不受影响.
用了FREE MEMORY ID 'ABAP_MMR_3'.后, 'ABAP_MMR_3'的数据将被清空,无法取值,但'ABAP_MMR_4'不受影响,可以取到LV_TEST的值(放在LV_TEST_5里).
如果将多个变量一直放在同一ID内, 如果用了Free Memory 或是Free Memory ID(指定这个ID),那这个ID内的所有变量将被全部清空.

网上还说到另外两种传输方式.
Share Memory 或Share Buffer 用于不同用户间的数据传递.

当使用DELETE FROM SHARED BUFFER 语句或是服务器关闭后该内存才会被清空.
使用TOSHARED BUFFER要用FROMSHARED BUFFER取值.
使用TOSHARED MEMORY要用FROMSHARED MEMORY取值.

语法和普通MEMORY ID是一样的,Database  将数据存进表里, 就算服务器关了数据还存在.表INDX会多一条记录.
语法和普通MEMORY ID是一样的,关于这个memory id, database还有一些细节可以参考老白的博客
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表