ABAP工作區,內表,標題行的定義和區別


     工作區域跟變量一樣,是用來保存數據的。區別是變量只能從中保存一個數據。而工作區域可以存放多個。把多個數據合在一起就成工作區域了。下面我們來看看工作區域是如何定義的吧。定義有四種方法,如下:
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組,為什么要定義這個東西呢,它是為了后面我們處理內部表服務的。

 

 

ABAP里存放數據的不是數組,而是內部表。我們從DB里把數據取出來就是放在內部表里的。然后通過對內部表的數據進行處理,最后再顯示出來的。處理的時候是通過LOOP循環把內部表的數據放到工作區域。然后一個一個的時行處理。下面我們來看看內部表吧。
一,內部表的定義
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,
              field1 TYPE i,
              field2 TYPE i,
          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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM