数据库中的数据簇
可以将数据簇存储到ABAP/4词典的特定数据库中。就是所谓的ABAP/4簇数据库。
该方法允许单步存储任何具有深结构的复杂数据对象,而不必将其调整为关系数据库的平面结构。这样,在整个系统中都可使用该数据对象,并且每个用户都可对其进行访问。要使访问成功,必须知道存储对象的数据类型。
在簇数据库中存储数据,对于支持有关关系数据库信息的分析结果十分有用。例如,如果要从所有分支机构的人员数据中生成销售额最高的客户清单或者完整的通讯录,就可以编写ABAP/4程序,让程序来解决此类问题,并将结果存储为数据簇。如果需要刷新存储的数据簇,可以在后台定期运行这些程序。要使用该结果,可以使用只访问该数据簇的其他程序。因为不必在每次使用结果时都访问关系数据库中的分布式数据,并且也不必每次都重新生成结果,所以,此方法可以很大程度上减少系统的响应时间。
存储数据簇是专就ABAP/4而言。尽管也可以使用SQL语句访问簇数据库,但是,只有ABAP/4语句能够对已存储的数据簇结构进行解码。
使用EXPORT TO DATABASE语句将数据对象存储到簇数据库中。
使用IMPORT FROM DATABASE语句为数据簇生成目录表,并从簇数据库中读取数据对象。
使用DELETE FROM DATABASE语句从簇数据库中删除数据簇。
下面是一个例子:
*&---------------------------------------------------------------------*
*& Report Z_BARRY_CLUSTER *
*& *
*&---------------------------------------------------------------------*
*& 演示如何在簇表里面写入和读出数据,如果 *
*& 需要在系统保存很多参数,而又不喜欢自己建表,可以用这个方法 *
*& 如果IMPORT出现Dump错误,看Notes:393658 - CONNE_IMPORT_ILL_OBJECT_TYPE
*&---------------------------------------------------------------------*
REPORT z_barry_cluster NO STANDARD PAGE HEADING .
DATA wa_indx TYPE indx.
DATA: BEGIN OF wa_itab,
col1 TYPE i,
col2 TYPE i,
END OF wa_itab.
DATA: itab LIKE TABLE OF wa_itab ,
itab2 LIKE TABLE OF wa_itab ,
tmpstr(20) TYPE c,
dirtab TYPE TABLE OF cdir WITH HEADER LINE .
START-OF-SELECTION.
DO 1000 TIMES.
wa_itab-col1 = sy-index.
wa_itab-col2 = sy-index ** 2.
APPEND wa_itab TO itab.
ENDDO.
DO 50 TIMES.
wa_itab-col1 = sy-index.
wa_itab-col2 = sy-index ** 2.
APPEND wa_itab TO itab2.
ENDDO.
tmpstr = 'TEST String'.
wa_indx-aedat = sy-datum.
wa_indx-usera = sy-uname.
wa_indx-pgmid = sy-repid.
EXPORT a = itab b = itab2 c = tmpstr TO DATABASE indx(hk) ID 'Table' FROM wa_indx.
REFRESH: itab,itab2.
CLEAR tmpstr.
WRITE: '区域',
AT 20 '标识',
AT 35 '计数器',
AT 50 '日期',
AT 65 '用户' ,
AT 80 'ABAP程序名' .
ULINE.
SELECT * FROM indx INTO wa_indx
WHERE relid = 'HK' AND
srtfd = 'Table'.
WRITE: / wa_indx-relid UNDER '区域' ,
wa_indx-srtfd UNDER '标识' ,
wa_indx-srtf2 UNDER '计数器' LEFT-JUSTIFIED ,
wa_indx-aedat UNDER '日期',
wa_indx-usera UNDER '用户',
wa_indx-pgmid UNDER 'ABAP程序名'.
ENDSELECT.
IMPORT DIRECTORY INTO dirtab FROM DATABASE indx(hk) ID 'Table'.
SKIP 2.
WRITE: / '对象名',
AT 20 '对象类型',
AT 35 '字段类型',
AT 50 '表格行数',
AT 65 '字段长度' .
ULINE.
LOOP AT dirtab.
WRITE : / dirtab-name UNDER '对象名',
dirtab-otype UNDER '对象类型' LEFT-JUSTIFIED ,
dirtab-ftype UNDER '字段类型' LEFT-JUSTIFIED ,
dirtab-tfill UNDER '表格行数' LEFT-JUSTIFIED ,
dirtab-fleng UNDER '字段长度' LEFT-JUSTIFIED .
ENDLOOP.
IMPORT a = itab b = itab2 FROM DATABASE indx(hk) ID 'Table'.
IMPORT c = tmpstr FROM DATABASE indx(hk) ID 'Table'.
BREAK-POINT.
--------------------------------------------------------------
关于数据簇:
数据簇操作
一、ABAP/4内存中的数据簇
1.在 ABAP/4 内存中存储数据对象
EXPORT [FROM ] [FROM ] ... TO MEMORY ID .
此语句将列表中指定的数据对象存储为ABAP/4内存中的数据簇。如果忽略选项FROM,则将数据对象存储到自己的名称之下。如果使用该选项,则将数据对象存储到下面。
注:ID 用于标识内存数据,不得超过32个字符. EXPORT语句总是完全改写 ID 相同的任何现有数据簇的内容.对于有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常情况下,语句将表名解释为表工作区
2. 从内存中读取数据对象
IMPORT [TO ] [TO ] ... FROM MEMORY ID .
此语句从ABAP/4内存的数据簇中读取列表中指定的数据对象。如果忽略选项TO,则将内存中的数据对象赋给程序中的同名数据对象。如果使用此选项,则将内存中的数据对象写入字段中。ID用于标识内存数据,不得超过32个字符。
不必读取存储在特定ID下的所有对象。相反,可以从名称中进行选择。如果内存中不包含指定ID下的对象,则将SY-SUBRC设置为4。但是,如果内存中存在带此ID的数据簇,无论数据对象是否也存在,SY-SUBRC之值总是为0。如果簇中不存在数据对象,则目标字段保持不变。
此语句不进行这种检查:即内存中的对象结构与要写入的结构是否匹配。因为数据是按位进行传送的,所以不匹配的结构可能会引起不一致。
3.删除内存中的数据簇
FREE MEMORY [ID ].如果不附加 ID , 则此语句删 除整个内存 ,包括此前 用 EXPORT 存储到 ABAP/4 内存中的所 有数据簇。 附加 ID 之后,该语 句只删除用 此名称命名 的数据簇。
二、数据库中的数据簇
<1>.簇数据库的结构:
建立簇数据库的规则如下所述。
必须创建第一点到第四点中列出的关键字段。上述数据类型都是ABAP/4词典类型。
1.如果该表是针对客户的,第一个字段必须这样定义:名称为MANDT,类型为CHAR,长度为3字节,用于存储客户ID。存储数据簇时,系统既可自动使用当前客户填写字段MANDT,还可使用EXPORT语句中显式指定的客户进行填写。
2.下一字段(对于与客户无关的表,这是第一个字段)必须这样定义:名称为RELID,类型为CHAR,长度为2字节。该字段包含区域ID。簇数据库被分成不同的区域。存储数据簇时,系统用EXPORT语句中指定的区域ID填写字段RELID。
3.下一字段类型为CHAR,长度可变。它包含簇的名称,存储数据簇时,在程序中用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
[FROM ] [FROM ] ...
TO DATABASE () [CLIENT ] ID .
此语句将列表中指定的数据对象存储为簇数据库中的簇。必须用TABLES语句对加以声明。如果不附加FROM,则将数据对象存储在自己的名称之下。如果有附件项,则将数据对象存储到名称之下。
- 是存储数据库的簇的两字符区域ID。
- 标识数据库中的数据,其最大长度取决于中名称字段的长度。
- 在处理特定客户的簇数据库时可以使用选项CLIENT 关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。
- EXPORT语句也将表工作区的用户字段内容传输到数据库表。根据需要,可以预先填写这些字段。
在具有相同名称
的相同工作区和相同客户系统中,EXPORT语句总是完全改写任何现有数据簇的内容。对于含有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常将表名解释为表工作区
<3>创建数据簇目录表IMPORT DIRECTORY INTO
FROM DATABASE ()
[CLIENT ] ID .
此语句在存储于数据库中的数据簇中创建一系列数据对象,并将其放到表中。必须使用TABLES语句声明。要将数据簇存储到数据库中,通常使用EXPORTTODATABASE语句
是即将存储数据库的簇的两字符ID。标识数据库中的数据,其最大长度取决于中名称字段的长度。在处理特定客户的簇数据库时,可以使用选项CLIENT关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。
IMPORT语句也自动从数据库表中读取表工作区的用户字段内容。如果可以创建某个目录表,则把SY-SUBRC设置为0。否则,设置为4。
<4>从簇数据库中读取数据对象IMPORT
[TO ] [TO ] ... FROM DATABASE ()
[CLIENT ] ID |MAJOR-ID [MINOR-ID ].
此语句从数据库中的数据簇中读取列表中指定的数据对象。必须用TABLES语句声明。如果不附加TO,则将数据库的数据对象分配给程序中的同名数据对象。如果不附加此选项,则将数据库的数据对象写入字段。
是即将存储数据库的簇的两字符区域ID。标识数据库中的数据,其最大长度取决于中名称字段的长度。可以用MAJOR-ID代替附加ID。然后,就选定名称的第一部分与相符的数据簇。如果指定具有MAJOR-ID的附加MINOR-ID,则选择名称的第二部分(也就是长度之后的位置)大于或等于的数据簇。在处理特定客户簇数据库时,可以使用选项CLIENT关闭自动客户处理,然后自己指定客户。必须在输入数据库名之后立即指定此选项。IMPORT语句也自动从数据库表中读取表工作区的用户字段内容。
不必读取存储在特殊名称之下的所有对象,但可以使用名称作出选择。如果数据库不包含具有指定关键字、和的对象,则将SY-SUBRC设置为4。但是,如果数据库中存在具有这些关键字的数据簇,那么,无论是否存在数据对象,SY-SUBRC之值总是为0。如果簇中没有数据对象,则目标字段保持不变。
运行时,系统检查此语句以查看数据库中对象的结构是否与要写入的结构相符。如果不符合,将出现运行时间错误。类型C字段是此规则的例外,也可显示在结构数据字段结尾。可以加长、缩短、附加或忽略。
<5>从簇数据库中删除数据簇DELETE FROM DATABASE
() [CLIENT ] ID .
此语句删除数据库表中区域为和名称为的整个数据簇。必须用TABLES语句对进行声明。
阅读(9876) | 评论(0) | 转发(0) |