SAP ABAP 内表:创建、读取、填充、复制和删除

什么是内部表?

内部表用于从固定结构中获取数据,以便在ABAP中动态使用。内部表中的每一行都具有相同的字段结构。内部表的主要用途是在程序中存储和格式化数据库表中的数据。

什么是工作区?

工作区是数据的单行。它们应与任何内部表具有相同的格式。它用于一次处理内部表中的一行数据。

内部表和工作区之间的区别?

一张图片胜过千言万语

Difference Between Internal Table and a Work Area

内部表的类型

内部表有两种类型。

  1. 带标题行的内部表
  2. 不带标题行的内部表。

带标题行的内部表

  • 在此,系统自动创建工作区。
  • 工作区与内部表具有相同的数据类型。
  • 此工作区称为标题行。
  • 对表内容的所有更改或任何操作都在此处完成。因此,记录可以直接插入到表中,或直接从内部表访问。

不带标题行的内部表 :

  • 此处没有与表关联的工作区。
  • 当我们需要访问此类表时,需要显式指定工作区。
  • 因此,这些表不能直接访问。

创建内部表

创建内部表的方法有很多种。让我们一一来看——

1.使用Type语句

现在我们使用TYPE语句创建一个内部表itab。

语法是 –

Types : begin of line,

column1 type I,

column2 type I,

end of line.

示例

TYPES : begin of line,

empno		type I,

empname(20)   	type c	,

end of line.

TYPES语句创建了一个定义的结构行。

要实际创建内部表itab,请使用以下命令-

Data itab type line occurs 10.

创建了一个具有行结构的内部表itab。除了声明内部表的结构外,OCCURS子句还定义了主存储中维护的表条目数量(此处为10)。多余的记录被写入分页区域,可能会影响性能。

2.通过引用另一个表

您可以通过引用现有表来创建内部表。现有表可以是标准SAP表、Z表或另一个内部表。

语法-

Data <f> <type> [with header line].

示例-

DATA itab TYPE line OCCURS 10 with header line.

此处创建了一个类型为line且带标题行的内部表itab。请注意,“带标题行”是可选的。

3.通过引用现有结构

语法-

Data	<f> LIKE <struct> occurs n [with header line].

示例-

DATA itab LIKE sline OCCURS 10.

此处创建了一个与sline具有相同结构的表itab。

4.通过创建新结构

现在我们创建一个具有自己结构的内部表。此处默认创建带标题行的表。

语法 –

Data : Begin of <f> occurs <n>,

<component declaration>,

.................................,

End of <f>.

示例 –

Data : Begin of itab occurs 10,

column1       type I,

column2(4)  type C,

column3      like  mara-ernam,

End of itab.

内部表itab已创建

填充内部表

既然我们已经成功创建了一些内部表,让我们看看如何用一些记录填充它们。有多种方法可以填充表

1.逐行追加数据

第一种方法是使用APPEND语句。

使用APPEND语句,我们可以将另一工作区中的一行添加到内部表,或者向内部表添加一个初始行。

语法 –

APPEND [<wa> TO / INITIAL LINE TO] <itable>.

此处,工作区<wa>或初始行被追加到内部表<itable>。

系统变量SY-TABIX包含追加行的索引。

示例

Data: Begin of itab occurs 10,

col1 type C,

col2 type I,

end of itab.

Append initial line to itab.

结果:' ''0'

初始行将一个根据其类型正确初始化的行添加到表中。此处,col1是字符,col2是整数。然后APPEND初始行添加一个根据列数据类型初始化的行,即col1为空格,col2为0。

2.使用COLLECT语句

COLLECT是另一种用于填充内部表的语句形式。通常,COLLECT用于向具有唯一标准键的内部表中插入行。

语法-

COLLECT [<wa> INTO] <itable>.

对于带标题行的表,省略INTO选项。假设已存在一个与您尝试追加的键相同的条目,则不会向表中添加新行,而是将两个条目的数值字段相加,并且只存在一个与该键对应的条目。SY-TABIX的值更改为原始条目的行。否则,COLLECT的作用类似于APPEND,SY-TABIX包含已处理行的索引。

3.使用INSERT语句

INSERT语句向内部表添加一行/工作区。您可以使用INSERT语句的INDEX子句指定要添加新行的位置。

语法

INSERT [<wa> INTO / INITIAL LINE INTO] <itable> [index <idx>].

此处,工作区<wa>或初始行被插入到内部表<itable>的索引<idx>处。

复制内部表

一个内部表的内容可以通过使用APPEND LINES或INSERT LINES语句复制到另一个内部表。一个更简单的方法是使用以下任何一种语法。

MOVE  <itab1> To <itab2>.

OR

<itab1> = <itab2>.

这些将ITAB1的内容复制到ITAB2。对于带标题行的内部表,我们必须使用[]来区分工作区。因此,要复制带标题行的内部表的内容,语法变为,

itab1[] = itab2[].

读取内部表

我们现在熟悉内部表的创建以及用数据填充它们。现在我们将看看如何实际使用数据或从内部表中检索数据。

1. 使用Loop -Endloop

访问或读取内部表的方法之一是使用LOOP-ENDLOOP。

语法

LOOP AT <itable> [INTO <wa>]

...................................

ENDLOOP.

当您说LOOP AT ITABLE时,内部表ITABLE会逐行读取。在LOOP-ENDLOOP结构的任何部分,您都可以访问该行的列值。即使只读取一条记录,SY-SUBRC的值也会设置为0

2. 使用READ

读取内部表的另一种方法是使用READ语句。

语法-

READ TABLE <itable> [INTO <wa>] INDEX <idx>.

此语句读取当前行或由索引<idx>指定的行。SY-TABIX的值是读取行的索引。如果找到指定索引的条目,则SY-SUBRC设置为0。如果指定索引小于0,则发生运行时错误。如果指定索引超出表大小,则SY-SUBRC设置为4。

删除内部表

从内部表中删除行的方法有很多种。

1.在循环中删除行。

这是删除行最简单的方法。

语法

DELETE <ITABLE>.

此语句仅在循环内有效。它删除当前行。您可以通过添加WHERE子句来有条件地删除循环中的行。

2.使用索引删除行。

这用于从内部表中的任何已知索引处删除行。

语法

DELETE <ITABLE> INDEX <IDX>.

索引为<IDX>的行被删除。后续行的索引递减1。