以前做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.
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语句).
在程序里声明该变量:
给程序创建一个T-code
运行结果(勾上set parameter后,当修改屏幕上的数值时也会反映到SAP memory里):
备注:在Data Element里有一个地方可以填Parameter ID(这个方法好无聊,但SAP可能为了规范参照同一data element的parameter ID,就用了这方法…我只想到这用法,这优点).
创建一个Data Element,并创建一个Parameter ID(存在表TPARA里,以Z或Y打头):
绑定给table或structure:
在Dialog里输入table-field名字时,会提示是否参照Dictionary.
选是了后会自动带出Parameter ID.
此时需要勾上Set Parameter和Get Parameter并在代码里声明ZTESTTEST才有效.
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.
4、ABAP Memory:
1.建了个程序和FM:
将数据丢到ABAP内存’ABAP_MMR’,被调用的FM是在internal session内运行(或是用submit和call transaction)。
程序代码:(类的方法里不能使用这种语法,只能用下面的第二、三种)
FM代码:
运行结果,FM里可以取到ABAP memory的值。
在程序里取’ABAP_MMR’的值,调用同一个FM取值。
代码:
如果跑完第一步的程序后不关闭窗口再跑这个程序,那么可以成功读到LV_TEST的值。
程序:
FM:
如果跑第一步的程序后用另一窗口(external session)跑第二步程序,将读取不到数值。
运行结果:
程序:
FM:
2.如果export和import的参数名字不同,则需要指定对应参数名(很纠结的,被赋值的Lv_test_2要放在 = 右边,但用 to的话会比较直观)。
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客
结果:
3. Export多个数据放到ABAP memory里。
结果:
4. Free Memory:会清空该external session内所有的ABAP Memory.
程序:ZTEST_SET_ABAP_MMR_4
用了Free Memory ID后’ABAP_MMR_1’和’ABAP_MMR_2’都为空,无法用import取值.
5. 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是一样的