ABAP中內表操作

2021-09-24 18:36:27 字數 3228 閱讀 2660

對內表的操作分為資料行操作和整個內錶操作兩大類,行操作可以通過關鍵字或索引兩種途徑進行,但是雜湊表不能通過索引操作。有時同樣的操作關鍵字語句,針對不同種類的內錶有不同的形式。

1,定義

參考字段定義

data:begin of i_list occurs 0 ,

matnr like mara-matnr,

werks like marc-werks,

end of i_list .

這種定義方式是帶表頭的

參考結構體/表/內錶定義

data:i_list2 like table of i_list with header line.

或者data: i_lis2 like i_list occurs 0 with header line.

可以選擇帶表頭或者不帶表頭由 with header line. 決定

參考結構體/表/內錶+欄位定義

data: begin of i_list3 occurs 0.

include structure i_list.

data:   str(10) type c,

end of i_list3.

定義表頭/工作區

data:wa_list like i_list.

2,賦值

帶表頭的內錶可以直接用內表表頭,不帶表頭的內錶需要定義工作區

insert 插入資料

在最內錶最前面插入一條資料 index指定位置   注意:abap的內錶下標從1開始,和其他變成語言的下標從0開始有所不同 插入的下標會占用原來資料的位置,原來位置的資料會往下移一行

insert i_list index 1.             "帶表頭

insert wa_list into i_list index 1. "不帶表頭

內錶間的賦值

結構相同的內錶可以直接賦值

i_list2 = i_list.   效果和   move i_list to i_list2.  相同      會覆蓋i_list2原有的值

move 如果不帶 只作用與表頭/工作區

比如:move i_list to i_list2.  標示表頭之間的賦值 

不同結果內錶間的賦值,可以用迴圈處理

注意:move-corresponding 只對工作區用,move-corresponding i_list to i_list3. 語法錯誤

也可以迴圈中可以單個字段賦值,不然欄位太多就很麻煩了

這個效果同上是一樣的

當然 如果要將不同字段之間賦值就必須使用單個字段賦值了

3.read內錶

read的作用是讀取內錶一行,可以指定key或者index 行號

read table i_list with key matnr = '1001' werks = '1000'. "根據key讀取

if sy-subrc = 0.

write: '讀取到資料'.

endif.

read table i_list index 1. "根據行號讀取  讀取第一行

if sy-subrc = 0.

write: '讀取到資料'.

endif.

4.loop迴圈內錶

迴圈內錶非帶表頭和不帶表頭的迴圈,不帶標題的迴圈必須迴圈到乙個工作區做操作

loop at i_list to wa_list. "不帶表頭的內錶迴圈

endloop.

loop at i_list. "帶表頭的內錶迴圈

endloop.

注意:做loop的時候能做到帶條件最好帶條件,特別是對大資料量做處理的時候,效率會高很多

loop at i_list where matnr = '1001'. "帶條件的迴圈

endloop.

5.modify內錶

abap修改內錶常用的是modify   而modify常常在迴圈中使用

***將i_list中工廠為1000的資料物料修改為4001

loop at i_list.

if i_list-werks = '1000'.

i_list-matnr = '4001'.

endif.

modify i_list.

clear i_list.

endloop.

迴圈中的modify 最好放在每次迴圈最後,而且一般和 clear一起使用,以防修改到不對應的行

modify 還可以不用迴圈,可以根據表頭修改

wa_list-matnr = '4001'.

wa_list-werks = '1000'.

modify i_list from wa_list transporting matnr where werks = wa_list-werks.

這個效果和上面的效果是一樣的,而且效率要比上面的高

6.delete 內錶

根據where條件刪除

delete i_list where matnr = '4001'.

迴圈中刪除(能用where條件刪除的情況下不用迴圈刪除,當然有些情況下必須要在loop裡面刪除的另說)

loop at i_list.

if i_list-matnr = '4001'.

delete i_list.

continue.

endif.

endloop.

注意:迴圈中刪除的時候需要和continue.一起使用,不然如果迴圈中還做其他操作可能資料會亂

7.內錶排序和刪除重複行

內錶排序和刪除重複行也是開發中用的特別多的乙個功能

sort i_list by werks matnr. "預設的是公升序

sort i_list by werks matnr descending. "werks公升序  matnr降序

delete adjacent duplicates from i_list comparing wreks matnr. "刪除相鄰重複行

注意:刪除相鄰重複行之前,必須先排序

abap內錶的操作彙總

abap內錶是abap開發中最常用的工具之一 這裡總結乙個常用的一些操作,以後可以直接複製使用 1,定義 參考字段定義 data begin of i list occurs 0 matnr like mara matnr,werks like marc werks,end of i list 這種...

關於ABAP內錶

1.內錶的型別及定義 1 any table 即任意表型別,此種定義方式只能在傳遞引數的時候定義。例如 form using changing type any table 2 any table包括了兩種型別 index table和hashed table 1 index table 包括了st...

ABAP動態內錶

定義的動態內錶,對應內錶一行的工作區 field symbols type standard table type any.form create dynamic table data lt fcat type slis t fieldcat alv,ls fcat like line of lt ...