SAP ABAP 内表:创建,读取,增加,复制和删除

举报
雨绸缪 发表于 2023/05/30 17:54:49 2023/05/30
【摘要】 INTERNAL TABLE 内表用于从一个固定结构中获取数据,以便在 ABAP 中动态使用。内部表的每一行都有相同的字段结构。内部表的主要用途是在程序中存储和格式化来自数据库表的数据。 什么是工作区工作区是单行的数据。它们应该具有与任何内部表相同的格式。它是用来逐行处理内部表格中的数据的。内表与工作区的区别: 内表的类型内表的两个类型:有两种类型的内部表格。带有 HEADER Line 的...

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

什么是工作区

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

内表与工作区的区别:

sap-internal-table.webp

内表的类型

内表的两个类型:

有两种类型的内部表格。

  1. 带有 HEADER Line 的内部表
  2. 没有 HEADER Line的内部表。

带有标题行的内表

  1. 在这个内表中,系统会自动创建工作区
  2. 该工作区具有与内部表相同的数据类型
  3. 这个工作区被称为 “标题行”
  4. 所有对表的内容的改变或任何行动都在这里完成。因此,记录可以直接插入表内或直接从内表中访问。

没有标题行的内部表格

  1. 这里没有与表相关的工作区。
  2. 当我们需要访问这些表时,需要明确指定工作区。
  3. 因此,这些表不能被直接访问。

创建内表

有许多方法可以创建一个内部表。让我们逐一看一下

  1. 通过使用类型声明

现在让我们使用 TYPE 语句创建一个内部表 itab。其语法如下:

Types : BEGIN OF line,

    column1 type I,

    column2 type I,

END OF line.

例如,定义个员工信息内表:

TYPES : BEGIG OF line,

    empno		type I, " 员工号

    empname(20)   	type c, " 员工姓名

END OF line.

TYPES 语句按照定义创建了一个结构体。

要实际创建一个内部表 itab,请使用下面的命令:

Data itab type line occurs 10.

除了声明内部表的结构外,OCCURS 子句还定义了在主存储中维护多少个表项(在本例中为 10 个),一个内部表 itab 被创建。额外的记录会被写到分页区,会影响性能。

  1. 通过参考另一个表

你可以通过引用一个现有的表来创建一个内部表。现有的表可以是一个标准的 SAP 表,一个 Z 表或其他内部表。

语法:

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

例如:

DATA itab TYPE line OCCURS 10 with header line.

这里创建了一个内部表 itab,其类型为带标题的行。请注意 with header line 是可选的。

  1. 通过参考现有的结构

语法:

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

例如:

DATA itab LIKE sline OCCURS 10.

这里创建了一个 itab 表,其结构与 sline 的结构相同。

  1. 通过创建一个新的结构

现在让我们创建一个具有我们自己结构的内部表。在这里,默认情况下,该表是用一个标题行创建的。

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。

  1. 使用 COLLECT 语句

COLLECT 是另一种用于填充内部表的语句形式。一般来说,在向具有唯一标准键的内部表插入行时使用 COLLECT

语法:

COLLECT [<wa> INTO] <itable>.

如果是有标题行的表,INTO 选项被省略了。假设已经有一个条目,其键值与你试图追加的条目相同,那么就不会向表添加新的一行,但两个条目的数字字段都被添加,只有一个与键值相对应的条目存在。SY-TABIX 的值被改变为原始条目的行。否则,COLLECT 的作用与 APPEND 相似,SY-TABIX 包含被处理行的索引。

  1. 使用 INSERT 语句

INSERT 语句在内部表格中增加了一个行/工作区。你可以通过在 INSERT 语句中使用 INDEX 子句来指定添加新行的位置。

语法:

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

这里,工作区 <wa>INITIAL LINE 被插入内部表<itable> 的索引 <idx> 中。

复制内表

通过使用 APPEND LINESINSERT 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,即使只有一条记录被读取。

  1. 使用 READ 语句

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

语法:

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

该语句读取当前行或由索引 <idx>指定的行。SY-TABIX 的值是所读行的索引。如果找到具有指定索引的条目,那么 SY-SUBRC 被设置为 0。如果指定的索引小于 0,那么会发生运行时错误。如果指定的索引超过了表的大小,那么 SY-SUBRC 被设置为 4。

删除内表

有许多方法可以从一个内部表格中删除行。

  1. 在 loop 中删除

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

DELETE <ITABLE>.

这条语句只在一个循环中起作用。它删除了当前的行。你可以通过添加 WHERE 子句有条件地删除循环中的行。

  1. 使用索引删除行

这是用来从内部表的任何知道索引处删除一行。语法:

DELETE <ITABLE> INDEX <IDX>.

索引为 <IDX> 的行被删除。下面一行的索引被减去 1。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。