工作區、內表的定義與區別


首先說一下工作區與內表的組成關系,內表是由多個工作區組成的。工作區顧名思義,它是一個工作區間,可由多個變量組成的。只可以存放一組數據,這一組數據可以是由多個字段變量組成的。比如描述一個學生的基本信息有:學號、姓名、性別、年齡這些字段。此時工作區的只能存放一名學生的基本信息,而存放多名學生信息時就需要有內表來解決這個問題了。下面介紹一下工作區和內表的定義方法:

一、定義工作區有如下四種方法:

*定義工作區. EKBE采購訂單歷史,MARA常規物料數據,MAKT物料描述,EKKN 采購憑證中的帳戶設置
*MATNR 物料編號,MAKTX 物料描述, EBELP 采購憑證項目編號

*---1、直接定義
*DATA: BEGIN OF WA_EKBE,
*  MATNR TYPE MARA-MATNR,
*  MAKTX TYPE MAKT-MAKTX,
*  END OF WA_EKBE.

*---2、參照表或結構   工作區WA_EKBE結構與表EKBE一樣
*  DATA: WA_EKBE TYPE EKBE.

*---3、定義的工作區一部分是結構,一部分是自定義的  (這里是隨便找的一個結構:存客戶主數據的)
*DATA: BEGIN OF w a_ekbe.
*        INCLUDE STRUCTURE kna1_fs.
*DATA: ebelp TYPE ekkn-ebelp,
*END OF wa_ekbe.

*---4、參看內部表(需要現有個內表IT_EKBE)
DATA IT_EKBE TYPE TABLE OF EKBE.
DATA WA_EKBE LIKE LINE OF IT_EKBE.

 

 二、在ABAP中我們一般使用內表來存放數據的。我們從DB中將數據取出來放入內表中,然后通過對內表進行處理最后再顯示出來。處理的時候一般通過LOOP循環將數據放到工作區中,然后一個一個進行行處理。

 

*****定義內表
*1、參照工作區,前面已經定義好工作區WA_EKBE
* DATA IT_EKBE LIKE TABLE OF WA_EKBE.

*2(1)、先用TYPES定義一個行(row)的類型
TYPESBEGIN OF line,
  field1 TYPE i,
  field2 TYPE i,
  END OF line.

*(2)、聲明一個工作區
DATA wa TYPE line.

*(3)、聲明內表
*  DATA IT_EKBE TYPE LINE OCCURS 0.
*  有HADER LINE 就是隱式聲明了一個與內表同名的工作區,可以用來存取數據
DATA itab TYPE line OCCURS WITH HEADER LINE.

***對內表的操作有如下兩種方式
*(1)沒有HEADER LINE 時,只能用這一種
wa-field1 1.
wa-field2 2.
APPEND wa TO itab.

*(2)有無 HADER LINE 時都可以用這一種。 這里的 ITAB 相當一個工作區。
itab-field1 3.
itab-field2 4.
APPEND itab.

***還有一種定義內表的方式
**這樣定義的內表自動有了一個同名的 HEADER LINE(標題行). 這里所說的同名工作區即是標題行。
DATABEGIN OF itab_two OCCURS 0,
  ab(8TYPE c,
  cd TYPE i,
END OF itab_two.

 

補充說明:

一、內部表的類型
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內部表

二、定義內表有無HEADER LINE 時的區別:

用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 …

但是這種用隱式的工作區簡潔的寫法的代碼很難理解(系統對於隱式工作區的處理),所以還是定義另外一個不同名的工作來使用易於理解。

總結:

1、標題行是一個和內表主題有着一樣結構的字段的串,標題行只有一行,用來存放被操作的記錄,是內表的缺省的工作區。

再回頭看下一個沒有標題的內表:

data: itab1 like itab occurs 10.

類似這種like/like table of 定義的內表 如沒有用with header line(聲明標題行)則沒有標題行。

2、OCCURS 作用:

在定義內表時,系統會給你的內表分配存儲空間,OCCURS 就是用來定義這個空間大小的。

當你知道SELECT 每次命中或交換的記錄數為N 時,可以直接用 OCCURS N來定義;不知道所需的大小時,就用 OCCURS 0 來定義,這時系統自動分配空間。


免責聲明!

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



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