7.1 創建內表
TYPES : BEGIN OF <f> OCCURS <n>,
<component declaration>,
..............
END OF <f>.
DATA: <itab> TYPE STANDARD OF <f>,
...
<wa> TYPE <f>.
其作用與先創建字段串 <f>
,然后再創建與該字段串行結構相同的內表 <f>
相同。
<n>
指定行的初始號。將第一行寫入用類型 <t>
創建的內表數據對象之后,就為指定行保留內存。如果添加到內表中的行比 <n>
指定的要多,則自動擴展保留的內存。如果內存中沒有足夠空間可用於內表,則將其寫入緩沖區或磁盤(分頁區域)。
7.2 填充內表
要填充內表,既可逐行添加數據,也可復制另一個表格的內容。要逐行填充內表,可以使用
APPEND
、 COLLECT
或 INSERT
語句。
要將內表僅用於存儲數據,出於性能方面的考慮,建議使用 APPEND
。用 APPEND
也可以創建序列清單。
7.2.1 無關鍵字附加行
要將行附加到內表中,使用 APPEND
語句,用法如下:
APPEND [<wa> TO|INITIAL LINE TO] <itab>.
該語句將新行附加到內表 <itab>
中。
通過使用 <wa> TO
選項,指定要附加的源區域 <wa>
。對於帶表頭行的表格,可以忽略 TO
選項,這樣,表格工作區域就成了源區域。
可以使用 INITIAL LINE TO
選項替代 <wa> TO
,將用其類型的正確值初始化的行添加到表格中。
APPEND
不考慮是否存在標准關鍵字相同的行。這樣,可能會出現相同條目。系統字段 SY-TABIX
在每個 APPEND
語句之后包含附加行的索引。
7.2.2 根據標准關鍵字附加行
要用有唯一標准關鍵字的行填充內 表, 使用 COLLECT
語句,用法如下:
COLLECT [<wa> INTO] <itab>.
該語句通過使用 INTO
選項指定想附加的源區域 <wa>
。如果表格有表頭行,則可以忽略 INTO
選項。這樣,表格工作區域就成了源區域。
系統檢查表格條目的標准關鍵字是否相同。如果沒有, COLLECT
語句的作用與 APPEND
語句相似,並將新行添至表格中。
如果存在關鍵字相同的條目, COLLECT
語句不附加新行,但將工作區域中數字字段的內容添加到現有條目中數字字段的內容中。系統字段 SY-TABIX
包含處理過的行的索引。
為 COLLECT
指定的工作區域必須與內表的行類型兼容,不僅僅是可轉換為內表的行類型。COLLECT
語句無法用於帶深層結構的內表,例如,將內表作為組件的行。
如果僅使用 COLLECT
語句填充內表,則不會出現重復條目。因此要填充沒有重復條目的內表,應該使用 COLLECT
而不是 APPEND
或 INSERT
。
7.2.3 插入行
要在內表行之前插入新行, 使用 INSERT
語句,用法如下:
INSERT [<wa> INTO|INITIAL LINE INTO] <itab> [INDEX <idx>].
該語句通過使用 INTO
選項指定想插入的源區域 <wa>
。如果表格有表頭行,則可以忽略 INTO
選項。這樣,表格工作區域就成了源區域。
可以使用 INITIAL LINE TO
選項替代 <wa> TO
,將用其類型的正確值初始化的行添至表格中。
如果使用 INDEX
選項,則將新行插入到有索引 <idx>
的行之前。插入之后,新條目索引為 <idx>
,下行索引加 1 。
如果表格包含 <idx> - 1
條目,系統將新條目附加到最后的現有表格行之后。如果表格的條目小於 <idx> - 1
,系統無法插入條目並將 SY-SUBRC
設置為 4 。如果操作成功,將 SY-SUBRC
設置為 0。
如果使用不帶 INDEX
選項的 INSERT
語句,系統只能在 LOOP - ENDLOOP
循環內通過在當前行(例如帶 SY-TABIX
返回索引的行)前插入新條目來處理它。
7.2.4 附加內表行
要將部分或全部內表附加到另一個 內表中, 使用 APPEND
語句,用法如下:
APPEND LINES OF <itab1> [FROM <n1>] [TO <n2>] TO <itab2>.
如果沒有 FROM
和 TO
選項,該語句將整個表格 ITAB1
附加到 ITAB2
中。如果使用這些選項,則可通過索引 <n1>
或 <n2>
指定 ITAB1
中要附加的第一或最后一行。
用該方式將表格行附加到另一個表格中的速度比在循環中逐行進行附加快 3 到 4 倍。在 APPEND
語句之后,系統字段 SY-TABIX
包含附加的最后一行的索引。
7.2.5 插入內表行
要將部分或全部內表插入到另一個 內表中, 使用 INSERT
語句,用法如下:
INSERT LINES OF <itab1> [FROM <n1>] [TO <n2>]
INTO <itab2> [INDEX <idx>].
如果沒有 FROM
和 TO
選項,該語句將整個表格 ITAB1
附加到 ITAB2
中。如果使用這些選項,則可通過索引 <n1>
或 <n2>
指定 ITAB1
中要附加的第一或最后一行。
如果使用 INDEX
選項,將 <itab1>
的行插入到 <itab2>
中索引為 <idx>
的行之前。如果不使用 INDEX
選項,系統只能在 LOOP - ENDLOOP
塊中通過在當前行(例如,其索引在 SY-TABIX
中返回的行)之前插入新條目來處理它。
7.2.6 復制內表
如果想一次將內表的全部內容復制到另一內表中,請使用 MOVE
語句或賦值操作符 =
,用法如下:
MOVE <itab1> TO <itab2>.
該語句等價於: <itab2> = <itab1>.
也可進行多重賦值,例如, <itab4> = <itab3> = <itab2> = <itab1>.
也是可能的。
ABAP/4 從右到左進行處理:
<itab2> = <itab 1>. <itab3> = <itab 2>. <itab4> = <itab3>.
這些語句執行完整操作。復制整個表格內容,包括作為表格組件的任何其它內表的數據。覆蓋目標表格原來的內容。
對於有表頭行的表格,表格工作區域和表格本身同名。要在上述語句中進行區分,必須在名稱之后輸入兩個方括號([]) 來定位內表而不是表格工作區域。
7.3 讀取內表
7.3.1 逐行讀取內表
要將內表逐行讀入工作區域,可以使用 LOOP
語句編一個循環。語法如下所示:
LOOP AT <itab> [INTO <wa>] [FROM <n1>] [TO <n2>]
[WHERE <condition>].
.....
ENDLOOP.
用 INTO
選項指定目標區域 <wa>
。如果表格有表頭行,則可以忽略 INTO
選項。這樣,表格工作區域就成了目標區域。
逐行將內表 <itab>
讀入 <wa>
或表格工作區域 <itab>
。對於讀取的每一行,系統都處理以 LOOP
開始,以 ENDLOOP
結束的語句塊。
可以用控制關鍵字 AT
在 LOOP - ENDLOOP
塊內控制語句塊流。
在語句塊內,系統字段 SY-TABIX
包含當前行的索引。處理完表格的所有行之后循環結束。在 ENDLOOP
語句之后,如果至少讀取了一行,則將系統字段 SY-SUBRC
設置為 0 。否則,將其設置為 4 。
可以使用 FROM
、 TO
或 WHERE
選項限制要在循環中進行處理的行數。
使用 FROM
選項,可以用 <n1>
指定要讀取的第一行 。
使用 TO
選項,可以用 <n2>
指定要讀取的最后一行。
用 WHERE
選項,可以指定 <condition>
的任何邏輯表達式。第一個操作數必須是內表行結構的組件。
如果在循環中使用控制關鍵字 AT
,則不能使用 WHERE
選項。
FROM
和 TO
選項限制系統必須讀取的行數。 WHERE
選項僅避免對工作區域進行不必要的填充。用 WHERE
選項,系統必須讀取所有行。為了提高效率, 應該盡可能使用 FROM
和 TO
選項。在某些條件下用 EXIT
語句而不是 WHERE
選項跳出循環也十分有效。
7.3.2 用索引讀取單行
要用索引從內表中讀取 單行, 使用 READ
語句,用法如下:
READ TABLE <itab> [INTO <wa>] INDEX <idx>.
用 INTO
選項指定目標區域 <wa>
。如果表格有表頭行,可以忽略 INTO
選項。這樣,表格工作區域就成了目標區域。
系統用索引 <idx>
從表格 <itab>
中讀取行。這比用關鍵字訪問表格要快。
如果找到有指定索引的條目,則將系統字段 SY-SUBRC
設置為 0 ,而且 SY-TABIX
包含該行的索引。否則, SY-SUBRC
包含非 0 值。
如果 <idx>
小於或等於 0 ,則會發生實時錯誤。如果 <idx>
超過表格大小,系統將 SY-SUBRC
中的返回代碼值設置為 4 。
7.3.3 讀取自定義關鍵字的單行
要從有自定義關鍵字的內表中讀取 單行, 使用 READ
語句的 WITH KEY
選項,用法如下:
READ TABLE <itab> [INTO <wa>] WITH KEY <key> [BINARY SEARCH].
用 INTO
選項可以指定目標區域。如果表格有表頭行,則可以忽略 INTO
選項。這樣,表格工作區域就成了目標區域。
系統讀取 <itab>
中匹配 <key>
中所定義的關鍵字的第一個條目。
如果找到有適當關鍵字的條目,則將系統字段 SY-SUBRC
設置為 0 ,並且 SY-TABIX
包含該行的索引。否則,將 SY-SUBRC
設置為非 0 值。
如下所述,可以定義多個關鍵字
- 定義一系列關鍵字段
要定義自己的一系列關 鍵字段, 使用 WITH KEY
選項,用法如下:
....WITH KEY <k1> = <f1> ... <kn> = <fn> ...
自定義關鍵字包含表格組件 <k1>...<kn>
。字段 <f1>...<fn>
是關鍵字段的內容必須匹配的值。如果 <fi>
的數據類型與數據類型 <ki>
不兼容,則<fi>
轉換為類型 <ki>
。可以用 (<ni>)
代替 <ki>
來實時設置關鍵字段。關鍵字段是字段 <ni>
的內容。如果在運行時 <ni>
為空,則系統忽略該關鍵字段。如果 <ni>
包含無效的組件名稱,則發生實時錯誤。
用戶可以為任何在關鍵字中使用的組件指定偏移量和長度。
- 將整行定義為關鍵字
通過使用 WITH KEY
選項可將內表整行定義為其關鍵字,如下所示:
....WITH KEY = <value> ...
如果 <value>
的數據類型與表格行的數據類型不兼容,則將 <value>
轉換為表格行的數據類型。
對於此類關鍵字,也可以選擇由某個基本數據類型或內表直接定義的,而不是由字段串直接定義的特定內表行。
(3) 將行首定義為關鍵字
要將內表的行首定義為 關鍵字, 使用 WITH KEY
選項,用法如下:
....WITH KEY <k> ...
系統將(左對齊)的行首與 <k>
進行比較。 <k>
不能包含內表或包含內表的結構。與上面兩個選項不同之處在於用 <k>
的數據類型進行比較。
7.3.4 讀取標准關鍵字的單行
要從內表中讀取有特定標准關鍵字的第一行,使用 READ
語句,用法如下:
READ TABLE <itab> [INTO <wa>] [BINARY SEARCH].
用戶必須指定要從 <itab>
的表格工作區域中讀取行的關鍵字。
讀取語句的該變式只能用於有表頭行的內表。
系統在表格中搜索第一個條目以匹配表格工作區域中的所有標准關鍵字段並將該行讀入表格工作區域。如果使用 INTO
選項,則將該行讀入工作區域 <wa>
。
標准關鍵字包含內表關鍵字中所述的全部關鍵字段,其中不包含 SPACE
。如果找到有匹配關鍵字的條目,則將系統字段 SY-SUBRC
設置為 0 並且 SY-TABIX
包含該行的索引。否則 , 將 SY-SUBRC
設置為 4 。
7.3.5 二分法搜索
用關鍵字讀取單行時,可以執行二分法搜索以代替標准順序搜索。為 此, 使用 READ
語句的二分法搜索選項。
READ TABLE <itab> .....BINARY SEARCH.
如果使用二分法搜索選項,則必須按關鍵字中指定的次序對內表進行排序。
如果系統找到匹配指定關鍵字的多行,則讀取索引最低的行。
二分法搜索比線性搜索要快。 因此,應盡可能將內表排序並且使用二分法搜索選項。
7.3.6 比較單行的內容
要將使用 READ
語句讀取的單行內容與目標區域的內容進行比較,可使用 READ
語句的 COMPARING
選項,用法如下:
READ TABLE <itab> [INTO <wa>] <key-option> COMPARING <fields>.
系統讀取由關鍵字或 <key option>
中的索引指定的單行。讀取行之后,將 <fields>
中指定的組件與目標區域中的相應組件進行比較。可以用 INTO
選項指定目標區域 <wa>
。如果表格有表頭,則可以忽略 INTO
選項。這樣,表格工作區域就成了目標區域。
對於 <field>
,可以編寫一系列組件 ... <f1> ...<fn>
。也可以用 ... ALL FIELDS
指定所有組件。
如果系統找到包含指定 <key-option>
的條目,且進行比較的字段內容相同,則將 SY-SUBRC
設置為 0 。如果進行比較的字段內容不同,則返回值 2。如果系統找不到條目,則包含 4 。
如果系統找到條目,則無論比較結果如何,都將其讀入目標區域。
7.3.7 讀取一行部分列內容
要讀取一行部分列的內容, 使用 READ
語句的 TRANSPORTING
選項,用法如下:
READ TABLE <itab> [INTO <wa>] <key-option> TRANSPORTING <fields>.
系統讀取由關鍵字或 <key option>
中索引指定的單行。讀取行之后,將 <fields>
中指定的組件傳輸給目標區域。可以使用 INTO
選項指定目標區域 <wa>
。如果表格有表頭行,可以忽略 INTO
選項。這樣,表格工作區域就成了目標區域。
對於 <fields>
,可以用 ... <f1> ...< fn>
指定一系列組件。也可以用 ... NO FIELDS
指定不傳輸任何組件。
對於后一種情況, READ
語句只影響系統字段 SY-SUBRC
和 SY-TABIX
。
7.3.8 確定內表屬性
如果在處理過程中想知道內表一共包含多少行,或者想知道定義的 OCCURS
參數的大小,使用 DESCRIBE
語句,用法如下:
DESCRIBE TABLE <itab> [LINES <lin>] [OCCURS <occ>].
如果使用 LINES
參數,則將填充行的數量寫入變量 <lin>
。如果使用 OCCURS
參數,則將行的初始號寫入變量 <occ>
。
7.4 修改和刪除內表行
7.4.1 用 MODIF
更改行
要用 MODIFY
語句更改行 , 使用:
MODIFY <itab> [FROM <wa>] [INDEX <idx>].
FROM
選項中指定的工作區域 <wa>
代替 <itab>
中的行。如果表格有表頭行,可以忽略 FROM
選項。這樣,表格工作區域就代替行。
如果使用 INDEX
選項,則新行代替索引為 <idx>
的現有行。如果替換成功,則將 SY-SUBRC
設置為 0 。如果內表包含的行少於 <idx>
,則不更改任何行並且 SY-SUBRC
包含 4 。
如果使用沒有 INDEX
選項的 MODIFY
語句,則系統只能在 LOOP - ENDLOOP
塊中通過更改當前行(例如由 SY-TABIX
返回其索引的行)來處理它。
7.4.2 用WRITE TO
更改行
要用 WRITE TO
語句更改行,請使用下列語法:
WRITE <f>[+<o1>][(<l1>)] TO <itab>[+<o2>][(<l2>)] INDEX <idx>.
將字段 <f>
中偏移量為 <o1>
,長度為 <l1>
部分的內容復制到索引為 <idx>
的表格行中,覆蓋偏移量為 <o2>
,長度為 <l2>
的部分。請注意,即使對於有表頭行的表格,帶 INDEX
選項的 WRITE TO
語句也不訪問表格工作區域,而是訪問表格的某一行。
WRITE TO
語句不能識別表格行的結構。SAP建議只在轉換已知其確切位置的標志時才使用該語句。另一種情況是用一個基本字符字段定義的內表。該結構的表格非常重要,例如,用於程序的動態生成。
7.4.3 在循環中刪除行
要在循環中從內表中刪 除行, 使用 DELETE
語句,用法如下:
DELETE <itab>.
系統只能在 LOOP - ENDLOOP
塊中處理該語句。刪除第一行后,可以取消當前行的定義並取消其對 SY-TABIX
內容的賦值。要在該循環內進一步 處理行,需 使用有 INDEX
選項的語句。
7.4.4 用索引刪除行
要使用索引 刪除行, 使用有 INDEX
選項的 DELETE
語句,用法如下:
DELETE <itab> INDEX <idx>.
如果使用 INDEX
選項,則從 ITAB
中刪除索引為 <idx>
的行。刪除行之后,下面行的索引減 1 。如果操作成功,則將 SY-SUBRC
設置為 0。否則,如果不存在索引為 <idx>
的行,則 SY-SUBRC
包含 4 。
如果在 LOOP - ENDLOOP
塊中刪除某一條目,則當前行及其對 SY-TABIX
內容的賦值可成為未定義。要在該循環內進一步處理行, 需使用有 INDEX
選項的語句。
7.4.5 刪除鄰近的重復條目
要刪除鄰近重復條目,使用 DELETE
語句,用法如下:
DELETE ADJACENT DUPLICATE ENTRIES FROM <itab> [COMPARING <comp>].
系統從內表 <itab>
中刪除所有鄰近重復條目。
如果沒有 COMPARING
選項,則標准關鍵字段的內容必須相同。
如果有 COMPARING
選項 .... COMPARING <f1><f2>...
, 指定字段 <f1><f2> ...
的內容必須相同。也可以通過寫入 (<name>)
代替 <f1>
在運行時在括號中指定字段名。字段 <name>
包含排序關鍵字段的名稱。如果 <name>
在運行時為空,則系統將其忽略。如果包含無效的組件名,則會發生實時錯誤。
如果有 COMPARING
選項 .... COMPARING ALL FIELDS
,所有字段的內容必須相同。如果系統找到並刪除至少一個重復條目,則將 SY-SUBRC
設置為0 。否則,將其設置為 4 。
如果表格根據指定的比較標准進行過排序,則可使用該語句從內表中刪除所有重復條目。
7.4.6 刪除選定行
要刪除一組選定行,使 用 DELETE
語句,用法如下:
DELETE <itab> [FROM <n1>] [TO <n2>] [WHERE <condition>].
用戶必須至少指定三個選項之一。如果使用沒有 WHERE
選項的該語句,則系統從 <itab>
中刪除所有索引在 <n1>
和 <n2>
之間的行。如果不使用FROM
選項,則系統從第一行開始刪除。如果不使用 TO
選項,則系統刪除所有行直到最后一行。
如果使用 WHERE
選項,則系統僅從 <itab>
中刪除滿足條件 <condition>
的行。對於 <condition>
,可指定任何邏輯表達式。第一個操作數必須是內表行結構的組件。
如果系統至少刪除一行,則將 SY-SUBRC
設置為 0 。否則,將其設置為 4 。
7.5 內表排序
要將內表排序, 使用 SORT
語句,用法如下:
SORT <itab> [<order>] [AS TEXT] [BY <f1> [<order>] [AS TEXT] ... <fn> [<order>] [AS TEXT]].
如果不使用 BY
選項,則根據其標准關鍵字對內表 <itab>
進行排序。要定義不同的排序關鍵字,使用 BY
選項。系統就根據指定組件 <f1> ...<fn>
對數據集進行排序。這些字段可以是任何類型,包括類型 P
、 I
和 F
字段,或者表格。排序關鍵字段的數目限制在 250 以內。如果指定多個關鍵字段,則系統首先根據 <f1>
,然后根據 <f2>
,以此類推對記錄進行排序。系統使用 BY
之前指定的選項作為 BY
之后指定的所有字段的缺省項。在單個字段之后指定的選項覆蓋選項在 BY
之前指定的這些字段。
如果在運行時排序標准仍然未知, 可以通過寫入 (<name>)
代替 <fi>
進行動態設置。字段 <name>
包含排序關鍵字段的名稱。如果 <name>
在運行時為空,系統就將其忽略。如果包含無效的組件名,則發生實時錯誤。對於任何在排序字段中使用的字段,用戶都可指定偏移量和長度。
用戶可以通過在 <order>
選項中輸入 DESCENDING
或 ASCENDING
來指定排序順序。標准順序是升序。
用戶可以用選項 AS TEXT
影響字符字段的排序方式。如果沒有 AS TEXT
,則系統二分排序字符字段並根據它們的平台相關內部編碼。如果有選項 AS TEXT
,系統根據當前文本環境按字母順序排序字符字段。用戶可用語句 SET LOCAL LANGUAGE
設置文本環境,這是例外。使用選項 AS TEXT
,用戶可免除在排序之前將字符字段轉換為可排序格式之勞。此類轉換僅在下列情況下才有必要:
首先按字母順序對內表進行排序,然后二分法進行搜索。按字母順序排序后的內表次序與按二分法排序后的次序不同。
用字母關鍵字多次對內表進行排序。在這種情況下效率更佳,因為只進行一次轉換。在程序中為數據庫表格創建字母索引。
如果在 BY
之前指定 AS TEXT
,則選項僅影響排序關鍵字中的字符字段。
如果在字段名之后指定 AS TEXT
,則該字段必須為類型 C 。
如果自己指定排序關鍵字,通過使關鍵字相對短些可提高效率。但是,如果排序關鍵字包含內表,則排序進程可能會慢很多。
排序並不穩定。這意味着也許沒有必要保留排序關鍵字相同的行的舊次序。
如果主內存中沒有足夠的空間用於排序,系統就將數據寫入臨時外部文件。該文件名在 SAP 參數文件參數 DIR_SORTTMP 中定義。
7.6 創建順序表
內表適合於生成順序表。為此,從空的內表開始,然后使用 APPEND
語句的 SORTED BY
選項,用法如下:
APPEND [<wa> TO] <itab> SORTED BY <f>.
如果使用有 SORTED BY
選項的 APPEND
語句,則並不將新行附加為內表 <itab>
的最后一行。而是系統插入新行,這樣內表
<f>
以降序排序。
要生成包含多達 100 個條目的順序表,則應該使用 APPEND
語句。在處理更大的表時,由於效率方面的原因,建議用 SORT
語句對表格進行排序。
如果使用 SORTED BY
選項,表格只能包含 OCCURS
參數中指定的行數。這是一般規則的一個例外。如果添加的行數比指定的要多,則丟棄最后一行。這對於創建長度有限的次序表十分有用。
使用 APPEND
語句的 SORTED BY
選項指定的工作區域必須與內表的行類型兼容。可轉換性對該選項不充分。
7.7 AT……ENDAT行組控制級別
用控制級別語句 AT
可以打開語句塊,用控制級別語句 ENDAT
可以關閉它。語法如下所示:
AT <line>.
<statement block>
ENDAT.
在處理 AT - ENDAT
內語句塊的行條件 <line>
可以是:
|
含義 |
---|---|
FIRST | 內表的第一行 |
LAST | 內表的最后一行 |
NEW <f> | 行組的開頭,與字段 <f> 和 <f> 剩余字段中的內容相同 |
END Of <f> | 行組的結尾,與字段 <f> 和 <f> 剩余字段中的內容相同 |
AT - ENDAT
塊中的語句塊使用這些行條件代表預定義的控制結構。用戶可以使用它們處理內表中的控制斷點 ,而不必使用編程分支和循環中所述的語句自己編程 。
在 AT - ENDAT
語句塊中,工作區域沒有用當前表格行進行填充。初始化所有不是標准關鍵字部件的字段。對於行條件 FIRST
和 LAST
,系統用星號 (*)
改寫所有標准關鍵字段。對於行條件 NEW <f>
和 END OF <f>
,系統用星號 (*)
改寫所有出現在工作區域中指定字段 <f>
右邊的標准關鍵字段。用戶可根據自己的需求在 AT - ENDAT
語句塊中填充工作區域。
使用AT NEW f
和 AT END OF f
時需注意:
(1)f必須是內表的第一個字段;
(2)內表中f之后的字段的值都會變成“*”。
使用AT NEW
, AT FIRST
, AT LAST
,AT END OF
時需注意:LOOP
的時候不能加條件;AT
和ENDAT
之間不能使用LOOP INTO
的working aera
。手動實現AT NEW
,AT END OF
的時候,需要注意,尤其是在AT END OF
的時候。
7.8 比較內表
可以將內表用做邏輯表達式的操作數:
.... <itab1><operator><itab2> ...
對於 <operator>
,可以使用比較所有的字段類型中的表格內列出的所有操作符( EQ 、= 、 NE 、 <> 、 >< 、 GE 、 >= 、 LE 、 <= 、 GT 、 > 、 LT 、 < )。
進行內表比較的第一個條件是它們包含的行數。內表包含的行數越多,則內表就越大。
如果兩個內表行數相同,則逐行、逐個組件進行比較。
如果表格行的組件本身就是內表,則進行遞歸比較。
如果使用等於操作符以外的操作符,則系統找到一對不相等的組件后就立即停止比較並返回該結果。
對於有表頭行的內表,則可在表格名之后使用方括號 []
以將表格工作區域和表格體區別開來。
7.9 初始化內表
要初始化有或沒有表頭 的內表, 使用 REFRESH
語句,用法如下:
REFRESH <itab>.
該語句將內表重置為填充它以前的狀態。這意味着表格將不包含任何行。如果使用沒有表格工作區域的內表,可以使用 CLEAR
語句代替 REFRESH
語句,用法如下:
CLEAR <itab>.
如果使用有表頭行的內表, CLEAR
語句僅清除表格工作區域。要重置整個內表而不清除表格工作區域,使用 REFRESH
語句或 CLEAR
語句,用法如下:
CLEAR <itab>[].
內表名稱之后的方括號指內表體。
使用 REFRESH
或 CLEAR
初始化內表后,系統保持在內存中保留的空間。可以用 FREE
語句釋放內存,用法如下:
FREE <itab>.
也可以使用 FREE
語句重置內表並直接釋放其內存,而不必先使用 REFRESH
或 CLEAR
。與 REFRESH
一樣, FREE
在表格體上,而不在表格工作區域上工作。
在 FREE
語句之后,可以再次定位內表。這樣,系統就再次保留內存空間。可以使用如下邏輯表達式檢查內表是否為空:
... <itab> IS INITIAL ...