对内表的操作分为数据行操作和整个内表操作两大类,行操作可以通过关键字或索引两种途径进行,但是哈希表不能通过索引操作。有时同样的操作关键字语句,针对不同种类的内表有不同的形式。
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,赋值
APPEND 追加
带表头的内表可以直接用内表表头,不带表头的内表需要定义工作区
APPEND i_list. "带表头内表赋值
APPEND wa_list TO i_list. "不带表头的内表赋值
i_list-matnr = '1001'.
i_list-werks = '1000'.
APPEND i_list.
CLEAR i_list.
wa_list-matnr = '1002'.
wa_list-werks = '1000'.
APPEND wa_list TO i_list.
CLEAR wa_list.
注意:每次APPEND 完之后记得CLEAR 一下表头,防止下次重复用到相同的值
INSERT 插入数据
默认在最内表最后插入一条数数据,效果和APPEND wa_list TO i_list一样
INSERT wa_list INTO TABLE i_list.
在最内表最前面插入一条数据 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. 标示表头之间的赋值
APPEND LINES OF i_list TO i_list2. "追加,不会覆盖i_list2原来的值
APPEND 还可以指定追加第几行
APPEND LINES OF i_list FROM 1 TO 3 TO i_list2. "将内表i_list的前3行数据附加到内表i_list2
不同结果内表间的赋值,可以用循环处理
LOOP AT i_list.
MOVE-CORRESPONDING i_list TO i_list3. "将字段相同的i_list赋值给i_list3.
APPEND i_list3.
CLEAR i_list3.
ENDLOOP.
注意:MOVE-CORRESPONDING 只对工作区用,MOVE-CORRESPONDING i_list[] TO i_list3[]. 语法错误
也可以循环中可以单个字段赋值,不然字段太多就很麻烦了
LOOP AT i_list.
i_list3-matnr = i_list-matnr.
i_list3-werks = i_list-werks.
APPEND i_list3.
CLEAR i_list3.
ENDLOOP.
这个效果同上是一样的
当然 如果要将不同字段之间赋值就必须使用单个字段赋值了
LOOP AT i_list.
MOVE-CORRESPONDING i_list TO i_list3. "将字段相同的i_list赋值给i_list3.
i_list3-str = i_list-matnr. "不同字段间的赋值
APPEND i_list3.
CLEAR i_list3.
ENDLOOP.
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. "删除相邻重复行
注意:删除相邻重复行之前,必须先排序