工作區域跟變量一樣,是用來儲存資料的。差別是變量隻能從中儲存一個資料。而工作區域可以存放多個。把多個資料合在一起就成工作區域了。下面我們來看看工作區域是如何定義的吧。定義有四種方法,如下:
1,直接定義
DATA: BEGIN OF WA_EKBE,
MATNR TYPE MARA-MATNR,
MAKTX TYPE MAKT-MAKTX,
END OF WA_EKBE.
上面是以BEGIN和END關鍵字開始,在其中的就是其工作區域的内容。它存放的内容也就是這兩個。
2,參照表或結構
DATA: WA_LFA1 TYPE LFA1.
DATA: WA_LFA2 TYPE ZXXEKBE_S01.
上面就是定義WA_LFA1的結構跟表LFA1一樣,WA_LFA2的結構跟結構ZXXEKBE_S01一樣。
3,如何我們定義的結構一部分是結構,一部分是自定義的變量的話,可以這麼定義
DATA: BEGIN OF WA_EKBE.
INCLUDE STRUCTURE ZXXEKBE_S01.
DATA: EBELP TYPE EKKN-EBELP,
END OF WA_EKBE.
這樣工作區域WA_EKBE的結構就是結構ZXXEKBE_S01加上EBELP了。
4,參看内部表
DATA L_WA_EKBE LIKE LINE OF IT_EKBE.
這裡IT_EKBE是個内部表
上面就是工作區域的定義,注意工作區域隻能存放一組資料,不像内部表可以存放N組,為什麼要定義這個東西呢,它是為了後面我們處理内部表服務的。
1,參照工作區域,前面先定義好工作區域。
DATA IT_EKBE LIKE TABLE OF WA_EKBE.
2,參照DB表
DATA: WA_LFA1 TYPE LFA1.
那麼我們就可以這樣定義内部表
DATA IT_LFA1 TYPE TABLE OF LFA1.
DATA IT_LFA1 LIKE TABLE OF WA_LFA1.
上面兩種定義的方法是相同的。
1,STANDARD内部表。定義的方法如下
DATA IT_EKKO TYPE STANDARD TABLE OF EKKO (WITH NON-UNIQUE KEY EBELN.).
這個是基本型,STANDARD 一般情況下是可以省略的。查詢語句查詢此表時是從第一個數開始按順序開始查的,是以其效率不是很高。可以用LOOP把所有的資料都找出來。可以在後面指定WITH NON-UNIQUE KEY EBELN
2,SORTED 内部表。定義的方法如下
DATA IT_EKPO TYPE SORTED TABLE OF EKPO WITH NON-UNIQUE KEY EBELN EBELP.
查詢的時候此類表會根據KEY值排序,然後進行二分法查詢,是以其效率很好。上面的NON-UNIQUE換成UNIQUE也是一樣的。
3,HASHED内部表。定義的方法如下
DATA IT_MAKT TYPE HASHED TABLE OF MAKT WITH UNIQUE KEY MATNR.
查詢此類表的時候會用雜湊演算法進行查詢,是以其效率也是高的,這種表定義的時候KEY 是必須的。這種表隻能被用來讓READ讀取,此表還有一個特征就是表内的數值為以KEY為機關進行合計。
常用的還是第一種STANDARD内部表
下面具體說一下這工作區,内表和标題行
先是用TYPES關鍵字定義一個行(row)的類型.如下:
TYPES: BEGIN OF line,
field1 TYPE i,
field2 TYPE i,
END OF line.
這裡的line,就相當于一個自定義的類型,表示一行(row)的字段(field).
這裡一行有兩個字段field1和field2.
然後是聲明一個work area:
DATA wa TYPE line.
接着是聲明一個每一行的類型是line的internal table:
DATA itab TYPE line OCCURS 0.
在這暫時把OCCURS作為了差別工作區和内表的标志.
當我們用以上這個方法來聲明一個iternal table時,可以選擇是否有無header line.
上面這句就是沒有header line的.改成如下就有了:
DATA itab TYPE line OCCURS 0 WITH HEADER LINE.
有無header line的差別就是,header line可以當作一個work area來使用
有一下兩種方式操作itab:
1).
wa-field1 = 1.
wa-field2 = 2.
APPEND wa TO itab.
2).
itab-field1 = 1.
itab-field2 = 2.
APPEND itab.
這裡wa就是上面那個已經定義的work area.
有header line的時候,這兩種都可以.
無header line的時候,隻能用第1種.
第2種裡,itab的意義是一個header line,而不是内表.
因為“DATA itab TYPE line OCCURS 0 WITH HEADER LINE.”這樣的聲明,
已經隐式聲明了一個與内表同名的header line.
是以OCCURS用來聲明内表可能造成二義性(ambiguous).
于是,OCCURS被認為是old的東西,采用以下方式聲明一個内表比較好:
DATA itab TYPE STANDARD TABLE OF line.
還有一種聲明内表的方法:
DATA: BEGIN OF itab OCCURS 0,
field1 TYPE i,
field2 TYPE i,
END OF itab.
這樣的itab就自動有了一個同名的header line.
好像不會有 WITHOUT HEADER LINE 或者 NOT WITH HEADER LINE 這樣的用法…
如果沒有OCCURS 0,比如這樣:
DATA: BEGIN OF itab,
END OF itab.
那麼這個itab就不是内表,隻是一個structure,可以作為itab的work area.
寫到這裡發現,歸根到底就是TYPES和DATA這兩個關鍵字的差別和有無OCCURS的差別
當你在建立一個内表的時候,你同時也聲明了一個具有相同名稱的标題行(header line),這是一個隐式的(implicit) 的工作區,當然在你定義内表的時候也可以選擇無标題行。那麼這個工作區是做什麼用的呢?因為在對内表操作時,比如增加或者取回一條記錄.我們必須暫時儲存這條記錄,而這條記錄就儲存在工作區裡。來看一個例子:
data: begin of itab occurs 10,
ab type c,
cd type i,
end of itab.
Itab是一個内表,且有标題行(也有這樣的了解:直接定義了内表itab,不使用工作區,系統自動産生同名工作區(itab)來處理資料,這總說法可能不容易能了解),這裡所說的同名工作區即名額題行。
再看一個顯示的(explicit)聲明一個工作區:
data: wa_itab like itab。
用SAP library的說法,如果一個内表有标題行,則對其進行操作的ABAP語句會簡潔一些,因為這些語句會自動認為标題行是一個隐式的工作區,來看下SAP library的例子:
Operations without header line
Operations with header line
Operations for all Table Types
INSERT INTO TABLE .
INSERT TABLE ITAB.
COLLECT INTO .
COLLECT .
READ TABLE … INTO .
READ TABLE …
MODIFY TABLE FROM …
MODIFY TABLE …
MODIFY FROM …WHERE …
MODIFY … WHERE …
DELETE TABLE FROM .
DELETE TABLE .
LOOP AT ITAB INTO …
LOOP AT ITAB …
Operations for Index Tables
APPEND TO .
APPEND .
INSERT INTO …
INSERT …
MODIFY FROM …
MODIFY …
但是這種用隐式的工作區簡潔的寫法的代碼很難了解(系統對于隐式工作區的處理),是以還是定義另外一個不同名的工作來使用易于了解。
到這裡相信你對于标題行和工作區的了解已經清楚了。來總結一下:标題行是一個和内表主體有着一樣結構的字段的串,标題行隻有一行,用于存放被操作的紀錄,是内表的預設的工作區。
再回頭看下一個沒有标題的内表:
data: itab1 like itab occurs 10.
類似這種like/like table of 定義的内表 如沒有用with header line(聲明标題行)則沒有标題行。
那麼occurs n 又是怎麼回事呢?
因為在定義内表時系統會給你的内表配置設定空間,而occurs 就是用來定義這個大小的。
例如:當你知道可能每次用Select命中或交換的紀錄數N時,可指明 occursN. 但如用occurs0聲明時, buffers 由系統自動配置設定。
轉自:http://scnblogs.techweb.com.cn/lipeng/archives/19.html