ABAP入门----以簇方式存储数据对象

ABAP入门----以簇方式存储数据对象

可以用数据簇方式对ABAP/4程序的任何复杂内部数据对象进行分组保存,并将其临时存储在ABAP/4内存中,或长时间存储在数据库中。
可以在ABAP/4内存中存储数据簇。ABAP/4内存是分配给特定事务的存储区,任何模块都是用关键词CALL或SUBMIT从中进行调用的。
使用EXPORT TO MEMORY语句在内存中存储数据对象。
使用IMPORT FROM MEMORY语句从内存中读取数据对象。
使用FREE MEMORY语句从内存中删除数据簇。

一、在ABAP/4内存中存储数据对象
将数据对象从ABAP/4程序写入ABAP/4内存,使用以下语句:
EXPORT [FROM ] [FROM ] … TO MEMORY ID .
此语句将列表中指定的数据对象存储为ABAP/4内存中的数据簇。如果忽略选项FROM,则将数据对象存储到自己的名称之下。ID用于标识内存数据,不得超过32个字符。
EXPORT总是完全改写ID相同的任何现有数据簇的内容。

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.
EXPORT TEXT1
TEXT2 FROM ‘Literal’
TO MEMORY ID ‘text’.
EXPORT ITAB
TO MEMORY ID ‘table’.
在此示例中 ,文本字段 TEXT1 和 TEXT2 存储到程序的 ABAP/4 内存的 ID “文本”之下,内表 ITAB 则存储到 ID“表”中。

二、从内存中读取数据对象
要将ABAP/4内存中的数据对象读到ABAP/4程序中,使用下列语句:
语法:
IMPORT [TO ] [TO ] … FROM MEMORY ID .
此语句从ABAP/4内存的数据簇中读取列表中指定的数据对象。如果忽略选项TO,则将内存中的数据对象赋给程序中的同名数据对象。如果使用此选项,则将内存中的数据对象写入字段中。ID用于标识内存数据,不得超过32个字符。
不必读取存在特定ID下的所有对象。相反,可以从名称中进行选择。如果内存中不包含指定ID下的对象,则将SY-SUBRC设置为4. 但是,如果内存中存在带此ID的数据簇,无论数据对象是否也存在,SY-SUBRC之值总是为0.如果簇中不存在数据对象,则目标字段保持不变。
例:
REPORT ZJESSE02.
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.
EXPORT TEXT1 FROM ‘TEST1’
TEXT2 FROM ‘Literal’
TO MEMORY ID ‘text’.
EXPORT ITAB
TO MEMORY ID ‘table’.
SUBMIT SAPMZTS2 AND RETURN.
SUBMIT SAPMZTS3.
程序SAPMZTS2.
REPORT SAPMZTS2.
DATA: TEXT1(10),
TEXT3 LIKE TEXT1.
IMPORT TEXT1 FROM MEMORY ID ‘text’.
WRITE: / SY-SUBRC, TEXT1.
IMPORT TEXT2 TO TEXT3 FROM MEMORY ID ‘text’.
WRITE: / SY-SUBRC, TEXT3.
程序SAPMZTS3.
REPORT SAPMZTS3.
DATA JTAB LIKE SBOOK OCCURS 10 WITH HEADER LINE.
IMPORT ITAB TO JTAB FROM MEMORY ID ‘table’.
LOOP AT JTAB.
WRITE / JTAB-BOOKID.
ENDLOOP.
运行结果:
SAPMZTS2:
0 TEST1
0 Literal
SAPMZTS3:
00000101
00000102
00000103
00000104
00000105

三、删除内存中的数据簇
要删除ABAP/4内存中的数据对象,使用下列语句:
语法:
FREE MEMORY [ID ]。
如果不附加ID,则此语句删除整个内存,包括此前用EXPORT存储到ABAP/4内存中的所有数据簇。附加ID之后,该语句只删除用此名称命名的数据簇。

四、数据库中的数据簇
存储数据簇是专就ABAP/4而言。尽管也可以使用SQL语句访问簇数据库,但是,只有ABAP/4语句能够对已存储的数据簇结构进行解码。
使用EXPORT TO DATABASE语句将数据对象存储到簇数据库中。
使用IMPORT FROM DATABASE语句为数据簇生成目录表,并从簇数据库中取数据对象。
使用DELETE FROM DATABASE语句从簇数据库中删除数据簇。
1、簇数据库
簇数据库是ABAP/4词典中物特殊数据库。用于存储数据簇。其行结构被划分为部分标准化的开始区(由多个字段组成)和一个用于存储数据的大的区域。
(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。单个数据簇可以扩展到数据库表的好几行中。在理论上,每个簇可能有 231 行。字段 SRTF2 包含存储的数据簇内行的顺序号码,可以是 0 和 231-1 之间的任何值。存储数据簇时,系统自动填写此字段(参 见第 7 点)。
  5. SRTF2 的后面可以 是任何数目 的数据字段,这些字段名称和类型可任意交换。存储数据簇时,系统并不自动填写这些字段 。必须在程序中的 EXPORT 语句之前将值显式分配到这些字段。通常包含诸如程序名 、用户 ID 等控制信息 。
  6. 行上的倒数第二个字段名称必须为 CLUSTR, 类型为 INT2, 并且长度必须为 2。它包含后面的字段 CLUSTD 中的数据长度。存储数据簇时,系统自动填写此字段。
  7. 行上的最后一个字段必须名称为 CLUSTD, 类型为 VARC。 其长度可以任意,但通常为 1000 个字节左右。存储数据簇时,系统按压缩格式 用实际数据填写此字段 。如果 CLUSTD 的长度不足以存储簇数据,则数据就被分布到多行上。这些行在字段 SRTF2 中进行编号 (参见上面 的第 4 点)。

2、在簇数据库中存储数据对象
语法:
EXPORT [FROM ] [FROM ] …
TO DATABASE ()[CLIENT ] ID .
此语句将列表中的数据对象存储为簇数据库中的簇。必须用TABLES语句对加以声明。如果不附加FROM,则将数据对象存储在自己的名称之下。如果有附件项,则将数据对象存储到名称之下。
是存储数据库的簇的两字符区域ID.
PROGRAM SAPMZTS1.
TABLES INDX.
DATA: BEGIN OF ITAB OCCURS 100,
COL1 TYPE I,
COL2 TYPE I,
END OF ITAB.
DO 3000 TIMES.
ITAB-COL1 = SY-INDEX.
ITAB-COL2 = SY-INDEX ** 2.
APPEND ITAB.
ENDDO.
INDX-AEDAT = SY-DATUM.
INDX-USERA = SY-UNAME.
INDX-PGMID = SY-REPID.
EXPORT ITAB TO DATABASE INDX(HK) ID ‘Table’.
WRITE: ’ SRTF2’,
AT 20 ‘AEDAT’,
AT 35 ‘USERA’,
AT 50 ‘PGMID’.
ULINE.
SELECT * FROM INDX WHERE RELID = ‘HK’
AND SRTFD = ‘Table’.
WRITE: / INDX-SRTF2 UNDER ‘SRTF2’,
INDX-AEDAT UNDER ‘AEDAT’,
INDX-USERA UNDER ‘USERA’,
INDX-PGMID UNDER ‘PGMID’.
ENDSELECT.

3.创建数据簇目录表
要从ABAP/4簇数据库中创建数据簇目录表,使用以下语句:
语法:
IMPORT DIRECTORY INTO
FROM DATABASE ()
[CLIENT ] ID .
此语句在存储于数据库中的数据簇中创建一系列数据对象,并将其放到表中。必须使用TABLES语句声明.
如果可以创建某个目录表,则把SY-SUBRC设置为0.否则,设置为4.
必须按照 ABAP/4 词典结构 CDIR 建立内表 。 为此,请使 用 DATA 语句的附件 LIKE( 参见 DATA 语句的基本格式 (页 3–14) )。结构 CDIR 包含下列组件:
字段名 类型 说明
NAME CHAR 在簇中存储的对象名称
OTYPE CHAR 对象类型:
F 表示基本字段
R 表示字段串
T 表示内表
FTYPE CHAR 对象的数据类型。结构化的数据类型是类型 C。
TFILL INT4 已填写行的数目(针对内 表)。
FLENG INT2 字段或结构的长度。

PROGRAM SAPMZTS2.
TABLES INDX.
DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.
IMPORT DIRECTORY INTO DIRTAB FROM DATABASE
INDX(HK) ID ‘Table’.
IF SY-SUBRC = 0.
WRITE: / ‘AEDAT:’, INDX-AEDAT,
/ ‘USERA:’, INDX-USERA,
/ ‘PGMID:’, INDX-PGMID.
WRITE / ‘Directory:’.
LOOP AT DIRTAB.
WRITE: / DIRTAB-NAME, DIRTAB-OTYPE, DIRTAB-FTYPE,
DIRTAB-TFILL, DIRTAB-FLENG.
ENDLOOP.
ELSE.
WRITE ‘Not found’.
ENDIF.
运行结果: (对照第2点的例子看,会更清楚)
AEDAT: 2011/07/03
USERA: IBM_CWC
PGMID:!JESSE02
Directory: DIRTAB-NAME DIRTAB-OTYPE DIRTAB-FTYPE DIRTAB-TFILL DIRTAB-FLENG
ITAB T C 3,000 8

4、从簇数据库中读取数据对象
要将数据对象从ABAP/4簇数据库读入ABAP/4程序中,使用以下语句:
语法:
IMPORT [TO ] [TO ] …
FROM DATABASE ()
[CLIENT ] ID |MAJOR-ID [MINOR-ID ].
此语句从数据库中的数据簇中读取列表中指定的数据对象。必须用TABLES语句声明。

例:
PROGRAM SAPMZTS3.
TABLES INDX.
DATA: BEGIN OF JTAB OCCURS 100,
COL1 TYPE I,
COL2 TYPE I,
END OF JTAB.
IMPORT ITAB TO JTAB FROM DATABASE INDX(HK) ID ‘Table’.
WRITE: / ‘AEDAT:’, INDX-AEDAT,
/ ‘USERA:’, INDX-USERA,
/ ‘PGMID:’, INDX-PGMID.
SKIP.
WRITE ‘JTAB:’.
LOOP AT JTAB FROM 1 TO 5.
WRITE: / JTAB-COL1, JTAB-COL2.
ENDLOOP.
此程序将内表 JTAB( 参考第2点的示例程序)从簇数据库INDX 读入内表 JTAB。

5、从簇数据库中删除数据簇
语法:
DELETE FROM DATABASE () [CLIENT ] ID .
此语句删除数据库表中区域为和名称为的整个数据簇。必须用TABLES语句对进行声明。
如果可以删除具有指定关键字的数据簇,则把SY-SUBRC设置为0,否则,其值为4.
例:
TABLES INDX.
DATA DIRTAB LIKE CDIR OCCURS 10.
IMPORT DIRECTORY INTO DIRTAB FROM DATABASE
INDX(HK) ID ‘Table’.
WRITE: / ‘SY-SUBRC, IMPORT:’, SY-SUBRC.
DELETE FROM DATABASE INDX(HK) ID ‘Table’.
WRITE: / ‘SY-SUBRC, DELETE:’, SY-SUBRC.
IMPORT DIRECTORY INTO DIRTAB FROM DATABASE
INDX(HK) ID ‘Table’.
WRITE: / ‘SY-SUBRC, IMPORT:’, SY-SUBRC.

6、用开放式SQL语句访问簇数据库
簇数据库是在ABAP/4词典中定义的关系数据库,ABAP/4以特殊方法使用该词典。因此,原则上也可以使用开放式SQL语句对其进行访问。对簇数据库表,为了有意义地使用开放式SQL语句,必须清楚数据库表的特殊结构。
例如,用SELECT 语句读取字段 CLUSTR 和 CLUSTID, 或用 UPDATE 语句对其进行更改,都毫无意义。 这些字段包含由系统进行编码的数据簇,要对其进行正确的处理,只能使用 EXPORT TO DATABASE
和 IMPORT FROM DATABASE 语句。
如果数据簇语句的特定组合导致超时运行,则只应使用开放式 SQL 语句 UPDATE、 MODIFY 和
DELETE。 一定不要在数据簇中使用开放式 SQL 语句 INSERT。
例:
PROGRAM SAPMZTS5.
DATA COUNT TYPE I VALUE 0.
TABLES INDX.
SELECT * FROM INDX WHERE RELID = ‘HK’
AND SRTF2 = 0
AND USERA = SY-UNAME.
DELETE FROM DATABASE INDX(HK) ID INDX-SRTFD.
IF SY-SUBRC = 0.
COUNT = COUNT + 1.
ENDIF.
ENDSELECT.
WRITE: / COUNT, ‘Cluster(s) deleted’.
此示例程序从表INDX中删除区域“HK”(其中的字段 USERA 包含当前程序用户名称 )中的所有数据簇。用SELECT 语句填写表工作区INDX 的字段SRTFD,并在DELETE 语句中使用。在WHERE子句中指定SRTF2 = 0,可以保证只对每个数据簇进行一次处理。
删除数据簇中的数据时,应该始终是删除所有行,而不仅仅指特定行。

下例说明如何使用开放式 SQL 语句 UPDATE 更改数据库表中的数据簇名称和区域。用簇语句EXPORT、 IMPORT 和 DELETE 来解决此问题显得太繁琐。
PROGRAM SAPMZTS5.
TABLES INDX.
DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.
UPDATE INDX SET RELID = ‘NW’
SRTFD = ‘Internal’
WHERE RELID = ‘HK’
AND SRTFD = ‘Table’.
WRITE: / ‘UPDATE:’,
/ ‘SY-SUBRC:’, SY-SUBRC,
/ ‘SY-DBCNT:’, SY-DBCNT.
IMPORT DIRECTORY INTO DIRTAB FROM DATABASE
INDX(NW) ID ‘Internal’.
WRITE: / ‘IMPORT:’,
/ ‘SY-SUBRC:’, SY-SUBRC.

此程序更改了使用在簇数据库中存储数据对象中的示例程序存储的数据簇。启动程序时,如果存在数据簇,并且在UPDATE 语句中没有其他错误, 则输出如下所示:
SY-SUBRC: 0
SY-DBCNT: 6
IMPORT:
SY-SUBRC: 0
UPDATE语句更改属于指定数据簇的数据库表 INDX 的六行,然后,IMPORT DIRECTORY 语句在名称“内部”之 下的区域“ NW”中查找数据簇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值