SAP ABAP - 內部表填充



在內部表中,填充包括選擇、插入和追加等功能。本章重點介紹 INSERT 和 APPEND 語句。

INSERT 語句

INSERT 語句用於將單行或多行插入到內部表中。

以下是向內部表新增單行的語法:

INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.

在此語法中,INSERT 語句在 internal_tab 內部表中插入新行。可以使用 work_area_itab INTO 表示式在 internal_tab 引數之前插入新行。當使用 work_area_itab INTO 表示式時,新行將從 work_area_itab 工作區中獲取並插入到 internal_tab 表中。但是,當不使用 work_area_itab INTO 表示式插入行時,該行將從 internal_tab 表的標題行中獲取。

當使用 INDEX 子句在內部表中插入新行時,插入行之後行的索引號將遞增 1。如果內部表包含 <index_num> - 1 行,則新行將新增到表的末尾。當 SAP 系統成功將行新增到內部表時,SY-SUBRC 變數將設定為 0。

示例

以下是一個使用 insert 語句的示例程式。

REPORT  ZCUSLIST1. 
DATA: BEGIN OF itable1 OCCURS 4,
      F1 LIKE SY-INDEX,
      END OF itable1.
	
   DO 4 TIMES.
      itable1-F1 = sy-index.
      APPEND itable1.
   ENDDO.
	
itable1-F1 = -96.  
INSERT itable1 INDEX 2.  

LOOP AT itable1.
   Write / itable1-F1.  
ENDLOOP.  

LOOP AT itable1 Where F1 ≥ 3.
   itable1-F1 = -78.
   INSERT itable1.
ENDLOOP.

Skip.
LOOP AT itable1.
   Write / itable1-F1.
ENDLOOP.

以上程式碼產生以下輸出:

		1 
96- 
		2 
		3 
 4  
		1 
96- 
		2 
78- 
 3 
78- 
 4 

在以上示例中,DO 迴圈將包含數字 1 到 4 的 4 行追加到其中。標題行元件 itable1-F1 已分配值為 -96。Insert 語句將標題行作為新行插入到第 3 行之前的正文中。現有的第 3 行在插入後變為第 4 行。LOOP AT 語句從內部表中檢索 F1 值大於或等於 3 的那些行。在每一行之前,Insert 語句都會從其標題行插入新行。在插入之前,F1 元件已更改為包含 -78。

在執行每個 insert 語句後,系統會重新索引插入行下方的所有行。當您在大型內部表頂部附近插入行時,這會導致開銷。如果您需要將一行行插入到大型內部表中,請準備另一個包含要插入行的表,並使用插入行而不是。

在 itable1 的迴圈中插入 itable1 內的新行時,它不會立即影響內部表。它實際上在下一個迴圈傳遞中生效。在插入當前行後的行時,表在 ENDLOOP 處重新索引。sy-tabix 遞增,下一個迴圈處理 sy-tabix 指向的行。例如,如果您在第二個迴圈傳遞中並且您在第 3 行之前插入一條記錄。當執行 endloop 時,新行變為第 3 行,舊的第 3 行變為第 4 行,依此類推。Sy-tabix 遞增 1,下一個迴圈傳遞處理新插入的記錄。

APPEND 語句

APPEND 語句用於向現有內部表新增單行或一行。此語句將工作區中的單行復制並將其插入到內部表中最後一個現有行之後。工作區可以是標題行,也可以是與內部錶行具有相同結構的任何其他欄位字串。以下是用於在內部表中追加單行的 APPEND 語句的語法:

APPEND <record_for_itab> TO <internal_tab>.

在此語法中,<record_for_itab> 表示式可以由可轉換為行型別的 <work_area_itab> 工作區或 INITIAL LINE 子句表示。如果使用者使用 <work_area_itab> 工作區,則 SAP 系統會向 <internal_tab> 內部表新增新行,並使用工作區的內容填充它。INITIAL LINE 子句追加一個空白行,其中包含表結構中每個欄位的初始值。在每個 APPEND 語句之後,SY-TABIX 變數包含追加行的索引號。

向具有非唯一鍵的標準表和排序表追加行,無論表中是否已存在具有相同鍵的行,這都適用。換句話說,可能會出現重複條目。但是,如果使用者嘗試向具有唯一鍵的排序表新增重複條目,或者使用者透過向其中追加行來違反排序表的排序順序,則會發生執行時錯誤。

示例

REPORT  ZCUSLIST1. 
DATA: BEGIN OF linv Occurs 0,
      Name(20) TYPE C,
      ID_Number TYPE I,
END OF linv. 

DATA table1 LIKE TABLE OF linv. 
linv-Name = 'Melissa'. 
linv-ID_Number = 105467. 
APPEND linv TO table1. 
LOOP AT table1 INTO linv. 

Write: / linv-name, linv-ID_Number. 
ENDLOOP.

以上程式碼產生以下輸出:

Melissa		105467 
廣告