Abap 內表的語法


ABAP中的內表相當於其他程序設計語言中的二維數組,存儲多行結構相同的數據
不同於二維數組,內表在創建后,列結構與列數是固定不變的,而行數是動態增長的
 內表支持循環對每行數據進行操作,也支持整體操作
 內表是具有行和列的表結構,然而,不同於數據庫表,內表僅在程序運行期間在內存中存儲數據
ABAP中有三種內表類型:標准表,哈希表,排序表

- ABAP內表數據類型
 內表數據對象是實際的內表,可以用數據進行填充
 內表數據類型是用於定義內表數據對象的抽象數據類型(ADT)
 

可以使用的內表數據類型有:
 Structure
 數據庫表

 用戶自定義數據類型

-ABAP內表聲明

1>

TYPES: BEGIN OF line,

       field1 TYPE i,

       field2 TYPE i,

       END OF line.

* 聲明一個數據類型

DATA: ITAB_WA TYPE(LIKE) line.    “ 聲明一個內表工作區

DATA: ITAB TYPE(LIKE) line OCCURS 0.  “ 聲明一個無工作區的內表

DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0.   “ 聲明一個有工作區的內表

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對象,該對象可以作為工作區使用

* 用DATA定義的line本身也是一個結構類型,也可再聲明一個工作區

DATA: ITAB_WA TYPE(LIKE) line.   “ 聲明一個工作區

DATA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE.  “ 聲明一個帶工作區的內表

DATA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE . “ 聲明一個帶工作區的內表

3> 直接定義內表,這個內表是有工作區的

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.(這樣定義后的是一個無工作區的內表)。

DATA: ITAB1 LIKE ITAB OCCURS 0 WITH HEADER LINE.  “定義一個帶工作區內表

4> type ref to 定義內表

type ref to 屬於ABAP中面向對象的編程。它是定義一個類的對象。

 

5>通過數據庫表定義

data itab1 type table of sflight . “ 定義一個不帶內表的工作區

data wa1 like line of sflgit  .    “ 定義一個內表工作區

data itab1 type table of sflight with header line . “定義一個帶內表的工作區

兩種內表定義方式的主要區別在於是否有隱式表頭行

內表是按行進行訪問的,然而,程序對內表的行操作不能直接進行,必須使用一種接口來傳輸,這個接口就是工作區(Work Area)
 

--內表操作

填充內表行
append <wa> to <itab>   “ 不帶表頭行的填充
append <itab>                “ 帶隱式表頭行的填充

插入內表行
insert <wa> into <itab> [INDEX idx]    “
insert <itab> [INDEX idx ]                   “ 隱式表頭行插入內表
-- 如果沒有指定INDEX ,則默認插入到內表最后一行

讀取內表行
read <itab> into <wa> [INDEX idx] 
read <itab> [INDEX IDX] 

修改內表行
modify <itab> from <wa> [INDEX idx]
modify <itab> [INDEX idx]
-- read itab index 3 .
-- itab-XX = ‘xxx’ .
-- modify itab index 4 .

刪除內表行
delete <itab> [INDEX idx] .
-- 帶表頭行和不帶表頭行語法一致 。

內表循環
Loop at <itab> into <wa> .
   <statement block>
endloop.                                     “ 帶表頭行的內表循環操作

Loop at <itab> .
  <statement block>
endloop.                                     “ 不帶表頭行內表操作

-- 循環體的MODIFY,DELETE等語句不必指定INDEX項,系統默認處理當前行 .
-- 如果不需要讀取所有的內表行,可以使用WHERE選項進行限制
-- LOOP AT <itab> [WHERE <conditions>]

清空內表
clear <itab> . “清空不帶表頭行內表

clear<itab>[] . “清空帶表頭行內表

內表排序
SORT <itab> [ASCENDING | DESCENDING] [AS TEXT]
--ASCENDING和DESCENDING指定升序還是降序排列,如果不指定,缺省排序方式是升序
--AS TEXT影響字符字段的排序方式,如果不使用該選項,系統將按字符平台相應內部編碼進行排序,否則,系統根據當前語言按字母順序排序字符字段

刪除重復行
DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING <comp>].
-- 刪除重復行之前須對內表進行排序

判斷內表行數
DESCRIBE TALBE <itab> LINES <count>.

將內表中部分或全部的數據行整體插入另一內表
INSERT LINES OF <itab1> [FROM n1] [TO n2] INTO [TABLE] <itab2> [INDEX <idx>].
-- insert lines of itab1 from 1 to 100 into itab2 . “ 將內表1前100行數據附加到內表2 .
-- 兩個內表必須具有相同的或可轉換的行結構

將內表中部分或全部的數據行整體填充到另一內表
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 . "刪除內表前100行中年齡大於30 的記錄 。

整體復制內表,目標內表原有內容被覆蓋
MOVE <itab1> TO <itab2>                            不帶表頭行的內表之間進行復制
MOVE <itab1>[] TO <itab2>[].                      帶表頭行的內表之間進行復制
MOVE <itab1> TO <itab2>[].                        不帶表頭行的內表復制到帶表頭行的內表
MOVE-CORRESPONDING <itab1> TO <itab2> 復制內表1中與內表2具有相同結構的字段進行復制,同樣適用於工作區

 

 


免責聲明!

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



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