数据簇操作
一、ABAP/4内存中的数据簇
1.在 ABAP/4 内存中存储数据对象
EXPORT <f1> [FROM <g1>] <f2> [FROM <g2>] … TO MEMORY ID <key>.
此语句将列表中指定的数据对象存储为ABAP/4内存中的数据簇。如果忽略选项FROM<gi>,则将数据对象<fi>存储到自己的名称之下。如果使用该选项,则将数据对象<gi>存储到<fi>下面。
注:ID <key>用于标识内存数据,不得超过32个字符. EXPORT语句总是完全改写 ID <key>相同的任何现有数据簇的内容.对于有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常情况下,语句将表名解释为表工作区


2. 从内存中读取数据对象
IMPORT <f1> [TO <g1>] <f2> [TO <g2>] … FROM MEMORY ID <key>.
此语句从ABAP/4内存的数据簇中读取列表中指定的数据对象。如果忽略选项TO<gi>,则将内存中的数据对象<fi>赋给程序中的同名数据对象。如果使用此选项,则将内存中的数据对象<fi>写入字段<gi>中。ID<key>用于标识内存数据,不得超过32个字符。
不必读取存储在特定ID<key>下的所有对象。相反,可以从名称<fi>中进行选择。如果内存中不包含指定ID<key>下的对象,则将SY-SUBRC设置为4。但是,如果内存中存在带此ID的数据簇,无论数据对象<fi>是否也存在,SY-SUBRC之值总是为0。如果簇中不存在数据对象<fi>,则目标字段保持不变。
此语句不进行这种检查:即内存中的对象结构与要写入的结构是否匹配。因为数据是按位进行传送的,所以不匹配的结构可能会引起不一致。
3.删除内存中的数据簇
FREE MEMORY [ID <key>].如果不附加 ID <key>, 则此语句删 除整个内存 ,包括此前 用 EXPORT 存储到 ABAP/4 内存中的所 有数据簇。 附加 ID <key> 之后,该语 句只删除用 此名称命名 的数据簇。


 


二、数据库中的数据簇
<1>.簇数据库的结构:


建立簇数据库的规则如下所述。


必须创建第一点到第四点中列出的关键字段。上述数据类型都是ABAP/4词典类型。
1.如果该表是针对客户的,第一个字段必须这样定义:名称为MANDT,类型为CHAR,长度为3字节,用于存储客户ID。存储数据簇时,系统既可自动使用当前客户填写字段MANDT,还可使用EXPORT语句中显式指定的客户进行填写。


2.下一字段(对于与客户无关的表,这是第一个字段)必须这样定义:名称为RELID,类型为CHAR,长度为2字节。该字段包含区域ID。簇数据库被分成不同的区域。存储数据簇时,系统用EXPORT语句中指定的区域ID填写字段RELID。


3.下一字段类型为CHAR,长度可变。它包含簇的名称<key>,存储数据簇时,在程序中用EXPORT语句的附加ID指定了该簇。因为后面的字段要对齐,所以系统应最多使用3个未用字节填充在字段RELID的结尾。如果创建自己的簇数据库,应该相应地定义此字段的长度。
4.下一字段必须名称为SRTF2,类型为INT4,长度为4。单个数据簇可以扩展到数据库表的好几行中。在理论上,每个簇可能有2**31行。字段SRTF2包含存储的数据簇内行的顺序号码,可以是0和2**31-1之间的任何值。存储数据簇时,系统自动填写此字段(参见第7点)。
5.SRTF2的后面可以是任何数目的数据字段,这些字段名称和类型可任意交换。存储数据簇时,系统并不自动填写这些字段。必须在程序中的EXPORT语句之前将值显式分配到这些字段。通常包含诸如程序名、用户ID等控制信息。
6.行上的倒数第二个字段名称必须为CLUSTR,类型为INT2,并且长度必须为2。它包含后面的字段CLUSTD中的数据长度。存储数据簇时,系统自动填写此字段。
7.行上的最后一个字段必须名称为CLUSTD,类型为VARC。其长度可以任意,但通常为1000个字节左右。存储数据簇时,系统按压缩格式用实际数据填写此字段。如果CLUSTD的长度不足以存储簇数据,则数据就被分布到多行上。这些行在字段SRTF2中进行编号(参见上面的第4点)。
既可以按照上述规则创建自己的簇数据库(此时参见文档ABAP/4词典),也可以使用系统定义的簇数据库INDX


<2>在簇数据库中存储数据对象
EXPORT <f1> [FROM <g1>] <f2> [FROM <g2>] …
TO DATABASE <dbtab>(<ar_id>) [CLIENT <cli>] ID <key>.
此语句将列表中指定的数据对象存储为簇数据库<dbtab>中的簇。必须用TABLES语句对<dbtab>加以声明。如果不附加FROM<gi>,则将数据对象<fi>存储在自己的名称之下。如果有附件项,则将数据对象<gi>存储到名称<fi>之下。


  • <ar_id> 是存储数据库的簇的两字符区域ID。
  • <key> 标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。
  • 在处理特定客户的簇数据库时可以使用选项CLIENT <cli>关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。
  • EXPORT语句也将表工作区<dbtab>的用户字段内容传输到数据库表。根据需要,可以预先填写这些字段。

在具有相同名称<key>的相同工作区<ar>和相同客户系统<cli>中,EXPORT语句总是完全改写任何现有数据簇的内容。对于含有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常将表名解释为表工作区


 


<3>创建数据簇目录表
IMPORT DIRECTORY INTO <dirtab> FROM DATABASE <dbtab>(<ar>)
[CLIENT <cli>] ID <key>.
此语句在存储于数据库<dbtab>中的数据簇中创建一系列数据对象,并将其放到表<dirtab>中。必须使用TABLES语句声明<dbtab>。要将数据簇存储到数据库中,通常使用EXPORTTODATABASE语句
<ar>是即将存储数据库的簇的两字符ID。<key>标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。在处理特定客户的簇数据库时,可以使用选项CLIENT<cli>关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。
IMPORT语句也自动从数据库表中读取表工作区<dbtab>的用户字段内容。如果可以创建某个目录表,则把SY-SUBRC设置为0。否则,设置为4。


 


<4>从簇数据库中读取数据对象
IMPORT <f1> [TO <g1>] <f2> [TO <g2>] … FROM DATABASE <dbtab>(<ar>)
[CLIENT <cli>] ID <key>|MAJOR-ID <maid> [MINOR-ID <miid>].
此语句从数据库<dbtab>中的数据簇中读取列表中指定的数据对象。必须用TABLES语句声明<dbtab>。如果不附加TO<gi>,则将数据库的数据对象<fi>分配给程序中的同名数据对象。如果不附加此选项,则将数据库的数据对象<fi>写入字段<gi>。
<ar>是即将存储数据库的簇的两字符区域ID。<key>标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。可以用MAJOR-ID<maid>代替附加ID<key>。然后,就选定名称的第一部分与<maid>相符的数据簇。如果指定具有MAJOR-ID的附加MINOR-ID<miid>,则选择名称的第二部分(也就是<maid>长度之后的位置)大于或等于<miid>的数据簇。在处理特定客户簇数据库时,可以使用选项CLIENT<cli>关闭自动客户处理,然后自己指定客户。必须在输入数据库名之后立即指定此选项。IMPORT语句也自动从数据库表中读取表工作区<dbtab>的用户字段内容。
不必读取存储在特殊名称<key>之下的所有对象,但可以使用名称<fi>作出选择。如果数据库不包含具有指定关键字<ar>、<key>和<cli>的对象,则将SY-SUBRC设置为4。但是,如果数据库中存在具有这些关键字的数据簇,那么,无论是否存在数据对象<fi>,SY-SUBRC之值总是为0。如果簇中没有数据对象<fi>,则目标字段保持不变。
运行时,系统检查此语句以查看数据库中对象的结构是否与要写入的结构相符。如果不符合,将出现运行时间错误。类型C字段是此规则的例外,也可显示在结构数据字段结尾。可以加长、缩短、附加或忽略。


 


<5>从簇数据库中删除数据簇
DELETE FROM DATABASE <dbtab>(<ar>) [CLIENT <cli>] ID <key>.
此语句删除数据库表<dbtab>中区域为<ar>和名称为<key>的整个数据簇。必须用TABLES语句对<dbtab>进行声明。