第八章 创建和处理内表.docx
《第八章 创建和处理内表.docx》由会员分享,可在线阅读,更多相关《第八章 创建和处理内表.docx(58页珍藏版)》请在冰豆网上搜索。
![第八章 创建和处理内表.docx](https://file1.bdocx.com/fileroot1/2023-6/11/46a7f70b-64ba-424c-8811-a8677fff29bf/46a7f70b-64ba-424c-8811-a8677fff29bf1.gif)
第八章创建和处理内表
ÕÂ8:
8–1创建和处理内表
概览
内容
什么是内表
内表的目的
内表的结构
标识表格行
访问内表
创建内表
创建内表数据类型
创建内表数据对象
使用内表
填充内表
读取内表
更改和删除内表行
内表排序
创建次序表
循环处理
比较内表
初始化内表
本节讨论内表。
除字段串外,内表还构成ABAP/4提供的另一种结构化数据类型。
本节主题描述
在处理内表中大量的数据时,花费的计算机时间对性能来说非常关键。
例如,要获得最佳性能,在“ABAP/4开发工作台”初始屏幕(或事务SE30)上选择“测试->运行时间分析”,在“内表”下选定“提示&技巧.”,就会出现有关如何改进性能的不同任务示例。
8–1什么是内表
下列主题提供内表简介:
8–1内表的目的
在ABAP/4中,主要使用表格。
表格是R/3系统中的关键数据结构。
长期使用的数据存储在关系数据库表格中。
关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表。
除了数据库表格,还可以创建仅在程序运行时间内存在的内表。
ABAP/4提供了针对内表的不同操作。
例如,可以搜索、附加、插入或删除行。
内表中的行数并不固定。
根据需求,系统可实时增加内表的大小。
例如,如果想将某个数据库表格读入内表,不必事先知道数据库表格的大小。
该特征项使得内表使用起来十分方便,同时还支持动态编程。
可以使用内表在数据库表格的子集上执行表格计算。
例如,可以将数据库表格的某个部分读入内表(参见将数据读入内表)。
然后可以从内表中计算总和或生成次序表。
内表的另一种用处是根据程序需要重新组织数据库表格的内容。
例如,可以从一个或多个大客户表格特定的数据中将与创建电话清单有关的数据读入内表中。
然后可在程序运行期间直接访问该清单,而不用每次调用时都执行耗时的数据库查询。
除了在使用来自数据库表格的数据时使用内表外,内表还是ABAP/4中用于在程序中实现许多复杂数据结构的重要特征项(参见结构化数据类型(页3–6))。
8–1内表的结构
在ABAP/4中,可以区别内表数据类型(定义内表的结构)和内表数据对象(实际的内表而且可以用数据进行填充)。
内表数据类型是数据结构(可用于将数据对象说明为内表)的抽象定义。
关于数据类型和数据对象之间区别的详细信息,参见声明数据(页3–1)。
数据类型
内表是ABAP/4中两种结构化数据类型中的一种。
其它结构化数据类型是字段串(参见结构化数据类型(页3–6))。
内表包括任意数据类型相同的行。
行的数据类型可以是基本的或结构化的。
该定义打开了多种内表结构,范围从包含一个字段的行到包含字段串将内表作为组件的行。
可以用带OCCURS参数的TYPES语句将数据类型定义为内表(参见创建内表数据类型(页8–3))。
定义数据类型时不占用内存。
数据对象
数据对象包含定义为内表的数据类型,是实际使用的内表。
数据对象占用内存,可以对其行进行填充或读取。
可以使用带OCCURS参数的DATA语句,或使用TYPE或LIKE参数引用另一个内表将数据对象创建为内表(参见创建内表数据对象(页8–4))。
8–2标识表格行
为了访问表格的某一行,必须指定可用于标识该行的字段或组合字段。
在关系数据模型(用于在R/3系统中存储长期使用的数据)中,用于该目的的最小组合称为关键字。
定义关键字的字段称为关键字段。
在关系数据模型中,每个表格至少有一个关键字(参见文档ABAP/4词典(页Error!
Notavalidlink.))。
特殊唯一关键字段的该概念不用于内表。
但是ABAP/4提供了下列特征项以便用户访问内表行:
8–2内表索引
索引是表格行的序列号,不是表格字段,但由系统自动创建和管理。
可以用DELETE、INSERT、MODIFY、LOOP和READ语句来使用索引。
在这些语句中,可以将索引指定为文字或变量。
处理完内表的特定行后,系统字段SY-TABIX一般包含该行的索引。
8–2内表关键字
有两种类型的内表关键字。
自定义关键字
使用READ语句从内表中读取行时,可以指定自定义关键字(参见用自定义关键字读取单行(页8–16))。
缺省关键字
根据定义,内表的关键字段是非数字(类型F、I和P)和非内表的字段。
这些关键字段形成内表的标准关键字。
要获得带嵌套结构(包含字段串作为组件的表格行)的内表标准关键字,系统将子结构分为基本字段层次。
根据填充内表的方式不同,内表可以包含带相同标准关键字的多行。
用COLLECT、READ、SORT和SUM语句使用内表的关键字段。
如果标准关键字段是内表行的第一个组件,这有助于提高这些语句的效率。
创建内表时请记住这一点。
8–2访问内表
内表是按行进行访问的。
必须使用某个工作区域作为与表格互相传输数据的接口。
工作区域对内表的行必须是可转换的(关于可转换性的详细信息,参见类型转换(页6–36))。
从内表中读取数据时,已定址的表格行内容覆盖工作区域的内容。
然后可以在程序中引用工作区域的内容。
将数据写入内表时,必须首先在工作区域(从中系统可以将数据传输给内表)中输入数据。
为了避免不一致,最好是工作区域与内表行有相同的数据类型。
创建与内表兼容的工作区域的一种安全步骤是在说明内表和工作区域时使用相同的数据类型。
在该环境中,可以区分ABAP/4中两种类型的内表的差别:
_带表头行的内表
_不带表头行的内表
如果创建带表头行的内表(参见创建内表(页8–3)),系统自动创建与内表行数据类型相同的工作区域。
该工作区域称为表头行或表格工作区域,对内表的作用与由TABLES语句创建的数据库表格工作区域相同(参见TABLES语句(页3–20))。
表格工作区域和内表本身同名。
在所有用于访问内表的ABAP/4语句中,可以指定要使用的工作区域(参见使用内表(页8–6))。
对于带表头行的内表,可以忽略这一指定。
这样,系统隐式使用表格工作区域:
不带表头行的内表没有可以隐式使用的表格工作区域。
要访问没有表头行的内表,必须在相应的ABAP/4语句中显式指定工作区域。
决定创建的内表是否带表头行时,必须考虑是喜欢隐式还是显式用于内表访问的工作区域。
请记住,对于带表头行的内表,内表本身和表格工作区域同名。
如果在语句中使用该名称,系统将其解释为表格工作区域的名称,而不是表格本身(对于将数据读入内存或从内存中读取数据的语句,这一点例外,参见ABAP/4内存中的数据簇)。
但在某些语句中,可以在名称之后输入方括号,定址内表而不是表格工作区域,如下所示
:
[]。
8–3创建内表
创建内表时,可以决定是想先用TYPES语句创建内表数据类型,然后再创建具有该类型的数据对象,还是想直接使用DATA语句创建内表数据对象。
既可以创建带表头行的内表数据对象,又可创建不带表头行的内表数据对象。
下列主题描述
8–3创建内表数据类型
要创建内表数据类型,请使用TYPES语句,用法如下(参见TYPES语句(页3–22)):
语法
TYPESOCCURS.
该语句通过使用TYPES语句的OCCURS选项创建一个内表数据类型。
内表中行的数据类型在中指定。
要指定行的数据类型,可以使用TYPE或LIKE参数(参见DATA语句的基本格式(页3–14))。
通过使用LIKE参数引用ABAP/4词典中定义的对象,可以创建内表,其行结构与存储在词典中的对象相同且反映数据库表格的结构。
这在读取和处理数据库表格时非常重要(参见读取并处理数据库表)。
指定行的初始号。
将第一行写入用类型创建的内表数据对象之后,就为指定行保留了内存。
如果添加到内表中的行比指定的要多,则自动扩展保留的内存。
如果内存中没有足够空间可用于内表,则将其写入缓冲区或磁盘(分页区域)。
TYPESVECTORTYPEIOCCURS10.
本示例创建内表数据类型VECTOR,其行包含基本类型I字段。
TYPES:
BEGINOFLINE,
COLUMN1TYPEI,
COLUMN2TYPEI,
COLUMN3TYPEI,
ENDOFLINE.
TYPESITABTYPELINEOCCURS10.
本示例创建内表数据类型ITAB,其行与字段串LINE结构相同。
TYPESVECTORTYPEIOCCURS10.
TYPES:
BEGINOFLINE,
COLUMN1TYPEI,
COLUMN2TYPEI,
COLUMN3TYPEI,
ENDOFLINE.
TYPESITABTYPELINEOCCURS10.
TYPES:
BEGINOFDEEPLINE,
TABLE1TYPEVECTOR,
TABLE2TYPEITAB,
ENDOFDEEPLINE.
TYPESDEEPTABLETYPEDEEPLINEOCCURS10.
本示例创建与上例相同的内表数据类型(VECTOR和ITAB)。
然后创建数据类型DEEPLINE作为字段串,包含这些内表作为组件。
通过该字段串,数据类型DEEPTABLE被创建为内表。
因此该内表的元素本身就是内表。
8–4创建内表数据对象
要创建内表数据对象,可以有几种方式使用DATA语句(参见DATA语句(页3–14))。
可将DATA语句用于
对于前两种情况,创建表头行可选,但对于用新的行结构创建的表格,则必须要有表头行。
8–4通过引用另一个表格来创建内表
要通过引用现有内表数据类型或数据对象来创建内表数据对象,可使用DATA语句,用法如下:
语法
DATA[WITHHEADERLINE].
通过使用TYPE或LIKE,可以使用选项来引用表格数据类型或表格数据对象(关键这些选项的详细信息,参见DATA语句的基本格式(页3–14))。
将数据对象说明为结构相同的内表。
如果使用WITHHEADERLINE选项,则创建的内表带工作区域(参见访问内表(页8–2))。
如果想创建带表头行的内表,行类型不能直接是内表。
但可以是用内表作为组件的结构。
TYPES:
BEGINOFLINE,
COLUMN1TYPEI,
COLUMN2TYPEI,
COLUMN3TYPEI,
ENDOFLINE.
TYPESITABTYPELINEOCCURS10.
DATATAB1TYPEITAB.
DATATAB2LIKETAB1WITHHEADERLINE.
同创建内表数据类型(页8–3)中所示,该示例创建数据类型ITAB作为内表。
通过使用DATA语句的TYPE参数引用ITAB,使数据对象TAB1与ITAB结构相同。
通过使用DATA语句的LIKE参数引用TAB1,使数据对象TAB2结构相同。
创建的TAB2带表头行。
因此,可以在程序中使用TAB2-COLUMN1、TAB2-COLUMN2和TAB2-COLUMN3等定位表格工作区域TAB2。
8–5通过引用结构来创建内表
要通过引用现有行结构创建内表数据对象,请使用DATA语句,用法如下:
语法
DATAOCCURS[WITHHEADERLINE].
该语句通过使用DATA语句的OCCURS选项创建内表。
内表中行的数据类型在中指定。
要指定数据类型,可以使用TYPE或LIKE参数(关于这些参数的详细信息,参见DATA语句的基本格式(页3–14))。
通过使用LIKE参数引用ABAP/4词典中定义的对象,可以创建内表,其行结构与存储在词典中的对象相同,并反映数据库表格的结构。
这在读取和处理数据库表格时非常重要(参见读取并处理数据库表)。
指定行的初始号。
将第一行写入用类型创建的内表数据对象之后,就为指定行保留内存。
如果添加到内表中的行比指定的要多,则自动扩展保留的内存。
如果内存中没有足够空间可用于内表,则将其写入缓冲区或磁盘(分页区域)。
上述特征项与用TYPES语句创建内表数据类型的特征项相同(参见创建内表数据类型(页8–3))。
作为附加特征项,可以在DATA语句中使用WITHHEADERLINE选项。
这样创建的表格工作区域与内表的行结构相同(关于表头行的详细信息,参见访问内表(页8–2))。
DATAFLIGHT_TABLIKESFLIGHTOCCURS10.
本示例创建数据对象FLIGHT_TAB,其结构与数据库表格SFLIGHT相同。
本示例介绍如何采用两种不同的步骤创建同一内表。
TYPESVECTOR_TYPETYPEIOCCURS10.
DATAVECTORTYPEVECTOR_TYPEWITHHEADERLINE.
在此创建一个内表数据类型VECTOR_TYPE,其行包含首先创建的基本类型I字段。
然后,通过引用VECTOR_TYPE创建数据对象VECTOR。
通过使用WITHHEADERLINE选项还创建表格工作区域VECTOR。
在这种情况下,表格工作区域包含一种类型I字段,可以通过名称VECTOR定位。
DATAVECTORTYPEIOCCURS10WITHHEADERLINE.
在这种情况下,通过直接在DATA语句中使用OCCURS选项创建完全一样的数据类型VECTOR。
8–5创建带新结构的内表
要创建既不引用现有对象,也不引用现有行结构的内表数据对象,使用DATA语句,用法如下:
语法
DATA:
BEGINOFOCCURS,
,
..............
ENDOF.
这定义内表并在中说明其行组件。
除CCURS参数外,语法与定义字段串相同(参见字段串的DATA语句(页3–18))。
该语句通常表格工作区域(参见访问内表(页8–2))。
因此,其作用与先创建字段串,然后再创建与该字段串行结构相同的内表相同。
指定行的初始号。
将第一行写入用类型创建的内表数据对象之后,就为指定行保留内存。
如果添加到内表中的行比指定的要多,则自动扩展保留的内存。
如果内存中没有足够空间可用于内表,则将其写入缓冲区或磁盘(分页区域)。
DATA:
BEGINOFITABOCCURS10,
COLUMN1TYPEI,
COLUMN2TYPEI,
COLUMN3TYPEI,
ENDOFITAB.
本示例创建内表及其相应的表格工作区域ITAB。
8–6使用内表
下列主题描述如何使用内表。
本节解释:
8–6填充内表
要填充内表,既可逐行添加数据,也可复制另一个表格的内容。
要逐行填充内表,可以使用APPEND、COLLECT或INSERT语句。
_要将内表仅用于存储数据,出于性能方面的考虑,建议使用APPEND。
用APPEND也可以创建序列清单。
_要计算数字字段之和或要确保内表中没有出现重复条目,请使用COLLECT语句,它根据标准关键字处理行。
_要在内表现有行之前插入新行,请使用INSERT语句。
要将内表内容复制到另一个内表中,请使用APPEND、INSERT或MOVE语句的变式。
_要将内表行附加到另一个内表中,请使用APPEND语句的变式。
_要将内表行插入另一个内表中,请使用INSERT语句的变式。
_要将内表条目内容复制到另一个内表中,并且覆盖该目标表格,请使用MOVE语句。
关于如何使用SELECT语句用数据库表格中的数据填充内表的详细信息,参见将数据读入内表。
8–6附加行
要将行附加到内表中,请使用APPEND语句,用法如下:
语法
APPEND[TO|INITIALLINETO].
该语句将新行附加到内表中。
通过使用TO选项,指定要附加的源区域。
对于带表头行的表格,可以忽略TO选项。
这样,表格工作区域就成了源区域。
可以使用INITIALLINETO选项替代TO,将用其类型的正确值初始化的行添加到表格中。
APPEND不考虑是否存在标准关键字相同的行(参见标识表格行(页8–2))。
这样,可能会出现相同条目。
系统字段SY-TABIX在每个APPEND语句之后包含附加行的索引。
DATA:
BEGINOFITABOCCURS10,
COL1TYPEC,
COL2TYPEI,
ENDOFITAB.
DO3TIMES.
APPENDINITIALLINETOITAB.
ITAB-COL1=SY-INDEX.ITAB-COL2=SY-INDEX**2.
APPENDITAB.
ENDDO.
LOOPATITAB.
WRITE:
/ITAB-COL1,ITAB-COL2.
ENDLOOP.
本示例创建带表头行和两列的内表ITAB。
表格用DO循环填充。
每次通过循环时附加初始化行,然后用循环索引填充表格工作区域并且附加循环索引的平方根。
其输出为:
0
11
0
24
0
39
DATA:
BEGINOFLINE1,
COL1(3)TYPEC,
COL2
(2)TYPEN,
COL3TYPEI,
ENDOFLINE1.
DATATAB1LIKELINE1OCCURS10.
DATA:
BEGINOFLINE2,
FIELD1
(1)TYPEC,
FIELD2LIKETAB1,
ENDOFLINE2.
DATATAB2LIKELINE2OCCURS1.
LINE1-COL1='abc'.LINE1-COL2='12'.LINE1-COL3=3.
APPENDLINE1TOTAB1.
LINE1-COL1='def'.LINE1-COL2='34'.LINE1-COL3=5.
APPENDLINE1TOTAB1.
LINE2-FIELD1='A'.LINE2-FIELD2=TAB1.
APPENDLINE2TOTAB2.
REFRESHTAB1.
LINE1-COL1='ghi'.LINE1-COL2='56'.LINE1-COL3=7.
APPENDLINE1TOTAB1.
LINE1-COL1='jkl'.LINE1-COL2='78'.LINE1-COL3=9.
APPENDLINE1TOTAB1.
LINE2-FIELD1='B'.LINE2-FIELD2=TAB1.
APPENDLINE2TOTAB2.
LOOPATTAB2INTOLINE2.
WRITE:
/LINE2-FIELD1.
LOOPATLINE2-FIELD2INTOLINE1.
WRITE:
/LINE1-COL1,LINE1-COL2,LINE1-COL3.
ENDLOOP.
ENDLOOP.
其输出为:
A
abc123
def345
B
ghi567
jkl789
本示例创建两个不带表格工作区域的内表(TAB1和TAB2)。
TAB2有深层结构,因为LINE2的第二个组件包含内表TAB1的结构。
LINE1被填充并附加到TAB1。
然后,将LINE2填充并附加到TAB2。
用REFRESH语句清除TAB1之后(参见初始化内表(页Error!
Referencesourcenotfound.)),再重复相同步骤。
请注意,TAB2中的行数仅在OCCURS参数中指定为1。
TAB2的内容输出。
8–8根据标准关键字附加行
要用有唯一标准关键字的行填充内表,请使用COLLECT语句,用法如下:
语法
COLLECT[INTO].
该语句通过使用INTO选项指定想附加的源区域。
如果表格有表头行,则可以忽略INTO选项。
这样,表格工作区域就成了源区域。
系统检查表格条目的标准关键字是否相同(所有非数字字段,参见内表关键字(页8–2))。
如果没有,COLLECT语句的作用与APPEND语句相似,并将新行添至表格中。
如果存在关键字相同的条目,COLLECT语句不附加新行