SAP ABAP 内表:创建、读取、填充、复制和删除
什么是内部表?
内部表用于从固定结构中获取数据,以便在ABAP中动态使用。内部表中的每一行都具有相同的字段结构。内部表的主要用途是在程序中存储和格式化数据库表中的数据。
什么是工作区?
工作区是数据的单行。它们应与任何内部表具有相同的格式。它用于一次处理内部表中的一行数据。
内部表和工作区之间的区别?
一张图片胜过千言万语
内部表的类型
内部表有两种类型。
- 带标题行的内部表
- 不带标题行的内部表。
带标题行的内部表
- 在此,系统自动创建工作区。
- 工作区与内部表具有相同的数据类型。
- 此工作区称为标题行。
- 对表内容的所有更改或任何操作都在此处完成。因此,记录可以直接插入到表中,或直接从内部表访问。
不带标题行的内部表 :
- 此处没有与表关联的工作区。
- 当我们需要访问此类表时,需要显式指定工作区。
- 因此,这些表不能直接访问。
创建内部表
创建内部表的方法有很多种。让我们一一来看——
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。