用户登陆后,最多一个系统可以开6个窗口,这在SAP中称为External Mode。而同一个窗口中,运行某程序后,可以通过CALL TRANSACTION/SUBMIT或其他代码跳转到其他程序,这个称为Internal Mode。Internal Mode的调用栈最多为9层。那么ABAP Memory,它是属于Internal Mode间可以共享的数据,而External Mode间无法共享。所以,ABAP Memorcy只能在同一窗体中共享,这与浏览器中的Session是一样的。
1、ABAP Memory
在同一用户的当前窗口session实现数据共享,用到的IMPORT/EXPORT
保存数据:EXPORT<f1>[FROM <g1>] <f2> [FROM <g2>] ... TO MEMORY ID <key>.
如果省略from则被存储的数据就来源当前程序中与F1同名的变量,否则就等于from后面的常量。
DATA text1(10) VALUE 'Exporting'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO 5 TIMES.
itab-bookid = 100 + sy-index.
APPEND itab.
ENDDO.
"将 text1 与 text2都存储到 text ID的名下
EXPORT text1 "数据来源于上面定义的 text1变量,并以text1名分类存储
text2 FROM 'Literal'"数据直接来源于From后面指定的常量字符串,也以text1名分类存储
TO MEMORY ID 'text'.
"将前面定义的itab存储到以table为ID的内存中,并以itab名分类存储
EXPORT itab TO MEMORY ID 'table'.
读取数据:IMPORT <f1> [TO <g1>] <f2> [TO <g2>] ... FROM MEMORY ID <key>.
如果忽略选项TO<gi>,则将内存中的数据对象<fi>赋给程序中的同名数据对象;如果使用此选项,则将内存中的数据对象<fi>写入字段<gi>中。IMPORT中的<fi>必须与EXPORT中的<fi>名称相同。
删除数据:
FREE MEMORY [ID <key>].
与DELETE FROM MEMORY ID id.等效
如果是标准的程序,不方便在里面增加ABAP memory,这时候可以submit/call transaction 的方式,然后用指针的方式获取内存。
FIELD-SYMBOLS: <ft> TYPE tt_resb_bt,
<fs> TYPE ts_resb_bt.
ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <ft>.
注:
IMPORT / EXPORT 还有一个很常用的用途,针对 含有 LRAW类型的表,IMPORT / EXPORT 是用来实现数据的增加和读取。
簇数据库:带LRAW类型的表必须满足特定规则才能够建立,特点是LRAW数据类型可以存在非扁平结构,而且本身是一种压缩类型,相比RAWSTRING能够节省内存空间。如系统标准表INDX、
具体详细信息可参考下面:
https://blog.csdn.net/weixin_42646630/article/details/106640947
2、SAP Memory
同一客户端的不同窗口的数据共享需要通过SAP Memory,
保存数据:SET PARAMETER ID ,读取数据:GET PARAMETER ID
注:调试时,可通过Goto -> Systerm -> SAP Memory,查看对应值。SAP Memory与本次登陆有关,用户注销才会失效。数据字典的Date Element 中可定义Parameter ID,当该字段作为屏幕元素的时候,会读取刚刚保存的parameter id值作为默认值。
3、跨client 内存
前面都是用户内存,不同用户之间也可以实现数据共享.
SHARED MEMORY/SHARED BUFFER
两种的作用是一样的,最大不同是在数据达到最大内存限制时的处理方式不同:最大内存限制值分别是通过rsdb/esm/buffersize_kb (SHARED MEMORY)、rsdb/obj/buffersize (SHARED BUFFER)来设置的,当内存占用快满时,SHARED MEMORY必须通过DELETE FROM SHARED MEMORY来手动清理,而SHARED BUFFER会自动删除很少被使用到的数据(当然也可以通过DELETE FROM SHARED BUFFER手动及时的删除不用的数据)
例子. 创建程序A,输入:
DATA matnr TYPE matnr.
IMPORT matnr FROM SHARED BUFFER indx(aa) ID 'YTEST_MATNR '.
WRITE matnr.
创建程序B,输入:
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.
EXPORT matnr TO SHARED BUFFER indx(aa) ID 'YTEST_MATNR'.
先在用户1的电脑上运行程序B,然后在用户2的电脑上运行程序A,发现用户2可以读取到值。
注:所有用户都共享空间,所以该值会保存到服务器关机重启为止,除非用户删除清空,这一点和锁有点相识。数据库可以共享数据,但是服务器共享会更加快速。
删除:
DELETE FROMSHARED BUFFER dbtab(ar) [CLIENT cl] ID id
DELETE FROMSHARED MEMORY dbtab(ar) [CLIENT cl] ID id
https://www.cnblogs.com/jiangzhengjun/p/4293544.html