第八章 创建和处理内表
更新时间:2024-04-21 03:09:01 阅读量: 综合文库 文档下载
- 第八章光结局和夜结局推荐度:
- 相关推荐
SAP AG
第八章:错误!使用“开始”选项卡将8–1 Heading 1 应用于要在此处显示的文字。
?? 8:
创建和处理 内表 概览
内容
什么是内表 ................................................................................................................................. 8–1
内表的目的 ............................................................................................................................ 8–1 内表的结构 ............................................................................................................................ 8–1 标识表格行 ............................................................................................................................ 8–2 访问内表 ............................................................................................................................... 8–2 创建内表 ..................................................................................................................................... 8–3
创建内表数 据类型 ............................................................................................................... 8–3 创建内表数 据对象 ............................................................................................................... 8–4 使 用内表 ................................................................................................................................... 8–6
填充内表 ............................................................................................................................... 8–6 读取内表 ............................................................................................................................8–14 更改和删除 内表行 ............................................................................................................8–20 内表排序 ............................................................................................................................8–26 创建次序表 .........................................................................................................................8–28 循环处理 ............................................................................................................................8–29 比较内表 ............................................................................................................................8–31 初始化内表 .........................................................................................................................8–33
本节讨论内 表。除字段 串外,内表 还构成 ABAP/4 提供的另一 种结构化数 据类型。 本节主题描 述 在处理内表 中大量的数 据时,花费 的计算机时 间对性能来 说非常关键 。例如,要 获得最佳性 能,在“ABAP/4 开发工作台 ”初始屏幕 (或事务 SE30) 上选择“测 试 -> 运行时间分 析 ”,在“内 表”下选定 “提示 & 技巧.”, 就会出现有 关如何改进 性能的不同 任务示例。 什么是内表
下列主题提 供内表简介 :
内表的目的
在 ABAP/4 中,主要使 用表格。表 格是 R/3 系统中的关 键数据结构 。长期使用 的数据存储 在关系数据 库表格中。 关于如何读 取和处理数 据库表格的 详细信息, 参见 读取并处理数据库表。 除了数据库 表格,还可 以创建仅在 程序运行时 间内存在的 内表。ABAP/4 提供了针对 内表的不同 操作。例如 ,可以搜索 、附加、插 入或删除行 。
内表中的行 数并不固定 。根据需求 ,系统可实 时增加内表 的大小。例 如,如果想 将某个数据 库表格读入 内表,不必 事先知道数 据库表格的 大小。该特 征项使得内 表使用起来 十分方便, 同时还支持 动态编程。
可以使用内 表在数据库 表格的子集 上执行表格 计算。例如 ,可以将数 据库表格的 某个部分读 入内表(参 见 将数据读入内表)。然后可 以从内表中 计算总和或 生成次序表 。
内表的另一 种用处是根 据程序需要 重新组织数 据库表格的 内容。例如 ,可以从一 个或多个大 客户表格特 定的数据中 将与创建电 话清单有关 的数据读入 内表中。然 后可在程序 运行期间直 接访问该清 单,而不用 每次调用时 都执行耗时 的数据库查 询。
除了在使用 来自数据库 表格的数据 时使用内表 外,内表还 是 ABAP/4 中用于在程 序中实现许 多复杂数据 结构的重要 特征项(参 见 结构化数据类型 (页 3–6) )。
内表的结构
8–1
SAP AG
第八章:错误!使用“开始”选项卡将8–2 Heading 1 应用于要在此处显示的文字。
在 ABAP/4 中,可以区 别内表数据 类型(定义 内表的结构 )和内表数 据对象(实 际的内表而 且可以用数 据
进行填充 )。内表数 据类型是数 据结构(可 用于将数据 对象说明为 内表)的抽 象定义。关 于数据类型 和数据对象 之间区别的 详细信息, 参见 声明数据 (页 3–1) 。
数据类型
内表是 ABAP/4 中两种结构 化数据类型 中的一种。 其它结构化 数据类型是 字段串(参 见 结构化数据类型 (页 3–6) )。内表包 括任意数据 类型相同的 行。行的数 据类型可以 是基本的或 结构化的。 该定义打开 了多种内表 结构,范围 从包含一个 字段的行到 包含字段串 将内表作为 组件的行。
可以用带 OCCURS 参数的 TYPES 语句将数据 类型定义为 内表(参见 创建内表数 据类型 (页 8–3) )。定义数 据类型时不 占用内存。
数据对象
数据对象包 含定义为内 表的数据类 型,是实际 使用的内表 。数据对象 占用内存, 可以对其行 进行填充或 读取。
可以使用带 OCCURS 参数的 DATA 语句,或使 用 TYPE 或 LIKE 参数引用另 一个内表将 数据对象创 建为内表( 参见 创建内表数 据对象 (页 8–4) )。
标识表格行
为了访问表 格的某一行 ,必须指定 可用于标识 该行的字段 或组合字段 。在关系数 据模型(用 于在 R/3 系统中存储 长期使用的 数据)中, 用于该目的 的最小组合 称为关键字 。定义关键 字的字段称 为关键字段 。 在关系数据 模型中,每 个表格至少 有一个关键 字(参见文 档 ABAP/4 词典 (页 Error! Not a valid link.) )。特殊唯 一关键字段 的该概念不 用于内表。
但是 ABAP/4 提供了下列 特征项以便 用户访问内 表行:
内表索引
索引是表格 行的序列号 ,不是表格 字段,但由 系统自动创 建和管理。
可以用 DELETE、 INSERT、 MODIFY、 LOOP 和 READ 语句来使用 索引。在这 些语句中, 可以将索引 指定为文字 或变量。
处理完内表 的特定行后 ,系统字段 SY-TABIX 一般包含该 行的索引。
内表关键字
有两种类型 的内表关键 字。
自定义关键 字
使用 READ 语句从内表 中读取行时 ,可以指定 自定义关键 字(参见 用自定义关 键字读取单 行 (页 8–16) )。 缺省关键字
根据定义, 内表的关键 字段是非数 字(类型 F、I 和 P)和非内 表的字段。 这些关键字 段形成内表 的标准关键 字。
要获得带嵌 套结构(包 含字段串作 为组件的表 格行)的内 表标准关键 字,系统将 子结构分为 基本字段层 次。 根据填充内 表的方式不 同,内表可 以包含带相 同标准关键 字的多行。 用 COLLECT、 READ、 SORT 和 SUM 语句使用内 表的关键字 段。如果标 准关键字段 是内表行的 第一个组件 ,这有助于 提高这些语 句的效率。 创建内表时 请记住这一 点。
访问内表
内表是按行 进行访问的 。必须使用 某个工作区 域作为与表 格互相传输 数据的接口 。 工作区域对 内表的行必 须是可转换 的(关于可 转换性的详 细信息,参 见 类型转换 (页 6–36) )。 8–2
SAP AG 第八章:错误!使用“开始”选项卡将8–3 Heading 1 应用于要在此处显示的文字。 从内表中读 取数据时, 已定址的表 格行内容覆 盖工作区域 的内容。然 后可以在程 序中引用工 作区域的内 容。将数据 写入内表时 ,必须首先 在工作区域 (从中系统 可以将数据 传输给内表 )中输入数 据。 为了避免不 一致,最好 是工作区域 与内表行有 相同的数据 类型。创建 与内表兼容 的工作区域 的一种安全 步骤是在说 明内表和工 作区域时使 用相同的数 据类型。 在该环境中 ,可以区分 ABAP/4 中两种类型 的内表的差 别: _ 带表头行 的内表 _ 不带表头 行的内表 如果创建带 表头行的内 表(参见 创建内表 (页 8–3) ),系统自 动创建与内 表行数据类 型相同的工 作区域。该 工作区域称 为表头行或 表格工作区 域,对内表 的作用与由 TABLES 语句创建的 数据库表格 工作区域相 同(参见 TABLES 语句 (页 3–20) )。表格工 作区域和内 表本身同名 。 在所有用于 访问内表的 ABAP/4 语句中,可 以指定要使 用的工作区 域(参见 使 用内表 (页 8–6) )。对于带 表头行的内 表,可以忽 略这一指定 。这样,系 统隐式使用 表格工作区 域: 不带表头行 的内表没有 可以隐式使 用的表格工 作区域。要 访问没有表 头行的内表 ,必须在相 应的 ABAP/4 语句中显式 指定工作区 域。
决定创建的 内表是否带 表头行时, 必须考虑是 喜欢隐式还 是显式用于 内表访问的 工作区域。 请记住,对 于带表头行 的内表,内 表本身和表 格工作区域 同名。如果 在语句中使 用该名称, 系统将其解 释为表格工 作区域的名 称,而不是 表格本身( 对于将数据 读入内存或 从内存中读 取数据的语 句,这一点 例外,参见 ABAP/4 内存中的数据簇 )。但在某 些语句中, 可以在名称 之后输入方 括号,定址 内表而不是 表格工作区 域,如下所 示 :
创建内表时 ,可以决定 是想先用TYPES 语句创建内 表数据类型 ,然后再创 建具有该类 型的数据对 象,还是想 直接使用 DATA 语句创建内 表数据对象 。既可以创 建带表头行 的内表数据 对象,又可 创建不带表 头行的内表 数据对象。 下列主题描 述
创建内表数 据类型
要创建内表 数据类型, 请使用 TYPES 语句,用法 如下(参见 TYPES 语句 (页 3–22) ):
语法
TYPES
该语句通过 使用 TYPES 语句的 OCCURS 选项创建一 个内表数据 类型
SAP AG
第八章:错误!使用“开始”选项卡将8–4 Heading 1 应用于要在此处显示的文字。
COLUMN3 TYPE I, END OF LINE. TYPES ITAB TYPE LINE OCCURS 10. 本示例创建 内表数据类 型 ITAB, 其行与字段 串 LINE 结构相同。 TYPES VECTOR TYPE I OCCURS 10. TYPES: BEGIN OF LINE, COLUMN1 TYPE I, COLUMN2 TYPE I, COLUMN3 TYPE I, END OF LINE. TYPES ITAB TYPE LINE OCCURS 10. TYPES: BEGIN OF DEEPLINE, TABLE1 TYPE VECTOR, TABLE2 TYPE ITAB, END OF DEEPLINE. TYPES DEEPTABLE TYPE DEEPLINE OCCURS 10. 本示例创建 与上例相同 的内表数据 类型(VECTOR 和 ITAB) 。然后创建 数据类型 DEEPLINE 作为字段串 ,包含这些 内表作为组 件。通过该 字段串,数 据类型 DEEPTABLE 被创建为内 表。因此该 内表的元素 本身就是内 表。
创建内表数 据对象
要创建内表 数据对象, 可以有几种 方式使用 DATA 语句(参见 DATA 语句 (页 3–14) )。可将 DATA 语句用于
对于前两种 情况,创建 表头行可选 ,但对于用 新的行结构 创建的表格 ,则必须要 有表头行。
通过引用另 一个表格来 创建内表
要通过引用 现有内表数 据类型或数 据对象来创 建内表数据 对象,可使 用 DATA 语句,用法 如下:
语法
DATA
通过使用 TYPE 或 LIKE, 可以使用
如果使用 WITH HEADER LINE 选项,则创 建的内表带 工作区域
SAP AG
第八章:错误!使用“开始”选项卡将8–5 Heading 1 应用于要在此处显示的文字。
DATA TAB2 LIKE TAB1 WITH HEADER LINE. 同 创建内表数 据类型 (页 8–3) 中所示,该 示例创建数 据类型 ITAB 作为内表。 通过使用 DATA 语句的 TYPE 参数引用 ITAB, 使数据对象 TAB1 与 ITAB 结构相同。 通过使用 DATA 语句的 LIKE 参数引用 TAB1, 使数据对象 TAB2 结构相同。 创建的 TAB2 带表头行。 因此,可以 在程序中使 用 TAB2-COLUMN1、 TAB2-COLUMN2 和 TAB2-COLUMN3 等定位表格 工作区域 TAB2。
通过引用结 构来创建内 表
要通过引用 现有行结构 创建内表数 据对象,请 使用 DATA 语句,用法 如下:
语法
DATA
通过使用 LIKE 参数引用 ABAP/4 词典中定义 的对象,可 以创建内表 ,其行结构 与存储在词 典中的对象 相同,并反 映数据库表 格的结构。 这在读取和 处理数据库 表格时非常 重要(参见 读取并处理数据库表)。
上述特征项 与用 TYPES 语句创建内 表数据类型 的特征项相 同(参见 创建内表数 据类型 (页 8–3) )。 作为附加特 征项,可以 在 DATA 语句中使用 WITH HEADER LINE 选项。这样 创建的表格 工作区域
创建带新结 构的内表
要创建既不 引用现有对 象,也不引 用现有行结 构的内表数 据对象,使 用 DATA 语句,用法 如下:
语法
DATA: BEGIN OF
这定义内表
8–5
SAP AG
第八章:错误!使用“开始”选项卡将8–6 Heading 1 应用于要在此处显示的文字。
该语句通常 表格工作区 域
建与 该字段串行 结构相同的 内表
使 用内表
下列主题描 述如何使用 内表。本节 解释:
填充内表
要填充内表 ,既可逐行 添加数据, 也可复制另 一个表格的 内容。 要逐行填充 内表,可以 使用 APPEND、 COLLECT 或 INSERT 语句。
_ 要将内表 仅用于存储 数据,出于 性能方面的 考虑,建议 使用 APPEND。 用 APPEND 也可
以创建 序列清单。
_ 要计算数 字字段之和 或要确保内 表中没有出 现重复条目 ,请使用 COLLECT 语句,它根 据
标准关键 字处理行。
_ 要在内表 现有行之前 插入新行, 请使用 INSERT 语句。
要将内表内 容复制到另 一个内表中 ,请使用 APPEND、 INSERT 或 MOVE 语句的变式 。
_ 要将内表 行附加到另 一个内表中 ,请使用 APPEND 语句的变式 。 _ 要将内表 行插入另一 个内表中, 请使用 INSERT 语句的变式 。
_ 要将内表 条目内容复 制到另一个 内表中,并 且覆盖该目 标表格,请 使用 MOVE 语句。
关于如何使 用 SELECT 语句用数据 库表格中的 数据填充内 表的详细信 息,参见 将数据读入内表。
附加行
要将行附加 到内表中, 请使用 APPEND 语句,用法 如下:
语法
APPEND [
通过使用
可以使用 INITIAL LINE TO 选项替代
APPEND 不考虑是否 存在标准关 键字相同的 行(参见标识表格行 (页 8–2) ) 。这样,可 能会出现相 同条目。
系统字段 SY-TABIX 在每个 APPEND 语句之后包 含附加行的 索引。 DATA: BEGIN OF ITAB OCCURS 10, COL1 TYPE C, COL2 TYPE I, END OF ITAB. DO 3 TIMES. APPEND INITIAL LINE TO ITAB. 8–6
SAP AG
第八章:错误!使用“开始”选项卡将8–7 Heading 1 应用于要在此处显示的文字。
ITAB-COL1 = SY-INDEX. ITAB-COL2 = SY-INDEX ** 2. APPEND ITAB. ENDDO. LOOP AT ITAB. WRITE: / ITAB-COL1, ITAB-COL2. ENDLOOP. 本示例创建 带表头行和 两列的内表 ITAB。 表格用 DO 循环填充。 每次通过循 环时附加初 始化行,然 后用循环索 引填充表格 工作区域并 且附加循环 索引的平方 根。其输出 为: 0 1 1 0 2 4 0 3 9
DATA: BEGIN OF LINE1, COL1(3) TYPE C, COL2(2) TYPE N, COL3 TYPE I, END OF LINE1. DATA TAB1 LIKE LINE1 OCCURS 10. DATA: BEGIN OF LINE2, FIELD1(1) TYPE C, FIELD2 LIKE TAB1, END OF LINE2. DATA TAB2 LIKE LINE2 OCCURS 1. LINE1-COL1 = 'abc'. LINE1-COL2 = '12'. LINE1-COL3 = 3. APPEND LINE1 TO TAB1. LINE1-COL1 = 'def'. LINE1-COL2 = '34'. LINE1-COL3 = 5. APPEND LINE1 TO TAB1. LINE2-FIELD1 = 'A'. LINE2-FIELD2 = TAB1. APPEND LINE2 TO TAB2. REFRESH TAB1. LINE1-COL1 = 'ghi'. LINE1-COL2 = '56'. LINE1-COL3 = 7. APPEND LINE1 TO TAB1. LINE1-COL1 = 'jkl'. LINE1-COL2 = '78'. LINE1-COL3 = 9. APPEND LINE1 TO TAB1. LINE2-FIELD1 = 'B'. LINE2-FIELD2 = TAB1. APPEND LINE2 TO TAB2. LOOP AT TAB2 INTO LINE2. WRITE: / LINE2-FIELD1. LOOP AT LINE2-FIELD2 INTO LINE1. WRITE: / LINE1-COL1, LINE1-COL2, LINE1-COL3. ENDLOOP. ENDLOOP. 其输出为: A abc 12 3 8–7
SAP AG
第八章:错误!使用“开始”选项卡将8–8 Heading 1 应用于要在此处显示的文字。
def 34 5 B ghi 56 7 jkl 78 9 本示例创建 两个不带表 格工作区域 的内表(TAB1 和 TAB2) 。TAB2 有深层结构 ,因为 LINE2 的第二个组 件包含内表 TAB1 的结构。LINE1 被填充并附 加到 TAB1。 然后,将 LINE2 填充并附加 到 TAB2。 用 REFRESH 语句清除 TAB1 之后(参见 初始化内表 (页 错误!未找到引用源。) ),再重复 相同步骤。 请注意, TAB2 中的行数仅 在 OCCURS 参数中指定 为1。TAB2 的内容输出 。 根据标准关 键字附加行
要用有唯一 标准关键字 的行填充内 表,请使用 COLLECT 语句,用法 如下:
语法
COLLECT [
该语句通过 使用 INTO 选项指定想 附加的源区 域
系统检查表 格条目的标 准关键字是 否相同(所 有非数字字 段,参见 内表关键字 (页 8–2) )。如果没 有,COLLECT 语句的作用 与 APPEND 语句相似, 并将新行添 至表格中。
如果存在关 键字相同的 条目,COLLECT 语句不附加 新行,但将 工作区域中 数字字段的 内容添加到 现有条目中 数字字段的 内容中。系 统字段 SY-TABIX 包含处理过 的行的索引 。 为 COLLECT 指定的工作 区域必须与 内表的行类 型兼容,不 仅仅是可转 换为内表的 行类型。COLLECT 语句无法用 于带深层结 构的内表, 例如,将内 表作为组件 的行。 如果仅使用 COLLECT 语句填充内 表,则不会 出现重复条 目。因此要 填充没有重 复条目的内 表,应该使 用 COLLECT 而不是 APPEND 或 INSERT。 DATA: BEGIN OF ITAB OCCURS 3, COLUMN1(3) TYPE C, COLUMN2(2) TYPE N, COLUMN3 TYPE I, END OF ITAB. ITAB-COLUMN1 = 'abc'. ITAB-COLUMN2 = '12'. ITAB-COLUMN3 = 3. COLLECT ITAB. WRITE / SY-TABIX. ITAB-COLUMN1 = 'def'. ITAB-COLUMN2 = '34'. ITAB-COLUMN3 = 5. COLLECT ITAB. WRITE / SY-TABIX. ITAB-COLUMN1 = 'abc'. ITAB-COLUMN2 = '12'. ITAB-COLUMN3 = 7. COLLECT ITAB. WRITE / SY-TABIX. LOOP AT ITAB. WRITE: / ITAB-COLUMN1, ITAB-COLUMN2, ITAB-COLUMN3. ENDLOOP. 其输出为: 1 2 1 8–8
SAP AG 第八章:错误!使用“开始”选项卡将8–9 Heading 1 应用于要在此处显示的文字。 abc 12 10 def 34 5 本示例创建 带表格工作 区域的内表 ITAB。 前两个 COLLECT 语句和 APPEND 语句一样。 在第三个 COLLECT 语句中,修 改了 ITAB 的第一行。 下面的数字 图表显示三 个步骤:
插入行
要在内表行 之前插入新 行,请使用 INSERT 语句,用法 如下:
语法
INSERT [
可以使用 INITIAL LINE TO 选项替代
如果使用 INDEX 选项,则将 新行插入到 有索引
如果表格包 含
如果使用不 带 INDEX 选项的 INSERT 语句,系统 只能在 LOOP - ENDLOOP 循环内通过 在当前行( 例如带 SY-TABIX 返回索引的 行)前插入 新条目来处 理它。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 2 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. LINE-COL1 = 11. LINE-COL2 = 22. INSERT LINE INTO ITAB INDEX 2. INSERT INITIAL LINE INTO ITAB INDEX 1. LOOP AT ITAB INTO LINE. WRITE: / SY-TABIX, LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: 1 0 0 2 1 1 3 11 22 4 2 4 本示例创建 内表 ITAB, 并用两行对 其进行填充 。在第二行 之前插入包 含值的新行 。然后,在 第一行之前 插入一个初 始化行。 8–9
SAP AG
第八章:错误!使用“开始”选项卡将8–10 Heading 1 应用于要在此处显示的文字。
DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 2 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. LOOP AT ITAB INTO LINE. LINE-COL1 = 3 * SY-TABIX. LINE-COL2 = 5 * SY-TABIX. INSERT LINE INTO ITAB. ENDLOOP. LOOP AT ITAB INTO LINE. WRITE: / SY-TABIX, LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: 1 3 5 2 1 1 3 6 10 4 2 4 本示例创建 内表 ITAB, 并且用两行 对其进行填 充。在第一 个 LOOP - ENDLOOP 循环的每个 现有行之前 插入一个新 行。下图显 示示例是如 何工作的:
附加内表行
要将部分或 全部内表附 加到另一个 内表中,请 使用 APPEND 语句,用法 如下:
语法
APPEND LINES OF
SAP AG
第八章:错误!使用“开始”选项卡将8–11 Heading 1 应用于要在此处显示的文字。
APPEND JTAB. ENDDO. APPEND LINES OF JTAB FROM 2 TO 3 TO ITAB. LOOP AT ITAB. WRITE: / ITAB-COL1, ITAB-COL2. ENDLOOP. 本示例创建 两个相同类 型的内表 ITAB 和 JTAB, 且都有表头 行。在 DO 循环中,用 一系列平方 数填充 ITAB, 用一系列立 方数填充 JTAB。 然后将 JTAB 的最后两行 附加到 ITAB 中。ITAB 的输出如下 所示: 1 1 2 4 3 9 2 8 3 27
插入内表
要将部分或 全部内表插 入到另一个 内表中,请 使用 INSERT 语句,用法 如下:
语法
INSERT LINES OF
如果使用 INDEX 选项,将
SAP AG
第八章:错误!使用“开始”选项卡将8–12 Heading 1 应用于要在此处显示的文字。
1 1 1 2 2 4 3 3 9 4 1 1 5 2 8 6 3 27
复制内表
如果想一次 将内表的全 部内容复制 到另一内表 中,请使用 MOVE 语句或赋值 操作符 (=),用 法如下: 语法
MOVE
这些语句执 行完整操作 。复制整个 表格内容, 包括作为表 格组件的任 何其它内表 的数据。覆 盖目标表格 原来的内容 。
语法与复制 基本字段相 同(详细信 息,参见 基本分配操作 (页 6–2) )。
对于有表头 行的表格, 表格工作区 域和表格本 身同名。要 在上述语句 中进行区分 ,必须在名 称之后输入 两个方括号 ([]) 来定位内表 而不是表格 工作区域。 可以仅将内 表复制到其 它内表中。 内表不能转 换为字段串 或基本字段 。要将内表 复制到其它 内表中,其 行类型必须 是可转换的 (关于转换 的详细信息 ,参见 内表的可转换性 (页 6–43) )。 DATA: BEGIN OF LINE, COL1, COL2, END OF LINE. DATA ETAB LIKE LINE OCCURS 10 WITH HEADER LINE. DATA FTAB LIKE LINE OCCURS 10. LINE-COL1 = 'A'. LINE-COL2 = 'B'. APPEND LINE TO ETAB. MOVE ETAB[] TO FTAB. LOOP AT FTAB INTO LINE. WRITE: / LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: A B 8–12
SAP AG
第八章:错误!使用“开始”选项卡将8–13 Heading 1 应用于要在此处显示的文字。
本示例创建 两个行结构 LINE 相同的内表 :ETAB 和 FTAB。 创建的ETAB 包含表格工 作区域。在 用 APPEND 语句填充 ETAB 之后,将其 内容复制到 FTAB。 请注意方括 号([])的 用法。 DATA: ITAB TYPE I OCCURS 10, FTAB TYPE F OCCURS 10, FL TYPE F. DO 3 TIMES. APPEND SY-INDEX TO ITAB. ENDDO. FTAB = ITAB. LOOP AT FTAB INTO FL. WRITE: / FL. ENDLOOP. 其输出为: 1.000000000000000E+00 2.000000000000000E+00 3.000000000000000E+00 其中,内表 ITAB 具有基本行 类型 I,FTAB 具有基本行 类型 F。这些行 类型都是可 转换的(关 于可转换性 的详细信息 ,参见 基本数据类型的可转换性 (页 6–37) )并且可将 ITAB 复制到 FTAB 中。 DATA: BEGIN OF ILINE, NUM TYPE I, END OF ILINE, BEGIN OF FLINE, NUM TYPE F, END OF FLINE, ITAB LIKE ILINE OCCURS 10, FTAB LIKE FLINE OCCURS 10. DO 3 TIMES. ILINE-NUM = SY-INDEX. APPEND ILINE-NUM TO ITAB. ENDDO. FTAB = ITAB. LOOP AT FTAB INTO FLINE. WRITE: / FLINE-NUM. ENDLOOP. 其输出为: 6.03823403895813E-154 6.03969074613219E-154 6.04114745330626E-154 其中,内表 ITAB 和 FTAB 的行类型都 是字段串, 每个都包含 类型 I 或 F 的组件。这 些字段串可 转换,但不 兼容。因此 ,将 ITAB 赋给 FTAB 之后,将表 格 ITAB 的内容转换 为类 8–13
SAP AG
第八章:错误!使用“开始”选项卡将8–14 Heading 1 应用于要在此处显示的文字。
型 C 字段,然后 写入 FTAB( 关于字段串 可转换性的 详细信息, 参见 字段串的可转换性 (页 6–41) )。系统将 传输的数据 解释为类型 F 字段,并获 得毫无意义 的结果。
读取内表
要读取内表 的内容以便 进一步处理 ,可以使用 LOOP 或 READ 语句。 使用 LOOP 语句逐行读 取内表。 可以用 READ 语句选定单 行: 读取单行后 ,可以作如 下工作
可以使用 DESCRIBE 语句确定内 表属性。
逐行读取内 表
要将内表逐 行读入工作 区域,可以 使用 LOOP 语句编一个 循环。语法 如下所示:
语法
LOOP AT
用 INTO 选项指定目 标区域
逐行将内表
_ 使用 FROM 选项,可以 用
_ 用 WHERE 选项,可以 指定
7–3) )。第一个 操作数必须 是内表行结 构的组件。 如果在循环 中使用控制 关键字 AT ,则不能使 用 WHERE 选项。 FROM 和 TO 选项限制系 统必须读取 的行数。WHERE 选项仅避免 对工作区域 进行不必要 的填充。用 WHERE 选项,系统 必须读取所 有行。为了 提高效率, 应该尽可能 使用 FROM 和 TO 选项。在某 些条件下用 EXIT 语句(参见 完全终止循环 (页 7–22) )而不是 WHERE 选项跳出循 环也十分有 效。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 30 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX * SY-INDEX. APPEND LINE TO ITAB. ENDDO. LOOP AT ITAB INTO LINE FROM 10 TO 25 WHERE COL2 > 400. WRITE: / SY-TABIX, LINE-COL2. ENDLOOP. 其输出为: 21 441 8–14
SAP AG
第八章:错误!使用“开始”选项卡将8–15 Heading 1 应用于要在此处显示的文字。
22 484 23 529 24 576 25 625 在此,根据 字段串 LINE 创建内表 ITAB。 在 DO 循环中用1和 30之间的 数字以及这 些数字的平 方对表格进 行填充。用 LOOP 语句逐行读 取表格。将 要读取的行 的索引限制 在10和25之 间,并将每 行第二个组 件的内容限 制为大于400的 数字。 用索引读取 单行
要用索引从 内表中读取 单行,请使 用 READ 语句,用法 如下:
语法
READ TABLE
用 INTO 选项指定目 标区域
系统用索引
如果找到有 指定索引的 条目,则将 系统字段 SY-SUBRC 设置为0, 而且 SY-TABIX 包含该行的 索引。否则 ,SY-SUBRC 包含非0值 。 如果
读取有关键 字的单行
按如下方式 从内表中读 取有关键字 的单行:用
读取有关键 字的单行时 ,可以用二 分法搜索代 替顺序搜索 。关于二分 法搜索的详 细信息,参 见
8–15
SAP AG
第八章:错误!使用“开始”选项卡将8–16 Heading 1 应用于要在此处显示的文字。
用自定义关 键字读取单 行
要从有自定 义关键字的 内表中读取 单行,请使 用 READ 语句的 WITH KEY 选项,用法 如下:
语法
READ TABLE
用 INTO 选项可以指 定目标区域 。如果表格 有表头行, 则可以忽略 INTO 选项。这样 ,表格工作 区域就成了 目标区域。
系统读取
如下所述, 可以定义多 个关键字
定义一系列 关键字段
要定义自己 的一系列关 键字段,请 使用 WITH KEY 选项,用法 如下:
语法
....WITH KEY
自定义关键 字包含表格 组件
可以用 (
用户可以为 任何在关键 字中使用的 组件指定偏 移量和长度 (参见 指定数据对象的偏移值 (页 6–35) )。 将整行定义 为关键字
通过使用 WITH KEY 选项可将内 表整行定义 为其关键字 ,如下所示 :
语法
....WITH KEY =
如果
对于此类关 键字,也可 以选择由某 个基本数据 类型或内表 直接定义的 ,而不是由 字段串直接 定义的特定 内表行。
将行首定义 为关键字
要将内表的 行首定义为 关键字,请 使用 WITH KEY 选项,用法 如下:
语法
....WITH KEY
SAP AG 第八章:错误!使用“开始”选项卡将8–17 Heading 1 应用于要在此处显示的文字。 其输出为: 4 0 0 3 0 2 在此,创建 包含四列的 内表。对表 格的10行 进行填充之 后,用自定 义关键字读 取单行。有 关键字段 COL3、 COL4 的自定义序 列的第一个 READ 语句失败, 第二个 READ 语句找到索 引为 3 的行。第三 个 READ 语句搜索以 “2”开始 的表格行并 找到索引为 2的行。下 图显示主要 步骤: DATA ITAB TYPE I OCCURS 10, DATA SQUARE TYPE I. DO 30 TIMES. SQUARE = SY-INDEX ** 2. APPEND SQUARE TO ITAB. ENDDO. READ TABLE ITAB INTO SQUARE WITH KEY = 25. WRITE: SY-SUBRC, SY-TABIX. 其输出为: 0 5 在此创建包 含基本类型 I 行的内表。 填充完表格 之后,读取 值为 25 且索引为 5 的行。 读取有标准 关键字的单 行
要从内表中 读取有特定 标准关键字 的第一行, 请使用 READ 语句,用法 如下: 语法
READ TABLE
标准关键字 包含 内表关键字 (页 8–2) 中所述的全 部关键字段 ,其中不包 含 SPACE。 关于“二分法搜索”选项的详细 信息,参见 二分法搜索 (页 错误!未找到引用源。) 。
如果找到有 匹配关键字 的条目,则 将系统字段 SY-SUBRC 设置为0并 且 SY-TABIX 包含该行的 索引。否则 ,将 SY-SUBRC 设置为4。
DATA: BEGIN OF LINE, COL1 TYPE C, COL2 TYPE P DECIMALS 5, END OF LINE. 8–17
SAP AG
第八章:错误!使用“开始”选项卡将8–18 Heading 1 应用于要在此处显示的文字。
DATA ITAB LIKE LINE OCCURS 10 WITH HEADER LINE. DO 5 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SQRT( SY-INDEX ). APPEND LINE TO ITAB. ENDDO. ITAB-COL1 = '2'. READ TABLE ITAB INTO LINE. WRITE LINE-COL2. 其输出为: 1.41421 在此创建有 表头行的内 表 ITAB, 并用 1 到 5 之间数值的 平方根对其 进行填充。 由于该表格 时类型 C,所以, 其缺省关键 字是 COL1。 在将“2” 赋给表格工 作区域的 COL1 之后,读取 内表的各行 并且输出 2 的平方根。 下图显示主 要步骤: 二分法搜索
用关键字读 取单行时, 可以执行二 分法搜索以 代替标准顺 序搜索。为 此,请使用 READ 语句的 二分法搜索 选项。
语法
READ TABLE
如果使用 二分法搜索 选项,则必 须按关键字 中指定的次 序对内表进 行排序。 如果系统找 到匹配指定 关键字的多 行,则读取 索引最低的 行。
二分法搜索 比线性搜索 要快。因此 ,应尽可能 将内表排序 并且使用 二分法搜索 选项。
比较单行的 内容
要将使用 READ 语句读取的 单行内容与 目标区域的 内容进行比 较,可使用 READ 语句的 COMPARING 选项,用法 如下:
语法
READ TABLE
系统读取由 关键字或
... ALL FIELDS 指定所有组 件。
如果系统找 到包含指定
SAP AG
第八章:错误!使用“开始”选项卡将8–19 Heading 1 应用于要在此处显示的文字。
APPEND LINE TO ITAB. ENDDO. LINE-COL1 = 2. LINE-COL2 = 4. LINE-COL3 = 8. READ TABLE ITAB INTO LINE INDEX 4 COMPARING COL1 COL2. WRITE: / SY-SUBRC, SY-TABIX. READ TABLE ITAB INTO LINE INDEX 4 COMPARING COL1 COL2. WRITE: / SY-SUBRC, SY-TABIX. 其输出为: 2 4 0 4 在此创建并 填充内表 ITAB 。在第一个 READ 语句之后, 将 SY-SUBRC 设置为2, 因为找到了 索引为 4 的行,但内 表和目标区 域 LINE 的 COL1 和 COL2 内容不同。 但将内表读 入 LINE 并在下一个 READ 语句之后 SY-SUBRC 返回0。下 图显示主要 步骤:
读取部分单 行
要读取部分 单行,请使 用 READ 语句的 TRANSPORTING 选项,用法 如下:
语法
READ TABLE
系统读取由 关键字或
... NO FIELDS
指定不传输 任何组件。
对于后一种 情况,READ 语句只影响 系统字段 SY-SUBRC 和 SY-TABIX。 关于 READ 语句的详细 信息,参见 关键字文档 。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, COL3 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 10 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. LINE-COL3 = SY-INDEX ** 3. APPEND LINE TO ITAB. ENDDO. CLEAR LINE. READ TABLE ITAB INTO LINE INDEX 5 TRANSPORTING COL2. WRITE: / LINE-COL1, LINE-COL2, LINE-COL3. 其输出为: 0 25 0 在此创建并 填充内表 ITAB。 READ 语句仅将 COL2 字段读入字 段串 LINE。 8–19
SAP AG
第八章:错误!使用“开始”选项卡将8–20 Heading 1 应用于要在此处显示的文字。
确定内表属 性
如果在处理 过程中想知 道内表一共 包含多少行 ,或者想知 道定义的 OCCURS 参数的大小 ,请使用 DESCRIBE 语句,用法 如下:
语法
DESCRIBE TABLE
如果使用 LINES 参数,则将 填充行的数 量写入变量
要修改已填 充的内表内 容,可以 更改行 删除行
用 MODIFY 更改行
要用 MODIFY 语句更改行 ,请使用:
语法
MODIFY
FROM 选项中指定 的工作区域
如果使用 INDEX 选项,则新 行代替索引 为
如果使用没 有 INDEX 选项的 MODIFY 语句,则系 统只能在 LOOP - ENDLOOP 块中通过更 改当前行( 例如由 SY-TABIX 返回其索引 的行)来处 理它。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. 更改和删除 内表行
8–20
SAP AG
第八章:错误!使用“开始”选项卡将8–21 Heading 1 应用于要在此处显示的文字。
DATA ITAB LIKE LINE OCCURS 10. DO 3 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. LINE-COL1 = 10. LINE-COL2 = 10 ** 2 . MODIFY ITAB FROM LINE INDEX 2. LOOP AT ITAB INTO LINE. WRITE: / SY-TABIX, LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: 1 1 1 2 10 100 3 3 9 在此创建内 表 ITAB, 并用三行对 其进行填充 。用字段串 LINE 的内容代替 第二行。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 3 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. LOOP AT ITAB INTO LINE. IF SY-TABIX = 2. LINE-COL1 = SY-TABIX * 10. LINE-COL2 = ( SY-TABIX * 10 ) ** 2 . MODIFY ITAB FROM LINE. ENDIF. ENDLOOP. LOOP AT ITAB INTO LINE. WRITE: / SY-TABIX, LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: 1 3 5 2 20 400 3 3 9 在此创建内 表 ITAB, 并用两行对 其进行填充 。在第一个 LOOP - ENDLOOP 块中,用字 段串 LINE 的内容代替 第二行。 用 WRITE TO 更改行
要用 WRITE TO 语句更改行 ,请使用下 列语法:
语法
WRITE
8–21
SAP AG
第八章:错误!使用“开始”选项卡将8–22 Heading 1 应用于要在此处显示的文字。
将字段
该语句是 用偏移量规范分配值 (页 6–3) 中所述的 WRITE TO 语句的变式 。 WRITE TO 语句不能识 别表格行的 结构。SAP 建议只在( 例如)转换 已知其确切 位置的标志 时才使用该 语句。另一 种情况是用 一个基本字 符字段定义 的内表。该 结构的表格 非常重要, 例如,用于 程序的动态 生成(参见 动态生成程序)。 DATA CODE(72) OCCURS 10 WITH HEADER LINE. CODE = 'This is the first line.'. APPEND CODE. CODE = 'This is the second line. It is ugly.'. APPEND CODE. CODE = 'This is the third and final line.'. APPEND CODE. WRITE 'nice.' TO CODE+31 INDEX 2. LOOP AT CODE. WRITE / CODE. ENDLOOP. 其输出为: This is the first line. This is the second line. It is nice. This is the third and final line. 在此用72个 字符长的基 本类型 C 字段定义内 表 CODE。 用三行对表 格进行填充 之后,使用 WRITE TO 语句更改第 二行。单词 “ugly” 由单词“nice” 代替。
在循环中删 除行
要在循环中 从内表中删 除行,请使 用 DELETE 语句,用法 如下:
语法
DELETE
系统只能在 LOOP - ENDLOOP 块中处理该 语句(参见 逐行读取内表 (页 错误!未找到引用源。) )。这删除 当前行(例 如有 SY-TABIX 返回的索引 的行)。 删除第一行 后,可以取 消当前行的 定义并取消 其对 SY-TABIX 内容的赋值 。要在该循 环内进一步 处理行,请 仅使用有 INDEX 选项的语句 。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. 8–22
SAP AG
第八章:错误!使用“开始”选项卡将8–23 Heading 1 应用于要在此处显示的文字。
DO 30 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. LOOP AT ITAB INTO LINE. IF LINE-COL1 < 28. DELETE ITAB. ENDIF. ENDLOOP. LOOP AT ITAB INTO LINE. WRITE: / SY-TABIX, LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: 1 28 784 2 29 841 3 30 900 在此创建内 表 ITAB并 用30行对 其进行填充 。在第一个 LOOP - ENDLOOP 块中,删除 COL1 字段中所有 条目小于28的 行。 用索引删除 行
要使用索引 删除行,请 使用有 INDEX 选项的 DELETE 语句,用法 如下:
语法
DELETE
如果使用 INDEX 选项,则从 ITAB 中删除索引 为
如果操作成 功,则将 SY-SUBRC 设置为0。 否则,如果 不存在索引 为
SAP AG
第八章:错误!使用“开始”选项卡将8–24 Heading 1 应用于要在此处显示的文字。
1 1 1 2 3 9 3 5 25 在此创建内 表 ITAB并 用五行对其 进行填充。 然后处理一 系列语句以 删除索引为 2、3 和 4 的三行。删 除索引为 2 的行之后, 下面行的索 引减 1。因此, 下次删除则 删除初始索 引为 4 的行。第三 次删除则会 失败,因为 表格现在仅 包含 3 行,SY-SUBRC 返回 4。
删除邻近的 重复条目
要删除邻近 重复条目, 请使用 DELETE 语句,用法 如下:
语法
DELETE ADJACENT DUPLICATE ENTRIES FROM
_ 如果没有 COMPARING 选项,则标 准关键字段 的内容必须 相同(参见 内表关键字 (页 8–
2) )。
_ 如果有 COMPARING 选项
.... COMPARING
指定字段
.... COMPARING ALL FIELDS , 所有字段的 内容必须相 同。
如果系统找 到并删除至 少一个重复 条目,则将 SY-SUBRC 设置为0。 否则,将其 设置为4。 如果表格根 据指定的比 较标准进行 过排序,则 可使用该语 句从内表中 删除所有重 复条目。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE C, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. LINE-COL1 = 1. LINE-COL2 = 'A'. APPEND LINE TO ITAB. LINE-COL1 = 1. LINE-COL2 = 'A'. APPEND LINE TO ITAB. LINE-COL1 = 1. LINE-COL2 = 'B'. APPEND LINE TO ITAB. LINE-COL1 = 2. LINE-COL2 = 'B'. APPEND LINE TO ITAB. LINE-COL1 = 3. LINE-COL2 = 'B'. APPEND LINE TO ITAB. LINE-COL1 = 4. LINE-COL2 = 'B'. APPEND LINE TO ITAB. LINE-COL1 = 5. LINE-COL2 = 'A'. APPEND LINE TO ITAB. LOOP AT ITAB INTO LINE. WRITE: / LINE-COL1, LINE-COL2. ENDLOOP. DELETE ADJACENT DUPLICATES FROM ITAB COMPARING ALL FIELDS. SKIP TO LINE 3. LOOP AT ITAB INTO LINE. WRITE: /14 LINE-COL1, LINE-COL2. ENDLOOP. DELETE ADJACENT DUPLICATES FROM ITAB COMPARING COL1. SKIP TO LINE 3. LOOP AT ITAB INTO LINE. WRITE: /28 LINE-COL1, LINE-COL2. ENDLOOP. 8–24
SAP AG
第八章:错误!使用“开始”选项卡将8–25 Heading 1 应用于要在此处显示的文字。
DELETE ADJACENT DUPLICATES FROM ITAB. SKIP TO LINE 3. LOOP AT ITAB INTO LINE. WRITE: /42 LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: 1 A 1 A 1 A 1 A 1 A 1 B 2 B 2 B 1 B 2 B 3 B 5 A 2 B 3 B 4 B 3 B 4 B 5 A 4 B 5 A 5 A 在此第一个 DELETE 语句从 ITAB 中删除第二 行,因为第 二行与第一 行的内容相 同。第二个 DELETE 语句从剩余 表格中删除 第二行,因 为字段 COL1 的内容与第 一行中的相 同。第三个 DELETE 语句从剩余 表格中删除 第三和第四 行,因为缺 省关键字段 COL2 的内容与第 二行中的相 同。尽管第 一行与第五 行缺省关键 字的内容相 同,但并不 删除第五行 ,因为与第 一行不相邻 。
删除选定行
要删除一组 选定行,使 用 DELETE 语句,用法 如下:
语法
DELETE
用户必须至 少指定三个 选项之一。 如果使用没 有 WHERE 选项的该语 句,则系统 从
如果使用 WHERE 选项,则系 统仅从
SAP AG
第八章:错误!使用“开始”选项卡将8–26 Heading 1 应用于要在此处显示的文字。
4 16 39 1.521 40 1.600 在此,如果 COL2 之值大于 20,则系 统删除 ITAB 中 3 行和 39 行之间的所 有条目。
要将内表排 序,请使用 SORT 语句,用法 如下:
语法
SORT
[BY
如果在运行 时排序标准 仍然未知, 可以通过写 入 (
用户可以通 过在
_ 首先按字 母顺序对内 表进行排序 ,然后二分 法进行搜索 (参见 二分法搜索 (页 错误!未找
到引用源。) )。按字母 顺序排序后 的内表次序 与按二分法 排序后的次 序不同。
_ 用字母关 键字多次对 内表进行排 序。在这种 情况下效率 更佳,因为 只进行一次 转换。 _ 在程序中 为数据库表 格创建字母 索引。
如果在 BY 之前指定 AS TEXT, 则选项仅影 响排序关键 字中的字符 字段。如果 在字段名之 后指定 AS TEXT, 则该字段必 须为类型 C。 如果自己指 定排序关键 字,通过使 关键字相对 短些可提高 效率。但是 ,如果排序 关键字包含 内表,则排 序进程可能 会慢很多。 排序并不稳 定。这意味 着也许没有 必要保留排 序关键字相 同的行的旧 次序。 如果主内存 中没有足够 的空间用于 排序,系统 就将数据写 入临时外部 文件。该文 件名在 SAP 参数文件参 数 DIR_SORTTMP 中定义。 DATA: BEGIN OF ITAB OCCURS 10, LAND(3) TYPE C, NAME(10) TYPE C, AGE TYPE I, WEIGHT TYPE P DECIMALS 2, END OF ITAB. ITAB-LAND = 'USA'. ITAB-NAME = 'Nancy'. ITAB-AGE = 35. ITAB-WEIGHT = '45.00'. APPEND ITAB. ITAB-LAND = 'USA'. ITAB-NAME = 'Howard'. ITAB-AGE = 40. ITAB-WEIGHT = '95.00'. APPEND ITAB. 内表排序
8–26
SAP AG
第八章:错误!使用“开始”选项卡将8–27 Heading 1 应用于要在此处显示的文字。
ITAB-LAND = 'GB'. ITAB-NAME = 'Jenny'. ITAB-AGE = 18. ITAB-WEIGHT = '50.00'. APPEND ITAB. ITAB-LAND = 'F'. ITAB-NAME = 'Michele'. ITAB-AGE = 30. ITAB-WEIGHT = '60.00'. APPEND ITAB. ITAB-LAND = 'G'. ITAB-NAME = 'Karl'. ITAB-AGE = 60. ITAB-WEIGHT = '75.00'. APPEND ITAB. SORT ITAB. LOOP AT ITAB. WRITE: / ITAB-LAND, ITAB-NAME, ITAB-AGE, ITAB-WEIGHT. ENDLOOP. SKIP. SORT ITAB DESCENDING BY LAND WEIGHT ASCENDING. LOOP AT ITAB. WRITE: / ITAB-LAND, ITAB-NAME, ITAB-AGE, ITAB-WEIGHT. ENDLOOP. 其输出为: F Michele 30 60.00 G Karl 60 75.00 GB Jenny 18 50.00 USA Howard 40 95.00 USA Nancy 35 45.00 USA Nancy 35 45.00 USA Howard 40 95.00 GB Jenny 18 50.00 G Karl 60 75.00 F Michele 30 60.00 在此创建有 表头行的内 表 ITAB 并用 5 行对其进行 填充。首先 根据其标准 关键字(LAND 和 NAME) 进行排序。 然后根据定 义为 LAND 和 WEIGHT 的排序关键 字进行排序 。一般排序 顺序定义为 降序,但对 于 WEIGHT, 定义为升序 。这就是为 什么在第二 个 SORT 语句之后包 含 NAME 字段“NANCY” 的行在包含 NAME 字段“HOWARD” 的行之前输 出。 DATA: BEGIN OF ITAB OCCURS 10, TEXT(6), XTEXT(160) TYPE X, END OF ITAB. ITAB-TEXT = 'Muller'. CONVERT TEXT ITAB-TEXT INTO SORTABLE CODE ITAB-XTEXT. APPEND ITAB. ITAB-TEXT = 'M_ ller'. CONVERT TEXT ITAB-TEXT INTO SORTABLE CODE ITAB-XTEXT. APPEND ITAB. ITAB-TEXT = 'Moller'. CONVERT TEXT ITAB-TEXT INTO SORTABLE CODE ITAB-XTEXT. APPEND ITAB. ITAB-TEXT = 'Miller'. CONVERT TEXT ITAB-TEXT INTO SORTABLE CODE ITAB-XTEXT. APPEND ITAB. SORT ITAB BY TEXT. LOOP AT ITAB. 8–27
SAP AG
第八章:错误!使用“开始”选项卡将8–28 Heading 1 应用于要在此处显示的文字。
WRITE / ITAB-TEXT. ENDLOOP. SKIP. SORT ITAB BY XTEXT. LOOP AT ITAB. WRITE / ITAB-TEXT. ENDLOOP. SKIP. SORT ITAB AS TEXT BY TEXT. LOOP AT ITAB. WRITE / ITAB-TEXT. ENDLOOP. 本示例演示 字符字段的 字母顺序排 序。内表 ITAB 包含有字符 字段的列和 有相应可按 字母排序的 二分代码的 列。二分代 码由 CONVERT 语句创建( 参见 转换成可排序格式)。对表格 进行三次排 序。首先根 据 TEXT 字段用二分 法排序。然 后根据 XTEXT 字段用二分 法排序。最 后根据 TEXT 字段按字母 排序。如果 使用 German 文本环境, 则输出为: Miller Moller Muller M_ ller Miller Moller M_ ller Muller Miller Moller M_ ller Muller 第一次排序 后,“M_ ller” 跟在“Muller” 之后,因为 字母“'_ '”的内部 代码在“u” 的代码之后 。其它两个 排序是按字 母顺序进行 的。根据 XTEXT 用二分法排 序的结果与 根据字段 TEXT 排序的结果 相同。 要创建次序 表,也可以 使用 APPEND 语句的 SORTED BY 选项代替 SORT 语句(参见创建排序的列表 (页 错误!未找到引用源。) )。在 用内表定义数据 下可以找到 使用 SORT 对数据库表 格数据进行 排序的示例 。
内表适合于 生成次序表 。为此,从 空的内表开 始,然后使 用 APPEND 语句的 SORTED BY 选项,用法 如下: 语法
APPEND [
如果使用有 SORTED BY 选项的 APPEND 语句(参见 附加行 (页 8–6) ),则并不 将新行附加 为内表
要生成包含 多达 100 个条目的次 序表,则应 该使用 APPEND 语句。在处 理更大的表 时,由于效 率方面的原 因,建议用 SORT 语句对表格 进行排序( 参见 排序内表 (页 错误!未找到引用源。) )。 如果使用 SORTED BY 选项,表格 只能包含 OCCURS 参数中指定 的行数。这 是一般规则 的一个例外 (参见创建内表数 据类型 (页 8–3) )。 如果添加的 行数比指定 的要多,则 丢弃最后一 行。这对于 创建长度有 限的次序表 十分有用( 例如“Top Ten”) 。 使用 APPEND 语句的 SORTED BY 选项指定的 工作区域必 须与内表的 行类型兼容 。可转换性 对该选项不 充分。 创建次序表
8–28
SAP AG
第八章:错误!使用“开始”选项卡将8–29 Heading 1 应用于要在此处显示的文字。
DATA: BEGIN OF ITAB OCCURS 2, COLUMN1 TYPE I, COLUMN2 TYPE I, COLUMN3 TYPE I, END OF ITAB. ITAB-COLUMN1 = 1. ITAB-COLUMN2 = 2. ITAB-COLUMN3 = 3. APPEND ITAB SORTED BY COLUMN2. ITAB-COLUMN1 = 4. ITAB-COLUMN2 = 5. ITAB-COLUMN3 = 6. APPEND ITAB SORTED BY COLUMN2. ITAB-COLUMN1 = 7. ITAB-COLUMN2 = 8. ITAB-COLUMN3 = 9. APPEND ITAB SORTED BY COLUMN2. LOOP AT ITAB. WRITE: / ITAB-COLUMN2. ENDLOOP. 其输出为: 8 5 在此,用 SORTED BY 选项将三行 附加到有表 头行的内表 中。请注意 ,COLUMN2 字段内容最 小的行被丢 失,因为 OCCURS 参数中指定 的行数为 2。 循环处理
使用 LOOP 语句将行从 内表读入工 作区域(参 见逐行读取内表 (页 错误!未找到引用源。) )。 下列主题描 述
求和
要在循环处 理期间计算 内表中数字 字段的内容 之和,请使 用 SUM 语句。用法 如下:
语法
SUM.
系统只能在 LOOP - ENDLOOP 块中处理该 语句。
如果在 AT - ENDAT 块中使用 SUM,则 系统计算当 前行组中所 有行的数字 字段之和并 将其写入工 作区域中相 应的字段( 参见 使用行组的控制级别 (页 错误!未找到引用源。) 中的示例) 。
如果在 AT - ENDAT 块之外使用 SUM 语句(参见 使用行组的控制级别 (页 错误!未找到引用源。) ),则系统 计算每个循 环途径中内 表所有行的 数字字段之 和并将其写 入工作区域 中相应的字 段(参见示 例)。 因此,应该 仅在 AT - ENDAT 块中使用 SUM 语句。 如果某个内 表行的组件 是另一个表 格,则不要 使用 SUM 语句。 本示例显示 SUM 语句在 AT - ENDAT 块之外如何 工作。不应 按以下方式 使用: DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 3 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. 8–29
SAP AG
第八章:错误!使用“开始”选项卡将8–30 Heading 1 应用于要在此处显示的文字。
APPEND LINE TO ITAB. ENDDO. LOOP AT ITAB INTO LINE. WRITE: / LINE-COL1, LINE-COL2. SUM. WRITE: / LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: 1 1 6 14 2 4 6 14 3 9 6 14 在此创建内 表 ITAB 并用三行对 其进行填充 。在 LOOP - ENDLOOP 块中,工作 区域 LINE 的内容在 SYM 语句之前和 之后输出。 计算每个循 环途径中所 有行之和。 使用行组的 控制级别
本主题描述 如何如何在 LOOP - ENDLOOP 块中使用控 制级别语句 来创建仅处 理特定表格 行的语句块 。因此可以 使用 SUM 语句计算所 有行的子集 之和(参见 计算总计 (页 错误!未找到引用源。) )。 用控制级别 语句 AT 可以打开语 句块,用控 制级别语句 ENDAT 可以关闭它 。语法如下 所示: 语法
AT
在其中处理 AT - ENDAT 内语句块的 行条件
在 AT - ENDAT 语句块中, 工作区域没 有用当前表 格行进行填 充。初始化 所有不是标 准关键字部 件的字段( 参见 标识表格行 (页 8–2) )。对于行 条件 FIRST 和 LAST, 系统用星号 (*) 改写所有标 准关键字段 。对于行条 件 NEW
SAP AG
第八章:错误!使用“开始”选项卡将8–31 Heading 1 应用于要在此处显示的文字。
LINE-COL1 = 'A'. DO 3 TIMES. LINE-COL2 = SY-INDEX. LINE-COL3 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. LINE-COL1 = 'B'. DO 3 TIMES. LINE-COL2 = 2 * SY-INDEX. LINE-COL3 = ( 2 * SY-INDEX ) ** 2. APPEND LINE TO ITAB. ENDDO. LOOP AT ITAB INTO LINE. WRITE: / LINE-COL1, LINE-COL2, LINE-COL3. AT END OF COL1. SUM. ULINE. WRITE: / LINE-COL1, LINE-COL2, LINE-COL3. SKIP. ENDAT. AT LAST. SUM. ULINE. WRITE: / LINE-COL1, LINE-COL2, LINE-COL3. ENDAT. ENDLOOP. 其输出为: A 1 1 A 2 4 A 3 9 ________________________________ A 6 14 B 2 4 B 4 16 B 6 36 ________________________________ B 12 56 ________________________________ * 18 70 在此创建内 表 ITAB并 用六行对其 进行填充。 在 LOOP - ENDLOOP 块中,为每 一循环途径 输出工作区 域 LINE。 通常在更改 COL1 内容以及系 统处于最后 一次循环时 计算所有数 字字段之和 。请将本例 与 计算总计 (页 错误!未找到引用源。) 中的例子进 行比较。 比较内表
可以将内表 用作逻辑表 达式的操作 数(参见 编写逻辑表达式 ):
语法
....
8–31
SAP AG
第八章:错误!使用“开始”选项卡将8–32 Heading 1 应用于要在此处显示的文字。
进行内表比 较的第一个 条件是它们 包含的行数 。内表包含 的行数越多 ,则内表就 越大。如果 两个内表行 数
相同,则 逐行、逐个 组件进行比 较。如果表 格行的组件 本身就是内 表,则进行 递归比较。 如果使用等 于操作符以 外的操作符 ,则系统找 到一对不相 等的组件后 就立即停止 比较并返回 该结果。
对于有表头 行的内表, 则可在表格 名之后使用 方括号 (??) 以将表格工 作区域和表 格体区别开 来。
DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA: ITAB LIKE LINE OCCURS 10, JTAB LIKE LINE OCCURS 10. DO 3 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. MOVE ITAB TO JTAB. LINE-COL1 = 10. LINE-COL2 = 20. APPEND LINE TO ITAB. IF ITAB GT JTAB. WRITE / 'ITAB GT JTAB'. ENDIF. APPEND LINE TO JTAB. IF ITAB EQ JTAB. WRITE / 'ITAB EQ JTAB'. ENDIF. LINE-COL1 = 30. LINE-COL2 = 80. APPEND LINE TO ITAB. IF JTAB LE ITAB. WRITE / 'JTAB LE ITAB'. ENDIF. LINE-COL1 = 50. LINE-COL2 = 60. APPEND LINE TO JTAB. IF ITAB NE JTAB. WRITE / 'ITAB NE JTAB'. ENDIF. IF ITAB LT JTAB. WRITE / 'ITAB LT JTAB'. ENDIF. 其输出为: ITAB GT JTAB ITAB EQ JTAB JTAB LE ITAB ITAB NE JTAB ITAB LT JTAB 在此创建两 个内表:ITAB 和 JTAB。 用 3 行填充 ITAB 并将其复制 到 JTAB 中。然后将 另一行附加 给 ITAB 并且第一个 逻辑表达式 测试 ITAB 是否大于 JTAB。 在将同一行 附加给 JTAB 之后,第二 个逻辑表达 式测试两个 表格是否相 等。然后将 另一行附加 给 ITAB ,第三个逻 辑表达式测 试 JTAB 是否小于或 等于 ITAB。 然后将一行 附加给 JTAB, 其此组件内 容与 ITAB 最后一行中 组件的内容 不相等。下 一逻辑表达 式测试 ITAB 是否与JTAB 不 8–32
SAP AG
第八章:错误!使用“开始”选项卡将8–33 Heading 1 应用于要在此处显示的文字。
相等。从 中找到 ITAB 和 JTAB 不同之处的 第一个组件 是最后一个 表格行中的 COL1。 ITAB 是30 列而 JTAB 则是50 列。因此在 最后一个逻 辑表达式中 ,ITAB 小于 JTAB。
初始化内表
要初始化有 或没有表头 的内表,请 使用 REFRESH 语句,用法 如下:
语法
REFRESH
该语句将内 表重置为填 充它以前的 状态。这意 味着表格将 不包含任何 行。
如果使用没 有表格工作 区域的内表 ,可以使用 CLEAR 语句代替 REFRESH 语句,用法 如下:
语法
CLEAR
如果使用有 表头行的内 表,CLEAR 语句如 重置缺省值 (页 6–10) 中所述,仅 清除表格工 作区域。要 重置整个内 表而不清除 表格工作区 域,使用 REFRESH 语句或 CLEAR 语句,用法 如下:
语法
CLEAR
内表名称之 后的方括号 指内表体。
使用 REFRESH 或 CLEAR 初始化内表 后,系统保 持在内存中 保留的空间 。可以用 FREE 语句释放内 存,用法如 下:
语法
FREE
也可以使用 FREE 语句重置内 表并直接释 放其内存, 而不必先使 用 REFRESH 或 CLEAR。 与 REFRESH 一样,FREE 在表格体上 ,而不在表 格工作区域 上工作。
在 FREE 语句之后, 可以再次定 位内表。这 样,系统就 再次保留内 存空间。 可以使用如 下逻辑表达 式检查内表 是否为空: 语法
...
DATA: BEGIN OF LINE, COL1, COL2, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. LINE-COL1 = 'A'. LINE-COL2 = 'B'. APPEND LINE TO ITAB. REFRESH ITAB. IF ITAB IS INITIAL. WRITE 'ITAB is empty'. FREE ITAB. ENDIF. 其输出为: ITAB is empty. 在该程序中 ,先对内表 ITAB进 行填充,然 后再用 REFRESH 初始化。在 IF 语句中,用 带 IS INITIAL 参数的逻辑 表达式检查 ITAB 是否为空。 如果空着, 则释放内存 。
8–33
正在阅读:
第八章 创建和处理内表04-21
专题05+自然地理环境的整体性与差异性-2018年高考题和高考模拟题06-27
南充市大通中学2010年春政教处工作计划05-24
Unit 1 Invitation Etiquette,邀请礼仪 - 图文10-18
《口袋妖怪:心灵之金中文版》详文攻略09-03
机械设计综合实习报告04-21
赞美中秋的诗歌七则03-21
节能改造合同(效益分享型)(标准)(1)10-23
高层建筑主体与裙房毗连时的结构处理分析09-19
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 创建
- 处理
- 铁路沉降观测方案
- 张无垢勤学《鹤林玉露》原文及翻译、阅读训练题及答案
- 关于确定济南市城市环境卫生收费标准的通知
- 09二级建造师建设工程施工管理题24
- 基于51单片机的三人表决器设计
- 招标过程廉政风险点分析与风险防范
- 2011-2012学年度第二学期高二物理教学计划
- 河北工业大学化工学院导师
- 面向对象语言有哪3个特性
- 2010年专升本《高等数学》试卷 - 图文
- 九年级物理专题复习:用图象描述物理量关系
- 新密市健康教育机构绩效考核实施方案
- 顶管施工方案 - 图文
- 消费者商场购物行为的影响因素探析
- 高二信息技术会考单元过关练习题:用计算机制作板报
- 绩效管理也有误区
- 鞋厂环评报告表 - 图文
- 高房价背后原来隐藏着这些犯罪套路啊
- 高考数学一轮复习:第2章 函数、导数及其应用 第9讲
- 英语语法基础入门精品名师资料