ABAP中的內(nèi)表相當于其他程序設計語言中的二維數(shù)組,存儲多行結(jié)構(gòu)相同的數(shù)據(jù) 不同于二維數(shù)組,內(nèi)表在創(chuàng)建后,列結(jié)構(gòu)與列數(shù)是固定不變的,而行數(shù)是動態(tài)增長的 內(nèi)表支持循環(huán)對每行數(shù)據(jù)進行操作,也支持整體操作 內(nèi)表是具有行和列的表結(jié)構(gòu),然而,不同于數(shù)據(jù)庫表,內(nèi)表僅在程序運行期間在內(nèi)存中存儲數(shù)據(jù) ABAP中有三種內(nèi)表類型:標準表,哈希表,排序表
- ABAP內(nèi)表數(shù)據(jù)類型 內(nèi)表數(shù)據(jù)對象是實際的內(nèi)表,可以用數(shù)據(jù)進行填充 內(nèi)表數(shù)據(jù)類型是用于定義內(nèi)表數(shù)據(jù)對象的抽象數(shù)據(jù)類型(ADT)
可以使用的內(nèi)表數(shù)據(jù)類型有: Structure 數(shù)據(jù)庫表
用戶自定義數(shù)據(jù)類型
-ABAP內(nèi)表聲明
1>
TYPES: BEGIN OF line,
field1 TYPE i,
field2 TYPE i,
END OF line.
* 聲明一個數(shù)據(jù)類型
DATA: ITAB_WA TYPE(LIKE) line. “ 聲明一個內(nèi)表工作區(qū)
DATA: ITAB TYPE(LIKE) line OCCURS 0. “ 聲明一個無工作區(qū)的內(nèi)表
DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0. “ 聲明一個有工作區(qū)的內(nèi)表
DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE.
DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE.
2>
DATA: BEGIN OF line,
field1 TYPE i,
field2 TYPE i,
END OF line.
* 聲明一個line對象,該對象可以作為工作區(qū)使用
* 用DATA定義的line本身也是一個結(jié)構(gòu)類型,也可再聲明一個工作區(qū)
DATA: ITAB_WA TYPE(LIKE) line. “ 聲明一個工作區(qū)
DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE. “ 聲明一個帶工作區(qū)的內(nèi)表
DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE . “ 聲明一個帶工作區(qū)的內(nèi)表
3> 直接定義內(nèi)表,這個內(nèi)表是有工作區(qū)的
DATA: BEGIN OF ITAB OCCURS 0 ,
CARR1 LIKE SPFLI-CARRID,
CONN1 LIKE SPFLI-CONNID,
END OF ITAB.
* DATA: ITAB1 TYPE ITAB.(錯誤的,實踐證明,定義出來的什么都不是)。
正確方法:ITAB1 TYPE ITAB OCCURS 0.(這樣定義后的是一個無工作區(qū)的內(nèi)表)。
DATA: ITAB1 LIKE ITAB OCCURS 0 WITH HEADER LINE. “定義一個帶工作區(qū)內(nèi)表
4> type ref to 定義內(nèi)表
type ref to 屬于ABAP中面向?qū)ο蟮木幊?。它是定義一個類的對象。
5>通過數(shù)據(jù)庫表定義
data itab1 type table of sflight . “ 定義一個不帶內(nèi)表的工作區(qū)
data wa1 like line of sflgit . “ 定義一個內(nèi)表工作區(qū)
data itab1 type table of sflight with header line . “定義一個帶內(nèi)表的工作區(qū)
兩種內(nèi)表定義方式的主要區(qū)別在于是否有隱式表頭行
內(nèi)表是按行進行訪問的,然而,程序?qū)?nèi)表的行操作不能直接進行,必須使用一種接口來傳輸,這個接口就是工作區(qū)(Work Area)
--內(nèi)表操作
填充內(nèi)表行 append <wa> to <itab> “ 不帶表頭行的填充 append <itab> “ 帶隱式表頭行的填充
插入內(nèi)表行 insert <wa> into <itab> [INDEX idx] “ insert <itab> [INDEX idx ] “ 隱式表頭行插入內(nèi)表 -- 如果沒有指定INDEX ,則默認插入到內(nèi)表最后一行
讀取內(nèi)表行 read <itab> into <wa> [INDEX idx] read <itab> [INDEX IDX]
修改內(nèi)表行 modify <itab> from <wa> [INDEX idx] modify <itab> [INDEX idx] -- read itab index 3 . -- itab-XX = ‘xxx’ . -- modify itab index 4 .
刪除內(nèi)表行 delete <itab> [INDEX idx] . -- 帶表頭行和不帶表頭行語法一致 。
內(nèi)表循環(huán) Loop at <itab> into <wa> . <statement block> endloop. “ 帶表頭行的內(nèi)表循環(huán)操作
Loop at <itab> . <statement block> endloop. “ 不帶表頭行內(nèi)表操作
-- 循環(huán)體的MODIFY,DELETE等語句不必指定INDEX項,系統(tǒng)默認處理當前行 . -- 如果不需要讀取所有的內(nèi)表行,可以使用WHERE選項進行限制 -- LOOP AT <itab> [WHERE <conditions>]
清空內(nèi)表 clear <itab> . “清空不帶表頭行內(nèi)表
clear<itab>[] . “清空帶表頭行內(nèi)表
內(nèi)表排序 SORT <itab> [ASCENDING | DESCENDING] [AS TEXT] --ASCENDING和DESCENDING指定升序還是降序排列,如果不指定,缺省排序方式是升序 --AS TEXT影響字符字段的排序方式,如果不使用該選項,系統(tǒng)將按字符平臺相應內(nèi)部編碼進行排序,否則,系統(tǒng)根據(jù)當前語言按字母順序排序字符字段
刪除重復行 DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING <comp>]. -- 刪除重復行之前須對內(nèi)表進行排序
判斷內(nèi)表行數(shù) DESCRIBE TALBE <itab> LINES <count>.
將內(nèi)表中部分或全部的數(shù)據(jù)行整體插入另一內(nèi)表 INSERT LINES OF <itab1> [FROM n1] [TO n2] INTO [TABLE] <itab2> [INDEX <idx>]. -- insert lines of itab1 from 1 to 100 into itab2 . “ 將內(nèi)表1前100行數(shù)據(jù)附加到內(nèi)表2 . -- 兩個內(nèi)表必須具有相同的或可轉(zhuǎn)換的行結(jié)構(gòu)
將內(nèi)表中部分或全部的數(shù)據(jù)行整體填充到另一內(nèi)表 APPEND LINES OF <itab1> [FROM n1] [TO n2] TO <itab2>.
按照條件或者索引刪除一組選定行 DELETE <itab> [FROM n1] [TO n2] [WHERE <condition>]. -- delete itab1 from 1 to 100 where age >30 . "刪除內(nèi)表前100行中年齡大于30 的記錄 。
整體復制內(nèi)表,目標內(nèi)表原有內(nèi)容被覆蓋 MOVE <itab1> TO <itab2> 不帶表頭行的內(nèi)表之間進行復制 MOVE <itab1>[] TO <itab2>[]. 帶表頭行的內(nèi)表之間進行復制 MOVE <itab1> TO <itab2>[]. 不帶表頭行的內(nèi)表復制到帶表頭行的內(nèi)表 MOVE-CORRESPONDING <itab1> TO <itab2> 復制內(nèi)表1中與內(nèi)表2具有相同結(jié)構(gòu)的字段進行復制,同樣適用于工作區(qū)
|