Loading

Abap内表操作

Abap内表

什么是内表:内表是内存中建立的一个临时表,你可以在程序运行时对表中的数据进行,插入,修改,删除等操作,程序跑完了,就会被释放。

内表定义

内表有三种类型:标准表,哈希表,排序表(主要用标准表)。

预定义的基本数据类型有:C(文本型数据)、N(数字型)、T(时间型)、X(十六进制)、 D(日期型)、F(浮点型)、I(整数型)、P(压缩号)。

注意:在abap中要用data定义数据对象,也就是定义变量(内表也是一种变量)。后面再用type或like来定义变量的类型,

  • 这里要要注意type和like的用法,一般能用like的地方都能用type。
  • 当用type的不一定能用like。因为type一般定义的预定义和自定义的类型,而like用于定义词典对象和已经存在的对象。
  • 其中types直接定义的数据类型与结构,是没有分配内存空间的。

内表定义三个步骤:

  1. 定义类型
  2. 参考类型定义结构、工作区域、变量
  3. 参考类型定义内表

定义类型:通过types开头定义

TYPES: BEGIN OF TYP_LINE,
      field1 TYPE I,
      field2 TYPE I,
END OF TYP_LINE.

参考类型定义结构、工作区域、变量:定义结构通过data开头定义

DATA: WA_ITAB TYPE(LIKE) TYP_LINE. "声明一个内表工作区

参考类型定义内表:定义内表通过data开头定义

DATA: ITAB TYPE(LIKE) TYP_LINE OCCURS 0. "声明一个无工作区的内表
DATA: ITAB TYPE(LIKE) STANDARD TABLE OF TYP_LINE INITIAL SIZE 0. "声明一个有工作区的内表
DATA: ITAB TYPE(LIKE) TYP_LINE OCCURS 0 WITH HEADER LINE.
DATA: ITAB TYPE(LIKE) STANDARD TABLE OF TYPE_LINE INITIAL SIZE 0 WITH HEADER LINE. "直接定义内表,这个内表是有工作区的
DATA: BEGIN OF ITAB OCCURS 0,
     CARR1 LIKE SPFLI-CARRID,
     CONN1 LIKE SPFLI-CONNID,
END OF ITAB.

定义后的是一个无工作区的内表

DATA: ITAB1 TYPE ITAB OCCURS 0. 

定义一个带工作区内表

DATA: ITAB1 LIKE ITAB OCCURS 0 WITH HEADER LINE. 

参考工作区域定义内表

DATA: ITAB LIKE TABLE OF WA_ITAB.

参考内表定义工作区

DATA: WA_ITAB LIKE ITAB .

内表操作

填充内表行

APPEND <wa> TO <itab>. "不带表头行的填充"
APPEND <itab>.         "带隐式表头行的填充"

插入内表行

INSERT <wa> into <itab> [INDEX idx] "不带表头行的填充"
INSERT <itab> [INDEX idx ]          "隐式表头行插入内表
-- 如果没有指定INDEX ,则默认插入到内表最后一行

读取内表行

READ <itab> into <wa> [INDEX idx]
READ <itab> [INDEX IDX]

修改内表行

MODIFY <itab> FROM <wa> [INDEX idx]
MODIFY <itab> [INDEX idx]

删除内表行

DELETE <itab> [INDEX idx] .
--带表头行和不带表头行语法一致

内表循环

LOOP AT <itab> INTO <wa> .
....
ENDLOOP.  "不带表头行的内表循环操作
LOOP AT <itab> .
....
ENDLOOP.  "带表头行循环操作
  • 循环体的MODIFY,DELETE等语句不必指定INDEX项,系统默认处理当前行 .
  • 如果不需要读取所有的内表行,可以使用WHERE选项进行限制
LOOP AT <itab> [WHERE <conditions>]

清空内表

CLEAR <itab> .  --清空不带表头行内表
CLEAR<itab>[] . --清空带表头行内表
REFRESH <itab>. --清空带表头行和不带表头内表

内表排序

SORT <itab> [ASCENDING | DESCENDING] [AS TEXT]
  • ASCENDING和DESCENDING指定升序还是降序排列,如果不指定,缺省排序方式是升序
  • AS TEXT影响字符字段的排序方式,如果不使用该选项,系统将按字符平台相应内部编码进行排序,否则,系统根据当前语言按字母顺序排序字符字段

删除重复行

DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING <comp>].
  • 删除重复行之前须对内表进行排序

将内表中部分或全部的数据行整体插入另一内表

INSERT LINES OF <itab1> [FROM n1] [TO n2] INTO [TABLE] <itab2> [INDEX <idx>].

--insert lines of itab1 from 1 to 100 into itab2 . 
-- 将内表1前100行数据附加到内表2 .
-- 两个内表必须具有相同的或可转换的行结构]

将内表中部分或全部的数据行整体填充到另一内表

APPEND LINES OF <itab1> [FROM n1] [TO n2] TO <itab2>.

按照条件或者索引删除一组选定行

DELETE <itab> [FROM n1] [TO n2] [WHERE <condition>].
-- delete itab1 from 1 to 100 where age >30 . "删除内表前100行中年龄大于30 的记录 。

整体复制内表,目标内表原有内容被覆盖

MOVE <itab1> TO <itab2>      "不带表头行的内表之间进行复制"
MOVE <itab1>[] TO <itab2>[]. "带表头行的内表之间进行复制"
MOVE <itab1> TO <itab2>[].   "不带表头行的内表复制到带表头行的内表"
MOVE-CORRESPONDING <itab1> TO <itab2>
--复制内表1中与内表2具有相同结构的字段进行复制,同样适用于工作区
posted @ 2022-04-03 22:32  二月虫子  阅读(568)  评论(0)    收藏  举报