ABAP-数据簇(Data Cluster)
数据簇是一组被组织到一起的数据对象, 它们存储到存储介质,只能通过ABAP语句进行编辑。
通过语句EXPORT将数据对象写到存储介质
通过语句IMPORT提取数据对象
语句DELETE可以用来删除任何存储介质
语句FREE可以用来删除ABAP内存。
语句IMPORT DIRECTORY生成一个之前导入到数据库表中的所有数据对象的列表
数据簇操作语法:
导出:
EXPORT parameter_list TO medium [COMPRESSION {ON|OFF}].
导入:
IMPORT parameter_list FROM medium [conversion_options]
删除:
DELETE FRROM MOMORY ID id
DELETE FRROM DATABASE dbtab(ar) [CLIENT cl] ID id
DELETE FRROM SHARED MEMORY dbtab(ar) [CLIENT cl] ID id
DELETE FRROM SHARED BUFFER dbtab(ar) [CLIENT cl] ID id}
参数列表(parameter_list)
参数列表有静态和动态两种形式,静态形式是用p1 = dobj1 p2 = dobj2 ....或者p1 from dobj1 p2 from dobj2,动态形式使用括号括起来的内表ptab指定,列表用于写入数据簇或者从数据簇中读取数据,其中dobj是存在簇中的数据对象,名字为p,参数p最多可以255个字符,除了数据对象的引用类型或者是包含引用类型作为组件的数据类型,可以使用所有的数据类型;对于动态的情形,参数列表会在一个索引表ptab中指定,ptab有两列,第一列必须包含参数的名字,第二列必须包含大写格式的数据对象。
说明:为了导入被引用变量引用的对象,如果这些对象实现了接口IF_SERIALIZABLE_OBJECT,使用语句CALL TRANSFORMATION序列化并且导入这些对象
压缩开关:[COMPRESSION {ON|OFF}]
可以指定数据是否以压缩的形式存储与簇中,默认的对于除了数据库表所有的介质的内存区域压缩是不激活的。当使用IMPORT导入数据,系统自动会识别数据是否被压缩。
介质(medium)
导出的数据簇可以字节串xstr的形式存储,以内表的形式itab存储在ABAP内存,在数据库表dbtab或者在共享内存区域(指定的shared memory或者buffer)
可选的:
DATA BUFFER xstr
数据簇被写到简单的数据对象xstr,它的类型是xstring,xstr先前的内容被完全覆盖。
INTERNAL TABLE itab
数据簇被写到内表itab中,itab先前的内容被完全覆盖。
内表第一列必须是s或者i类型,第二列必须是x类型,根据第二列的宽度,有必要的话数据会跨多行存储,第一行包含了第二行占用的数据长度。itab只能是没有secondary table keys的标准表。
MEMORY ID id
根据指定的id数据簇被写到ABAP内存,id最多60个字符,已有的id数据簇会被覆盖。
在ABAP内存中数据簇对于所有在调用序列中的程序来说是可用的,借此可以把数据传递给调用程序。
DATABASE dbtab(ar) [FROM wa] [CLIENT cl] ID id
如果DATABASE被指定,编码为id的数据簇被存储到了数据库表dbtab中,数据提交后被永久的存储。在ABAP数据词典中,数据库表必须是类INDX结构。ID是大小写敏感的。
两位的区域ar,必须直接指定,它把表中的行分割为多个区域。
在FROM后的工作区必须和数据表dbtab有相同的数据类型。
SHARED MEMORY dbtab(ar) [FROM wa] [CLIENT cl] ID id
SHARED BUFFER dbtab(ar) [FROM wa] [CLIENT cl] ID id
如果SHARED MOMORY或者SHARED BUFFER被指定,数据簇被存储到应用服务器上的共享内存的cross-transaction application buffers。同一个应用服务器上的所有程序可以访问这些buffers。
当到达存储的限制,两种应用的buffer有所区别。两种应用buffers最大限制可以通过使用配置文件参数 rsdb/esm/buffersize_kb(SHANRED MEMORY)调整 ,当SHANRED BUFFER到达了他的限制会被自动替代清除,这个过程会删除buffer中最近使用的数据对象。
当存储数据,系统在应用buffer中创建一个内存表。这个表的行结构使用dbtab定义。
说明
当导入数据,会重写有同样cl,ar,id的数据簇,如果使用SHARED MEDMORY将已存在的数据簇用一个更大的重写,这个会到达内存的限制,这样只会删除已存在的数据簇。
比起将数据簇存储在共享内存,推荐使用共享对象(shared objects),共享对象允许存储对象有复杂的依赖,可以像通常的对象来处理,允许多个用户无须复制的访问共享内存。
补充:
更加推荐使用EXPORT TO DATA BUFFER而不是EXPORT TO INTERNAL TABLE,因为它会更加易于操作,只有将非常大的数据簇导出到一个内表,并且可用的内存将被耗尽的时候是有益的,这是因为它请求的内存是一块一块被消耗的,然而字符串的内存必须总是被完全使用的。
id的长度限制是59或者62取决于CLIENT是否被指定。
FREE MEMORY ID id和DELETE FROM MEMORY ID id等效,另外FREE MOMORY不带有ID的用法被废弃了,因为会牵涉到所有的数据簇,推荐使用语句DELETE FROM,因为条件ID是强制的。
抽象系统类CL_ABAP_EXPIMP的子类补充数据簇的语句。
例1:
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 `apple`, text2 TYPE string VALUE `banana`, 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. WRITE: text1 , text2.
运行结果:banana apple
例2:
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. ""将内表写入数据库表demo_indx_table中id为'TABLE'的数据簇 EXPORT tab = itab TO DATABASE demo_indx_table(SQ) FROM wa_indx ID 'TABLE'. ""从数据库表demo_indx_table中id为'TABLE'的数据簇读取内表 IMPORT tab = itab FROM DATABASE demo_indx_table(sq) ID 'TABLE'. LOOP AT itab INTO wa_itab. WRITE:wa_itab-col1,wa_itab-col2. ENDLOOP.
文章来自于网络,如果侵犯了您的权益,请联系站长删除!