SAP ABAP 内表:创建,读取,增加,复制和删除
INTERNAL TABLE 内表用于从一个固定结构中获取数据,以便在 ABAP 中动态使用。内部表的每一行都有相同的字段结构。内部表的主要用途是在程序中存储和格式化来自数据库表的数据。
什么是工作区
工作区是单行的数据。它们应该具有与任何内部表相同的格式。它是用来逐行处理内部表格中的数据的。
内表与工作区的区别:
内表的类型
内表的两个类型:
有两种类型的内部表格。
- 带有 HEADER Line 的内部表
- 没有 HEADER Line的内部表。
带有标题行的内表
- 在这个内表中,系统会自动创建工作区
- 该工作区具有与内部表相同的数据类型
- 这个工作区被称为 “标题行”
- 所有对表的内容的改变或任何行动都在这里完成。因此,记录可以直接插入表内或直接从内表中访问。
没有标题行的内部表格
- 这里没有与表相关的工作区。
- 当我们需要访问这些表时,需要明确指定工作区。
- 因此,这些表不能被直接访问。
创建内表
有许多方法可以创建一个内部表。让我们逐一看一下
- 通过使用类型声明
现在让我们使用 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
被创建。额外的记录会被写到分页区,会影响性能。
- 通过参考另一个表
你可以通过引用一个现有的表来创建一个内部表。现有的表可以是一个标准的 SAP 表,一个 Z 表或其他内部表。
语法:
Data <f> <type> [with header line].
例如:
DATA itab TYPE line OCCURS 10 with header line.
这里创建了一个内部表 itab
,其类型为带标题的行。请注意 with header line
是可选的。
- 通过参考现有的结构
语法:
Data <f> LIKE <struct> occurs n [with header line].
例如:
DATA itab LIKE sline OCCURS 10.
这里创建了一个 itab
表,其结构与 sline
的结构相同。
- 通过创建一个新的结构
现在让我们创建一个具有我们自己结构的内部表。在这里,默认情况下,该表是用一个标题行创建的。
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
填充内部表格
现在我们已经成功地创建了一些内部表,让我们看看如何用一些记录来填充它们。有多种方法可用于填充表:
- 逐行追加数据
第一个可用的方法是使用 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。
- 使用
COLLECT
语句
COLLECT
是另一种用于填充内部表的语句形式。一般来说,在向具有唯一标准键的内部表插入行时使用 COLLECT
。
语法:
COLLECT [<wa> INTO] <itable>.
如果是有标题行的表,INTO
选项被省略了。假设已经有一个条目,其键值与你试图追加的条目相同,那么就不会向表添加新的一行,但两个条目的数字字段都被添加,只有一个与键值相对应的条目存在。SY-TABIX
的值被改变为原始条目的行。否则,COLLECT
的作用与 APPEND
相似,SY-TABIX
包含被处理行的索引。
- 使用
INSERT
语句
INSERT
语句在内部表格中增加了一个行/工作区。你可以通过在 INSERT
语句中使用 INDEX
子句来指定添加新行的位置。
语法:
INSERT [<wa> INTO / INITIAL LINE INTO] <itable> [index <idx>].
这里,工作区 <wa>
或 INITIAL LINE
被插入内部表<itable>
的索引 <idx>
中。
复制内表
通过使用 APPEND LINES
或 INSERT LINES
语句,可以将一个内部表的内容复制到另一个表中。一个更简单的方法是使用以下任何一种语法。
MOVE <itab1> To <itab2>.
OR
<itab1> = <itab2>.
这些复制 ITAB1
的内容到 ITAB2
。如果是带有标题行的内部表格,我们必须使用 []
,以区别于工作区。因此,要复制带有标题行的内部表格的内容,其语法为:
itab1[] = itab2[].
读取内表
我们现在已经熟悉了内部表的创建和数据的填充。现在我们将看到我们如何实际使用这些数据或从内部表检索数据。
- 使用
LOOP-ENDLOOP
访问或读取内部表的方法之一是通过使用 LOOP-ENDLOOP
。语法:
LOOP AT <itable> [INTO <wa>]
...................................
ENDLOOP.
在这里,当你说 LOOP AT ITABLE
时,那么内部表 ITABLE
被逐行读取。你可以在 LOOP-ENDLOOP
结构的任何部分访问该行的列的值。SY-SUBRC
的值被设置为 0,即使只有一条记录被读取。
- 使用
READ
语句
读取内部表的另一种方法是通过使用 READ
语句。
语法:
READ TABLE <itable> [INTO <wa>] INDEX <idx>.
该语句读取当前行或由索引 <idx>
指定的行。SY-TABIX
的值是所读行的索引。如果找到具有指定索引的条目,那么 SY-SUBRC
被设置为 0。如果指定的索引小于 0,那么会发生运行时错误。如果指定的索引超过了表的大小,那么 SY-SUBRC
被设置为 4。
删除内表
有许多方法可以从一个内部表格中删除行。
- 在 loop 中删除
这是最简单的删除行的方法。语法:
DELETE <ITABLE>.
这条语句只在一个循环中起作用。它删除了当前的行。你可以通过添加 WHERE
子句有条件地删除循环中的行。
- 使用索引删除行
这是用来从内部表的任何知道索引处删除一行。语法:
DELETE <ITABLE> INDEX <IDX>.
索引为 <IDX>
的行被删除。下面一行的索引被减去 1。
- 点赞
- 收藏
- 关注作者
评论(0)