ABAP 内表

如题所述

第1个回答  2022-06-25
内表:在程序内部定义并使用的表。

内表刚定义时不会事先指定占用实际内存的大小,用INITAL SIZE也并不能使内表占用实际内存空间,只是预约内存空间。

标准表:有顺次索引的树形结构内表,是可以利用索引和关键字操作的内表;标准表的关键字不唯一,在定义时不能使用WITH UNIQUE KEY语句。

DATA: 表名 LIKE/TYPE STANDARD TABLE OF 要参考的变量或类型                                                   WITH NO-UNIQUE KEY    字段名.

排序表:与标准表一样都是索引表,其中排序表是已经按照关键字排序好的内表类型,且可以使用WITH UNIQUE KEY 或 WITH NO-UNIQUE KEY;排序表是已经排序好的内表类型,所以不能使用SORT语句进行再次排序。

DATA: 表名 LIKE/TYPE SORTED TABLE OF 要参考的变量或类型                                                   WITH NO-UNIQUE KEY    字段名.

哈希表:没有索引,只能指定UNIQUE关键字(关键字内容不能重复)。

DATA:表名 LIKE/TYPE HASHED TABLE OF 要参考的变量或类型                                                   WITH UNIQUE KEY    字段名.

在定义内表时没有WITH HEADER LINE则该内表没有表头,在往内表里APPEND数据时,需要追加工作区(这里可以是结构体,也就是说需要先给工作区赋值,然后再APPEND 工作区 TO 内表)。其它对内表行内容执行的操作同样也要借助工作区才能实现。

如果在定义内表时追加WITH HEADER LINE(表头),这时就定义了一个带表头的内表,表头的下一行就是内表的第一行,这时内表的表头就承担了工作区的职能。

往带表头的的内表里追加数据时,只需要先给表头赋值,在APPEN 内表名就可以了

APPEND itab = APPEND itab TO itab.(这句话的意思就是把表头里的数据追加到内表中)

这是因为内表名与表头名相同

INSERT itab/wa INTO TABLE itab. = INSERT TABLE itab.

COLLECT itab/wa INTO itab = COLLECT itab.

READ TABLE itab INTO itab/wa = READ TABLE itab.

...

内表赋值

MOVE itab1 TO itab2. "这里需要注意的是带表头的内表用这种赋值方法只会赋值表头中的数据。

要想赋值表体中的数据,可以用以下的方式:

MOVE itab1[] TO itab2[].

当然这两种赋值方式执行成功的前提是两个表的类型需一致,要想赋值不同类型的内表可以使用如下:

MOVE-CORRESPONDING itab1 TO itab2. "这种方式是赋值对应字段

内表的初始化

CLEAR itab (带表头的内表只删表头,不带表头的内表删表体)

CLEAR itab[] (删除带表头的表体)

内表排序

1.SORT(可以排序标准表和哈希表)

用内表的关键字堆排序语法:SORT itab [ASCENDING | DESCENDING].其中ASCENDING是升序(默认排序),DESCENDING是降序。对于没有设有关键字的内表进行排序时,讲组合字符串类型的字段作为主键进行排序。

2.指定排序字段

SORT itab [ASCENDING | DECENDING]  BY f1 [ ASCENDING | DECENDING]                                      ... fn [ASCENDING | DECENDING].(如果字段f1出现空值,则会排出此列)

3.Stable SORT

SORT itab ... STABLE. "保留序列号

内表属性

DESCRIBE TABLE itab [LINES gv_line] [OCCURS gv_init] [KIND kind]."LINES返回包含的数据件数,OCCURES返回内表的初始大小,KIND返回内表的类型T(标准表)S(排序表)H(哈希表)。

追加内表数据

1.INSERT

追加一条数据时(两个表的类型相同 ) INSERT wa INTO TABLE itab."没有定义表头的内表

                                                              INSERT itab.  "定义过表头的内表

追加多条数据时(两个表类型相同)

      INSERT lines OF itab1 [FROM n1] [TO n2] INTO TABLE itab2." 带不带表头的内表都可以使用这种方式。

2.利用索引追加一条数据(不能用于哈希表)

INSERT line INTO itab [Index idx]."利用Index语句可以在指定的索引位置追加一条数据,语句执行成功时SY-SUBRC返回0,SY-TABIX返回索引值,带表头的内表INSERT itab INDEX 1.

利用索引还可以追加多条数据

INSERT LINES OF itab1 INTO itab2 INDEX idx.

不同类型的内表具有各自不同的INSERT效果

标准表:追加数据到内表的最后一行(与APPEND效果相同)

排序表:按照内表排序好的顺序追加数据(若关键字是不唯一的,重复数据会追加到相同数据的上一行中,若关键字唯一则报错)

哈希表:按照表关键字的哈希索引顺序追加数据

2.APPEND

只能利用索引追加数据,因此哈希表不能使用此语句

追加一条数据时(表类型相同): APPEND wa TO itab. (SY-TABIX保存追加数据的内表行,即追加后内表的索引编号)

追加多条数时(表类型相同):APPEND LINES OF itab1 [FROM n1] [TO n2] TO itab2.      

注意:尽量不要使用APPEND往SORTED TABLE 里追加数据                                                                                                                  

3.COLLECT:可以合计内表中数字类型的字段

除了关键字以外的数据都需要是数字类型(f,i,p)(这不代表关键字不能是数字类型),当存在相同关键字的数据时,合计数字类型的字段,不存在相同关键字的数据时,直接追加数据(不存在关键字的内表,则会把char类型的字段作为关键字进行相同的操作)

COLLECT wa INTO itab.

1.MODIFY(可以利用关键字或索引修改数据)

    利用关键字修改一条数据(若内表关键字NON-UNIQUE,即存在重复数据时,会修改第一条数据):MODIFY TABLE itab FROM wa [TRANSPORTING f1 ...fn].( 利用transporting可以修改指定字段 );如果是带表头的内表可以省略FROM wa

    利用WHERE条件修改多条数据:MODIFY itab FROM wa TRANSORTING f1 .. fn WHERE cond. (其中cond是字段限制条件)

    利用索引修改一条数据:MODIFY TABLE itab FROM wa INDEX idx [TRANSPORTING f1 ... fn].(在loop循环中可以省略index选项,此时会修改当前行数据)

在LOOP循环中,MODIFY TABLE itab变为MODIFY itab.

    利用工作区删除内表中的一条数据:DELETE TABLE itab FROM wa.

    在关键字不唯一的标准表中使用WITH TABLE KEY删除重复数据中的一条数据:DELETE TABLE itab WITH TABLE KEY k1 = f1 ... kn = fn.

    利用WHERE条件删除多条数据:DELETE itab WHERE cond.

    利用索引删除内表数据:DELTE itab INDEX idx.

 利用索引也可以删除多条数据

DELETE itab FROM n1 TO n2."删除从n1到n2的数据

DELETE itab FROM n1."删除从n1开始之后的所有数据

DELETE itab TO n2."删除从开始到n2的数据

    利用ADJACENT DUPLICATE语句删除重复行(执行此语句前,先用SORT语句进行排序)

DELETE ADJACENT DUPLICATE FROM itab COMPARING  ALL FIELDS(所有字段相同才算重复)                                                            COMPARING 指定字段 (指定字段相同才算重复)

利用read读取内表数据。当存在表头时,对应得数据会保存到表头中。

    利用关键字读取内表:READ TABLE itab FROM wa INTO result.(wa和result均是工作区,可以利用给wa赋值某关键字去唯一确定内表中的一行数据,然后读取到result中)如果内表存在表头可以省略FROM以及之后的内容。                                                                          READ TABLE itab WITH TABLE KEY k1=f1 ... kn=fn INTO result.(带表头的内表可以省略INTO之后的内容)

    利用索引读取内表:READ TABLE itab INDEX INTO result.(带表头的内表省略INTO之后的内容)