添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
温暖的遥控器  ·  python ...·  4 月前    · 
豁达的可乐  ·  spring cloud gateway ...·  6 月前    · 
爱看球的机器猫  ·  使用 JS 的 download ...·  1 年前    · 

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​ 只能通过关键字进行访问

三、内部表的语法:

  1. 定义语法:​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.

发布于 2022-08-01 10:12