天天看點

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”中查找資料簇。

繼續閱讀