ABAP中内表操作

对内表的操作分为数据行操作和整个内表操作两大类,行操作可以通过关键字或索引两种途径进行,但是哈希表不能通过索引操作。有时同样的操作关键字语句,针对不同种类的内表有不同的形式。

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. "删除相邻重复行

注意:删除相邻重复行之前,必须先排序

猜你喜欢

转载自blog.csdn.net/littlemangoyx/article/details/80164016