SAP Memory ABAP Memory超级详细解析
SAP Memory & ABAP Memory超级详细解析_abap set parameter id-CSDN博客
FREE MEMORY ID 'ZTESTMAT'. 清空指定的ABAPmemory
FREE MEMORY. 清空externalsession内的所有ABAPmemory
最后请注意
IMPORT .... FROM MEMORY ID ....
该语句执行未接收到数据会将sy-subrc赋值为不等于零
转:ABAP MEMORY/SAP MEMORY/Shared buffer/DATABASE_abap to shared buffer-CSDN博客
REPORT ZTXYY_11131.
DATA LV_FLAG.
LV_FLAG = 'X'.
EXPORT LV_FLAG TO MEMORY ID 'ZTXYY_11130'.
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA LV_FLAG.
IMPORT LV_FLAG FROM MEMORY ID 'ZTXYY_11130'.
WRITE LV_FLAG.
结果
REPORT ZTXYY_11131.
DATA LV_FLAG.
LV_FLAG = 'X'.
EXPORT PV = LV_FLAG TO MEMORY ID 'ZTXYY_11130'.
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA LV_FLAG.
IMPORT PV = LV_FLAG FROM MEMORY ID 'ZTXYY_11130'.
WRITE LV_FLAG.
结果
REPORT ZTXYY_11131.
DATA LV_FLAG.
LV_FLAG = 'X'.
EXPORT PV FROM LV_FLAG TO MEMORY ID 'ZTXYY_11130'.
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA LV_FLAG.
IMPORT PV TO LV_FLAG FROM MEMORY ID 'ZTXYY_11130'.
WRITE LV_FLAG.
结果
在动态情况下,参数列表在带有两列的索引表 ptab 中指定。这两列可以有任何名称,但必须是 “字符 ”类型。ptab 的第一列必须包含参数名称,第二列必须包含大写的数据对象。如果第二列是首列,则第一列中的参数名称必须与数据对象的名称一致。然后,数据对象将以其名称存储在数据集群中。如果 ptab 的第一列为初始值,则会出现不可处理异常。
REPORT ZTXYY_11131.
DATA LV_FLAG.
LV_FLAG = 'X'.
DATA QR TYPE STANDARD TABLE OF STRING.
APPEND INITIAL LINE TO QR ASSIGNING FIELD-SYMBOL(<FW>).
"这里的指针是工作区哦!
<FW> = 'LV_FLAG'.
EXPORT (QR) TO MEMORY ID 'ZTXYY_11130'.
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA LV_FLAG.
DATA QR TYPE STANDARD TABLE OF STRING.
APPEND INITIAL LINE TO QR ASSIGNING FIELD-SYMBOL(<FW>).
"这里的指针是工作区哦!
<FW> = 'LV_FLAG'.
IMPORT (QR) FROM MEMORY ID 'ZTXYY_11130'.
FREE MEMORY ID 'ZTXYY_11130'.
WRITE LV_FLAG.
TYPES: BEGIN OF tab_type, para TYPE string, dobj TYPE string, END OF tab_type. DATA: id TYPE c LENGTH 10 VALUE 'TEXTS', text1 TYPE string VALUE `IKE`, text2 TYPE string VALUE `TINA`, line TYPE tab_type, itab TYPE STANDARD TABLE OF tab_type. line-para = 'P1'.
line-dobj = 'TEXT1'.
APPEND line TO itab. line-para = 'P2'.
line-dobj = 'TEXT2'.
APPEND line TO itab. EXPORT (itab) TO MEMORY ID id.
IMPORT p1 = text2 p2 = text1 FROM MEMORY ID id.
DATA LV_FLAG.
DATA LV_FLAG2.
LV_FLAG = 'X'.
LV_FLAG2 = 'D'.
TYPES: BEGIN OF QRTY,Q1 TYPE C LENGTH 10,Q2(10),
END OF QRTY.
DATA QR TYPE STANDARD TABLE OF QRTY.
APPEND INITIAL LINE TO QR ASSIGNING FIELD-SYMBOL(<FW>).
"这里的指针是工作区哦!
<FW>-Q1 = 'PV'.
<FW>-Q2 = 'LV_FLAG'.
APPEND INITIAL LINE TO QR ASSIGNING <FW>.
<FW>-Q1 = 'PV3'.
<FW>-Q2 = 'LV_FLAG2'.
EXPORT (QR) TO MEMORY ID 'ZTXYY_11130'.
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA LV_FLAG.
DATA LV_FLAG2.
TYPES: BEGIN OF QRTY,Q1 TYPE C LENGTH 10,Q2(10),
END OF QRTY.
DATA QR TYPE STANDARD TABLE OF QRTY.
APPEND INITIAL LINE TO QR ASSIGNING FIELD-SYMBOL(<FW>).
"这里的指针是工作区哦!
<FW>-Q1 = 'PV'.
<FW>-Q2 = 'LV_FLAG'.
APPEND INITIAL LINE TO QR ASSIGNING <FW>.
<FW>-Q1 = 'PV2'.
<FW>-Q2 = 'LV_FLAG2'.
IMPORT (QR) FROM MEMORY ID 'ZTXYY_11130'.
FREE MEMORY ID 'ZTXYY_11130'.
WRITE LV_FLAG.
WRITE:/ LV_FLAG2.
结果
该新增项指定是否压缩数据集群中的数据。默认情况下,除了中型数据库表之外,所有内存介质的压缩都是停用的。如果需要压缩,必须使用 “开启 ”打开。如果存储在数据库表中,则默认开启压缩,只有指定 OFF 时才会关闭压缩。
DATA LV_FLAG.
DATA LV_FLAG2.
LV_FLAG = 'X'.
LV_FLAG2 = 'D'.
TYPES: BEGIN OF QRTY,Q1 TYPE C LENGTH 10,Q2(10),
END OF QRTY.DATA QR TYPE STANDARD TABLE OF QRTY.
APPEND INITIAL LINE TO QR ASSIGNING FIELD-SYMBOL(<FW>).
"这里的指针是工作区哦!
<FW>-Q1 = 'PV'.
<FW>-Q2 = 'LV_FLAG'.
APPEND INITIAL LINE TO QR ASSIGNING <FW>.
<FW>-Q1 = 'PV3'.
<FW>-Q2 = 'LV_FLAG2'.EXPORT (QR) TO MEMORY ID 'ZTXYY_11130' COMPRESSION ON."OFF
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA LV_FLAG.
DATA LV_FLAG2.
TYPES: BEGIN OF QRTY,Q1 TYPE C LENGTH 10,Q2(10),
END OF QRTY.DATA QR TYPE STANDARD TABLE OF QRTY.
APPEND INITIAL LINE TO QR ASSIGNING FIELD-SYMBOL(<FW>).
"这里的指针是工作区哦!
<FW>-Q1 = 'PV'.
<FW>-Q2 = 'LV_FLAG'.
APPEND INITIAL LINE TO QR ASSIGNING <FW>.
<FW>-Q1 = 'PV2'.
<FW>-Q2 = 'LV_FLAG2'.
IMPORT (QR) FROM MEMORY ID 'ZTXYY_11130'.
FREE MEMORY ID 'ZTXYY_11130'.
WRITE LV_FLAG.
WRITE:/ LV_FLAG2.
REPORT ZTXYY_11131.
TYPES:
BEGIN OF tab_type,col1 TYPE I,col2 TYPE I,
END OF tab_type.DATA:wa_indx TYPE demo_indx_table,wa_itab TYPE tab_type,itab TYPE STANDARD TABLE OF tab_type.WHILE sy-INDEX < 100.wa_itab-col1 = sy-INDEX.wa_itab-col2 = sy-INDEX ** 2.APPEND wa_itab TO itab.
ENDWHILE.wa_indx-timestamp = sy-datum && sy-uzeit.
wa_indx-userid = sy-uname.EXPORT tab = itab
TO DATABASE demo_indx_table(SQ) "最终存在demo_indx_table表中
"FROM wa_indx "可加可不加不影响执行
ID 'TABLE'.
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
TYPES:
BEGIN OF tab,col1 TYPE I,col2 TYPE I,
END OF tab.DATA:wa_indx TYPE demo_indx_table,itab TYPE STANDARD TABLE OF tab.
"DELETE FROM DATABASE demo_indx_table(SQ) ID 'TABLE'.
IMPORT tab = itab
FROM DATABASE demo_indx_table(SQ)
"CLIENT '311' "控制客户端
"TO wa_indx "可加可不加不影响执行
ID 'TABLE'.cl_demo_output=>write_data( wa_indx-timestamp ).
cl_demo_output=>write_data( wa_indx-userid ).
cl_demo_output=>display_data( itab ).
在 TO 之后,可以指定与数据库表 dbtab 具有相同数据类型的工作区 wa。导入时,介于字段 SRTF2 和 CLUSTR 之间的数据库字段值将分配给 wa 中的同名组件。如果在类中未指定添加 TO wa,则这些组件中不会进行数据传输。如果在类外未指定添加 TO wa,但使用语句 TABLES 声明了数据库表 dbtab 的表工作区,则这些数据库字段的值将在导入时分配给表工作区 dbtab 的同名组件。
如果数据库表 dbtab 是特定于客户的,则可在 CLIENT 后指定一个扁平字符字段 cl。该字段包含客户 ID。如果未指定加法,则使用当前客户端。
REPORT ZTXYY_11131.
DATA LV_FLAG TYPE XSTRING.
DATA LV_FLAG2.
DATA LV_FLAG3 TYPE XSTRING.
DATA dbtab LIKE indx.
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.
EXPORT matnr TO SHARED BUFFER INDX(ar)
FROM DBTAB
CLIENT '302' "控制客户端
ID 'YTEST_MATNR'.
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA dbtab LIKE indx.
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.
IMPORT matnr FROM SHARED BUFFER INDX(ar)
TO DBTAB
CLIENT '302' "控制客户端
ID 'YTEST_MATNR'.cl_demo_output=>display_data( matnr ).
cl_demo_output=>display_data( DBTAB ).
REPORT ZTXYY_11131.
DATA LV_FLAG TYPE XSTRING.
DATA LV_FLAG2.
DATA LV_FLAG3 TYPE XSTRING.
DATA dbtab LIKE indx.
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.EXPORT matnr TO SHARED MEMORY INDX(ar)
FROM DBTAB
CLIENT '302' "控制客户端
ID 'YTEST_MATNR'.SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA dbtab LIKE indx.
DATA: matnr TYPE matnr.
IMPORT matnr FROM SHARED MEMORY INDX(ar)
TO DBTAB
CLIENT '302' "控制客户端
ID 'YTEST_MATNR'.
cl_demo_output=>display_data( matnr ).
cl_demo_output=>display_data( DBTAB ).
该语句将使用 EXPORT 语句写入数据库表 dbtab 的数据集群的所有数据对象的内容表传递给内部表 itab,数据库表 dbtab 的 ID 位于 id 中指定的区域 ar 中。数据库表 dbtab 的设置方法必须与 EXPORT 语句(类似 INDX)的设置方法相同。ID 是一个平面字符型数据对象,包含数据集群的 ID,必须直接指定两个字符的区域 ar。添加的 TO 和 CLIENT 与语句 IMPORT 中描述的数据集群重要数据的相关性相同。
对于 itab,允许使用行类型与 ABAP 字典中 CDIR 结构相匹配的索引表。下表列出了 CDIR 结构的组件及其相关性。
组件 类型 含义
NAME CHAR(30) 保存数据对象的参数名称。
OTYPE: CHAR(1) 所保存数据对象的一般类型。允许使用以下值: F “表示基本的平面数据对象,”G “表示字符串,”R “表示平面结构,”S “表示深层结构,”T “表示具有平面行类型的内部表,”C "表示具有深层行类型的表。
FTYPE CHAR(1) 所保存数据对象的更具体类型。对于基本数据对象和具有基本行类型的内部表,数据或行类型将根据 DESCRIBE FIELD ... 的返回值表返回。类型的返回值表。对于平面结构和具有平面结构行类型的内部表,将返回 “C”。对于深层结构和具有深层结构行类型的内部表,将返回 “v”。如果表的行类型是内部表,则返回 “h”。
TFILL INT4 已保存数据对象的填充长度。对于字符串,返回以字节为单位的内容长度,对于内部表格,返回行数。对于其他数据对象,返回值为 0。
FLENG INT2 保存的数据对象或保存的表格行的长度(字节)。对于字符串,返回值为 8。
REPORT ZTXYY_11131.
DATA: f1 TYPE decfloat16,f2 TYPE TABLE OF I,f3 TYPE spfli.
DATA:wa_indx TYPE demo_indx_table.
DATA itab TYPE STANDARD TABLE OF cdir.f2 = VALUE #( FOR j = 1 UNTIL j > 10 ( j ) ).EXPORT par1 = f1
par2 = f2
par3 = f3 TO DATABASE demo_indx_table(HK)
CLIENT '302' "控制客户端
ID 'HK'.
SUBMIT ZTXYY_11130.
REPORT ZTXYY_11130.
DATA:wa_indx TYPE demo_indx_table.
DATA itab TYPE STANDARD TABLE OF cdir.
IMPORT DIRECTORY INTO itab FROM DATABASE demo_indx_table(HK)
CLIENT '302' "控制客户端
ID 'HK'.
cl_demo_output=>display_data( itab ).
如果使用 TABLES 为相关数据库表声明了表工作区 dbtab,则可以为 IMPORT FROM DATABASE 指定此附加项。不允许添加 TO wa。数据不会从数据库表导入。而是调用子程序 subr。在子程序中,必须在表工作区 dbtab 中提供数据集群的第一行,就像从数据库中读取一样。然后,该子程序将根据需要自动调用,直到导入一个完整的数据集群。每次调用时,都必须相应填写表工作区 dbtab。
子程序必须在同一程序或明确指定的程序(prog)中定义。其名称必须以数据库表的名称(“dbtab”)为前缀。子程序必须有一个任意类型的 USING 参数,目前没有提供。
使用后数据信息不会存入数据库表demo_indx_table
REPORT ZTXYY_11131.
TABLES demo_indx_table.DATA demo_indx_tab TYPE TABLE OF demo_indx_table.DATA sflight_tab TYPE TABLE OF sflight.
SELECT * FROM sflight INTO TABLE @sflight_tab.
EXPORT sflight_tab TO DATABASE demo_indx_table(fl) ID 'FLIGHTS'
USING demo_indx_table_export.demo_indx_table-srtf2 = 0.
IMPORT sflight_tab FROM DATABASE demo_indx_table(fl) ID 'FLIGHTS'
USING demo_indx_table_import.
cl_demo_output=>display_data( sflight_tab ).
FORM demo_indx_table_import USING foo.demo_indx_table = demo_indx_tab[ srtf2 = demo_indx_table-srtf2 ].demo_indx_table-SRTF2 = demo_indx_table-srtf2 + 1.
ENDFORM.
FORM demo_indx_table_export USING foo.APPEND demo_indx_table TO demo_indx_tab.
ENDFORM.
这些新增功能允许将数据集群中保存的数据导入到非类型友好型数据对象中。它们还定义了适当的转换规则。下表显示了从不同缓冲区导入数据时可以使用的附加项。列标题是以下缓冲区的缩写: 数据缓冲区 (B)、内存 (M)、共享内存 (SM)、共享缓冲区 (SB)、数据库 (DB) 和内部表 (IT)。
该新增内容扩展了参数列表中的规则,适用于数据集群中源字段和目标字段 dobj 的不同数据类型:
◾ 除了 c 类型的数据对象外,对于 n、p 或 x 类型的数据对象,目标字段可以比源字段长。
◾源字段类型为
-类型的源字段可以读入 s、i 和 int8 类型的目标字段。
可将 -s 读入 i 和 int8 类型的目标字段(但负数处理不当)
-i 可以读入 int8 类型的目标字段
◾ c 类型的源字段可导出为 string 类型的目标字段,x 类型的源字段可导出为 xstring 类型的目标字段。
◾ 如果涉及的组件是以相同方式设置的源结构或目标结构的最后一个组件,上述规则也同样适用。
◾在目标结构中,如果结构的其他设置方式相同,子结构也可以比源结构的子结构拥有更多的组件。多余的组件将提供类型友好的初始值。
REPORT ZTXYY_11131.
DATA: BEGIN OF f1,col1 TYPE string,BEGIN OF sub,col2 TYPE decfloat16,END OF sub,col3 TYPE I,
END OF f1.DATA: BEGIN OF f2,col1 TYPE string,BEGIN OF sub,col2 TYPE decfloat16,col3 TYPE xstring,END OF sub,col4 TYPE I,
END OF f2.
F1-col1 = '1'.
F1-sub-col2 = '2'.
F1-col3 = '3'.
EXPORT para = f1 TO MEMORY ID 'HK'.
"SUBMIT ZTXYY_11130.
IMPORT para = f2 FROM MEMORY ID 'HK' ACCEPTING PADDING.
BREAK-POINT.REPORT ZTXYY_11130.
DATA: BEGIN OF f1,col1 TYPE string,BEGIN OF sub,col2 TYPE decfloat16,END OF sub,col3 TYPE I,
END OF f1.DATA: BEGIN OF f2,col1 TYPE string,BEGIN OF sub,col2 TYPE decfloat16,col3 TYPE xstring,END OF sub,col4 TYPE I,
END OF f2.IMPORT para = f2 FROM MEMORY ID 'HK' ACCEPTING PADDING.
BREAK-POINT.
针对数据簇中源字段和数据簇中源字段 dobj 的不同数据类型,该新增内容扩展了参数_列表中的规则。规则扩展的目的是,在结构类型相同的情况下,如果最高级别的源结构比数据簇中的目标结构有更多的组件,则多余的组件将被删除。源结构的子结构不得比目标结构中相应的子结构有更多的组件。
REPORT ZTXYY_11131.
DATA: BEGIN OF f1,col1 TYPE string,BEGIN OF sub,col2 TYPE decfloat34,END OF sub,col3 TYPE I,col4 TYPE xstring,
END OF f1.DATA: BEGIN OF f2,col1 TYPE string,BEGIN OF sub,col2 TYPE decfloat34,END OF sub,col3 TYPE I,
END OF f2.
F1-col1 = '1'.
F1-sub-col2 = '2'.
F1-col3 = '3'.
F1-col4 = '4'.
EXPORT para = f1 TO MEMORY ID 'HK'.
IMPORT para = f2 FROM MEMORY ID 'HK' ACCEPTING TRUNCATION.
BREAK-POINT.
这一补充扩展了参数列表中的规则,适用于数据簇中源字段和数据簇中目标字段 dobj 的不同数据类型。在结构体中,这将产生(微不足道的)不同的设置,差异来自子结构或其他结构体中带有 INCLUDE 语句的各种应用组件。
源结构和目标结构的组件在同一层面上查看,与继承自子结构或使用 INCLUDE 应用的组件的设置无关。子结构造成的任何对齐间隙都无关紧要。
此新增功能不能与新增功能 “ACCEPTING PADDING ”和 “ACCEPTING TRUNCATION ”同时使用。
DATA: BEGIN OF incl_struc,cola TYPE string,colb TYPE I,
END OF incl_struc.DATA: BEGIN OF f1.INCLUDE STRUCTURE incl_struc.DATA: col1 TYPE string,BEGIN OF sub,col2 TYPE decfloat16,col3 TYPE decfloat34,END OF sub,col4 TYPE I,
END OF f1.DATA: BEGIN OF f2,cola TYPE string,colb TYPE I,col1 TYPE string,BEGIN OF sub,col2 TYPE decfloat16,END OF sub,col3 TYPE decfloat34,col4 TYPE I,
END OF f2.
F1-col1 = '1'.
F1-cola = '1'.
F1-colB = '1'.
F1-sub-col2 = '2'.
F1-sub-col3 = '3'.
F1-col4 = '4'.EXPORT para = f1 TO MEMORY ID 'HK'.
IMPORT para = f2 FROM MEMORY ID 'HK'
IGNORING STRUCTURE BOUNDARIES.
BREAK-POINT.
源字段的内容不会转换为目标系统的代码页,而是保留不转换,并传递给目标字段。单个源字段或类型为 c 的结构组件可以分配给单个目标字段或类型为 x 的结构组件,其长度以字节为单位相同。c 类型的目标字段将忽略该加法。
该加法不能与之前的转换加法一起使用。
该新增功能将导出数据的代码页 ID 分配给数据对象 cp。该对象必须具有类字符数据类型。代码页 ID 是数据库表 TCP00 中 CPCODEPAGE 列的内容。
该附加功能将导出数据字节序的 ID 分配给数据对象ENDIAN,ENDIAN 必须具有 ABAP 类型组中的 ABAP_ENDIAN 数据类型。大字节序的 ID 是 “B”,小字节序的标识是 “L”。
REPORT ZTXYY_11131.
DATA: BEGIN OF f1,col1 TYPE C LENGTH 10 VALUE '1234567890',col2 TYPE C LENGTH 10 VALUE '1234567890',
END OF f1.DATA: BEGIN OF f2,col1 TYPE C LENGTH 10,col2 TYPE X LENGTH 20,
END OF f2.DATA: CP TYPE string,en TYPE abap_endian.EXPORT para = f1 TO DATABASE demo_indx_table(hk) ID 'HK'.
IMPORT para = f2 FROM DATABASE demo_indx_table(hk) ID 'HK'
IN CHAR-TO-HEX MODE
CODE PAGE INTO CP
ENDIAN INTO en.
BREAK-POINT.
FREE MEMORY.只能对没有缓冲区或表的用
FREE MEMORY ID id.只能对没有缓冲区或表的用
删除成功sy-subrc = 0.失败则为4
DATA: id TYPE c LENGTH 4 VALUE 'TEXT', text1 TYPE string VALUE 'Tina', text2 TYPE string VALUE 'Mike'. EXPORT p1 = text1 p2 = text2 TO SHARED BUFFER demo_indx_table(XY) ID id. IMPORT p1 = text2 p2 = text1 FROM SHARED BUFFER demo_indx_table(XY) ID id. ... DELETE FROM SHARED BUFFER demo_indx_table(XY) ID id. IMPORT p1 = text2 p2 = text1 FROM SHARED BUFFER demo_indx_table(XY) ID id.
ABAP Memory/SAP Memory/Shared Buffer/Database
ABAP提供了IMPORT/EXPORT 和 SET/GET PARAMETER语句,可对用户内存/服务器内存/数据库进行存储和访问。不过可能很多人对此还不是很了解,下面我们通过实例来测试它们的区别和联系。
1. ABAP Memory
用户登陆后,最多一个系统可以开6个窗口,这在SAP中称为External Mode。
而同一个窗口中,运行某程序后,可以通过CALL TRANSACTION/SUBMIT或其他代码跳转到其他程序,这个称为Internal Mode。Internal Mode的调用栈最多为9层。
那么ABAP Memory,它是属于Internal Mode间可以共享的数据,而External Mode间无法共享。
例子. 创建程序A,输入:
DATA matnr TYPE matnr.
IMPORT matnr FROM MEMORY ID 'YTEST_MATNR'.
WRITE matnr.
创建程序B,输入:
DATA matnr TYPE matnr.
matnr = '000000000000001234'.
EXPORT matnr TO MEMORY ID 'YTEST_MATNR'.
SUBMIT y_program_a. "调用程序A
直接运行B,发现程序A从ABAP Memory读到了值并输出到LIST.
说明:
(1)调试运行B到EXPORT语句后面,Goto-System Area-ABAP Memory,可以查看到名为YTEST_MATNR的一片内存。
(2)如果B和A运行在不同的窗口,则A将访问不到数据;当用户输入/N退出当前程序时,内存值也将被清空。
(3)该语句适用于CALL TRANSACTION/SUBMIT过程中的数据共享,也常用于User Exit,类似于定义全局变量的效果。
2. SAP Memory
上面说了External Mode,那么它们之间共享数据必须通过SET/GET PARAMETER语句,不再是EXPORT/IMPORT的模式。
例子. 创建程序A,输入:
DATA matnr TYPE matnr.
GET PARAMETER ID 'YTEST' FIELD matnr.
WRITE matnr.
创建程序B,输入:
DATA: matnr TYPE matnr.
matnr = '000000000000012345'.
SET PARAMETER ID 'YTEST' FIELD matnr.
在窗口1运行程序B并关闭后,在窗口2运行程序A,发现程序A仍然读到了SAP Memory的值。
说明:
(1)调试时,可通过Goto-System Area-SAP Memory,查看到YTEST及其对应的值。
(2)SET/GET PARAMETER的值与本次登陆有关,当用户注销后才失效。在用户登陆的时候,系统会根据每个用户User Profile-Own Data-Parameter(事务码SU01)下的设置,载入到SAP Memory。
(3)Data Element中可以看到Further Characteristics下可定义PARAMETER ID,代表该字段作为屏幕元素时,可读取该PARAMETER ID作为默认值。比如VA03会自动显示刚刚创建的订单号。
3. SHARED MEMORY/SHARED BUFFER
前面介绍的都是用户内存,那么不同用户间如何实现数据共享呢?可以用SHARED MEMORY或SHARED BUFFER,它们是服务器上的某片所有用户共享的内存。关于SHARED MEMORY和SHARED BUFFER的区别,可以F1查看帮助。如果EXPORT SHARED BUFFER,则必须IMPORT SHARED BUFFER才能读到,用IMPORT SHARED MEMORY是读不到的。反过来也是。
例子. 创建程序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可以读取到值。
说明:
(1)既然是服务器上的所有用户共享空间,那么该值将保存到服务器关机重启为止,除非用户用DELETE语句清除它。其实这个跟ENQUEUE/DEQUEUE有点相似之处。
(2)数据库也可共享数据,不过服务器共享肯定速度快些,理论上适合网络游戏,呵呵。
(3)INDX是系统中存在的符合特定格式要求的表。但这不代表该EXPORT/IMPORT语句将在表INDX中增加记录,仅仅代表服务器借用了INDX的结构来管理该片共享内存。
4. DATABASE
上面说了SHARED BUFFER并不访问数据库,而要访问数据库就应该用DATABASE。
创建一个程序,录入代码:
DATA: matnr TYPE matnr.
matnr = '000000000000004321'.
EXPORT matnr TO DATABASE indx(aa) ID 'YTEST_MATNR'.
执行程序,然后SE16查看表INDX,发现新增了一条RELID = AA, SRTFD = YTEST_MATNR的记录。如果EXPORT的数据量比较大,则新增的将是多条,这些条目的字段值SRTF2从0递增。所以EXPORT DATABASE与普通数据库操作的不同之处是,它适合大数据量的操作,系统自动将其拆分成多条记录并存储到数据库中,比如图片或文档。而用IMPORT DATABASE的过程则相反,系统将把这些条相关记录又自动组合起来成为一个整体。