ABAP内表
一、内部表的定义:
内部表实际上是一个临时表,它包含正在执行的 ABAP 程序的记录。 内部表仅在 SAP 程序的运行时期间存在。
二、内部表的种类:
- SAP里面主要有三处类型的内表:standard table,sorted table,hashed table
- 标准表,表类型为关键字STANDARD TABLE,系统为该表的每一行生成一个逻辑索引。填充标准表时,可以讲数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可以通过索引或者关键字,另外,在对表进行插入,删除等操作时,个数据行在内存中的位置不变,系统仅重新排列个数据行的索引值。
- 排序表,表类型关键字为SORTED TABLE,也具有一个逻辑索引,不同之处在于排序表总是按其关键字生序排列以后再存储,其访问方式与标准表相同。
Sort <itab> by <col>.
Read table <itab> with key col=<> Binary search.
- 哈希表,表类型关键字为HASHED TABLE,没有索引,只能通过关键字来访问,系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间与表的大小无关。
- standard table,sorted table 可以通过索引和关键字进行访问,hashed table 只能通过关键字进行访问
三、内部表的语法:
- 定义语法:TYPES|DATA itab {TYPE|LIKE} table OF {linetype|lineobj} [WITH KEY] [INITIAL SIZE n].
DATA语句用于声明一个内部表。 程序必须告知表的开始和结束位置。 所以使用BEGIN OF语句,然后声明表名。 之后,使用OCCURS添加,后跟一个数字,这里为0. OCCURS告诉SAP正在创建一个内部表,0表示它最初不包含任何记录(内存大小)。 它将随着它填充数据而扩展。
以下是语法:
DATA: BEGIN OF <itab> Occurs 0,
End of <itab>.
通常为了不至于引起混淆,建议定义与内表结构相同的工作区进行内表操作。
三、内部表的应用:
在内表循环体内对工作区中的数据进行各种处理,如输出,运算等,也可以对内表进行新增,修改,删除等操作。
- 循环体中的MODIFY,DELETE等语句如果不指定INDEX项,系统默认处理当前行。
- 如果不需要读取所有的内表行,可以使用where来限制。
- 在LOOP循环中,应当尽量避免对当前表进行插入或者填充操作,如果一旦循环终止条件,则出现死循环,要防止进入死循环。
以下是示例:
1.删除重复行:1)对内表进行排序。2)删除相邻重复行。
SORT itab(Ascending/Descending)BY <字段名>.
DELETE ADJACENT DUPLICATES FROM itab COMPARING <字段名>.
2.将内表中的部分或全部的数据行整体插入另一个内表,如果需要放入末尾使用APPEND
INSERT LINES OF itab1 (FROM 2 TO 4) INTO itab2 (INDEX 4).
INSERT LINES OF itab1 (FROM 2) INTO itab2 (INDEX 4).
INSERT wa INTO TABLE itab (INDEX 4).
APPEND wa TO itab.
3.按条件或者索引删除一组选定行
DELETE ITAB (FROM 2 TO 4) WHERE conditons .
DELETE TABLE ITAB FROM wa.
4.整体复制内表,目标内原有内容被覆盖:
1)不带表头 MOVE ITAB1 TO ITAB2.
2)带表头 MOVE ITAB1[] TO ITAB2[].
5.两个内表行结构不一致时,对同名的具有相同或者可转换结构字段进行复制,在循环中使用MOVE-CORRESPONDING <WA1> TO <WA2>然后将工作区内的数据压缩至内表。
LOOP AT itab1 INTO wa_itab1.
MOVE-CORRESPONDING wa_itab1 TO wa_itab2 .
APPEND wa_itab2 TO itab2.
CLEAR: wa_itab1 , wa_itab2.
ENDLOOP.
6.判断内表是否为空:注意此时如果内表是带有表头的应该判断itab[]
IF itab IS INITIAL .
ENDIF.
7. 读取内表最后一行
READ TABLE GT_TAB INTO GS_TAB INDEX LINES( GT_TAB ).
8. 内表求和
LOOP AT lt_itab into ls_itab.
COLLECT ls_tab into lt_itab2.
CLEAR ls_itab.
ENDLOOP.
9.内表修改语句-MODIFY
MODIFY table gt_itab FROM gs_itab.
MODIFY gt_itab FROM gs_itab.
对于内表修改命令,MODIFY 与 MODIFY table的区别:
MODIFY table
1、是出现在LOOP外对内表的修改;
2、有一个前提是该内表的定义一定要有主键,如果没有,该语句不能成功。
MODIFY
1、没有主键的内表可以使用该语句。MODIFY gt_intable FROM gs_intable
2、如果不带WHERE条件,只能出现在LOOP中。
3、带WHERE条件,在LOOP外可以处理满足条件的多条数据。
MODIFY gt_intable FROM gs_intable TRANSPORTING a WHERE id = 10.
上面的办法太麻烦,还有很多限制,用FS来修改内表,又快又简单:
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WHERE SEL eq 'X' .
<fs_alv>-DEL = 'X'."内表更新
UPDATE dbtab SET DEL = 'X' WHERE ID = <fs_alv>-ID. "透明表更新
ENDLOOP.
COMMIT WORK AND WAIT.