前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAP Memory & ABAP Memory超级详细解析

SAP Memory & ABAP Memory超级详细解析

作者头像
matinal
发布2020-11-27 17:24:11
2.5K0
发布2020-11-27 17:24:11
举报
文章被收录于专栏:SAP TechnicalSAP Technical

以前做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语句).

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

在程序里声明该变量:

给程序创建一个T-code

运行结果(勾上set parameter后,当修改屏幕上的数值时也会反映到SAP memory里):

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

创建一个Data Element,并创建一个Parameter ID(存在表TPARA里,以Z或Y打头):

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

绑定给table或structure:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

在Dialog里输入table-field名字时,会提示是否参照Dictionary.

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

选是了后会自动带出Parameter ID.

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

此时需要勾上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.

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

4、ABAP Memory:

1.建了个程序和FM:

将数据丢到ABAP内存'ABAP_MMR',被调用的FM是在internal session内运行(或是用submit和call transaction)。

程序代码:(类的方法里不能使用这种语法,只能用下面的第二、三种)

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

FM代码:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

运行结果,FM里可以取到ABAP memory的值。

在程序里取'ABAP_MMR'的值,调用同一个FM取值。

代码:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

如果跑完第一步的程序后不关闭窗口再跑这个程序,那么可以成功读到LV_TEST的值。

程序:

FM:

如果跑第一步的程序后用另一窗口(external session)跑第二步程序,将读取不到数值。

运行结果:

程序:

FM:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

3.如果export和import的参数名字不同,则需要指定对应参数名(很纠结的,被赋值的Lv_test_2要放在 = 右边,但用 to的话会比较直观)。

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客
SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

结果:

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

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

结果:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

5. Free Memory:会清空该external session内所有的ABAP Memory.

程序:ZTEST_SET_ABAP_MMR_4

用了Free Memory ID后'ABAP_MMR_1'和'ABAP_MMR_2'都为空,无法用import取值.

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客
SAP Memory ABAP Memory - Jinyueting.it - jinyueting.it博客

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是一样的

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档