第八章 创建和处理内表

更新时间: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 OCCURS .

该语句通过 使用 TYPES 语句的 OCCURS 选项创建一 个内表数据 类型 。内 表中行的数 据类型在 中指定。要 指定行的数 据类型,可 以使用 TYPE 或 LIKE 参数(参见 DATA 语句的基本格式 (页 3–14) )。 通过使用 LIKE 参数引用 ABAP/4 词典中定义 的对象,可 以创建内表 ,其行结构 与存储在词 典中的对象 相同且反映 数据库表格 的结构。这 在读取和处 理数据库表 格时非常重 要(参见 读取并处理数据库表)。 指定行的初 始号。将第 一行写入用 类型 创建的内表 数据对象之 后,就为指 定行保留了 内存。如果 添加到内表 中的行比 指定的要多 ,则自动扩 展保留的内 存。如果内 存中没有足 够空间可用 于内表,则 将其写入缓 冲区或磁盘 (分页区域 )。 TYPES VECTOR TYPE I OCCURS 10. 本示例创建 内表数据类 型 VECTOR, 其行包含基 本类型 I 字段。 TYPES: BEGIN OF LINE, COLUMN1 TYPE I, COLUMN2 TYPE I, 8–3

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 [WITH HEADER LINE].

通过使用 TYPE 或 LIKE, 可以使用 选项来引用 表格数据类 型或表格数 据对象(关 键这些选项 的详细信息 ,参见 DATA 语句的基本格式 (页 3–14) )。将数据 对象 说明为结构 相同的内表 。

如果使用 WITH HEADER LINE 选项,则创 建的内表带 工作区域 (参见 访问内表 (页 8–2) )。 如果想创建 带表头行的 内表,行类 型不能直接 是内表。但 可以是用内 表作为组件 的结构。 TYPES: BEGIN OF LINE, COLUMN1 TYPE I, COLUMN2 TYPE I, COLUMN3 TYPE I, END OF LINE. TYPES ITAB TYPE LINE OCCURS 10. DATA TAB1 TYPE ITAB. 8–4

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 OCCURS [WITH HEADER LINE]. 该语句通过 使用 DATA 语句的 OCCURS 选项创建内 表 。内 表中行的数 据类型在 中指定。要 指定数据类 型,可以使 用 TYPE 或 LIKE 参数(关于 这些参数的 详细信息, 参见 DATA 语句的基本格式 (页 3–14) )。

通过使用 LIKE 参数引用 ABAP/4 词典中定义 的对象,可 以创建内表 ,其行结构 与存储在词 典中的对象 相同,并反 映数据库表 格的结构。 这在读取和 处理数据库 表格时非常 重要(参见 读取并处理数据库表)。 指定行的初 始号。将第 一行写入用 类型 创建的内表 数据对象之 后,就为指 定行保留内 存。如果添 加到内表中 的行比 指定的要多 ,则自动扩 展保留的内 存。如果内 存中没有足 够空间可用 于内表,则 将其写入缓 冲区或磁盘 (分页区域 )。

上述特征项 与用 TYPES 语句创建内 表数据类型 的特征项相 同(参见 创建内表数 据类型 (页 8–3) )。 作为附加特 征项,可以 在 DATA 语句中使用 WITH HEADER LINE 选项。这样 创建的表格 工作区域 与内表 的行结构相 同(关于表 头行的详细 信息,参见 访问内表 (页 8–2) )。 DATA FLIGHT_TAB LIKE SFLIGHT OCCURS 10. 本示例创建 数据对象 FLIGHT_TAB, 其结构与数 据库表格 SFLIGHT 相同。 本示例介绍 如何采用两 种不同的步 骤创建同一 内表。 TYPES VECTOR_TYPE TYPE I OCCURS 10. DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE. 在此创建一 个内表数据 类型 VECTOR_TYPE, 其行包含首 先创建的基 本类型 I 字段。然后 ,通过引用 VECTOR_TYPE 创建数据对 象 VECTOR。 通过使用 WITH HEADER LINE 选项还创建 表格工作区 域 VECTOR。 在这种情况 下,表格工 作区域包含 一种类型 I 字段,可以 通过名称 VECTOR 定位。 DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE. 在这种情况 下,通过直 接在 DATA 语句中使用 OCCURS 选项创建完 全一样的数 据类型 VECTOR。

创建带新结 构的内表

要创建既不 引用现有对 象,也不引 用现有行结 构的内表数 据对象,使 用 DATA 语句,用法 如下:

语法

DATA: BEGIN OF OCCURS ,

, .............. END OF .

这定义内表 并在 中说明其行 组件。除CCURS 参数外,语 法与定义字 段串相同( 参见 字段串的 DATA 语句 (页 3–18) )。

8–5

SAP AG

第八章:错误!使用“开始”选项卡将8–6 Heading 1 应用于要在此处显示的文字。

该语句通常 表格工作区 域 (参 见 访问内表 (页 8–2) )。因此, 其作用与先 创建字段串 ,然 后再创

建与 该字段串行 结构相同的 内表 相同。 指定行的初 始号。将第 一行写入用 类型 创建的内表 数据对象之 后,就为指 定行保留内 存。如果添 加到内表中 的行比 指定的要多 ,则自动扩 展保留的内 存。如果内 存中没有足 够空间可用 于内表,则 将其写入缓 冲区或磁盘 (分页区域 )。 DATA: BEGIN OF ITAB OCCURS 10, COLUMN1 TYPE I, COLUMN2 TYPE I, COLUMN3 TYPE I, END OF ITAB. 本示例创建 内表及其相 应的表格工 作区域 ITAB。

使 用内表

下列主题描 述如何使用 内表。本节 解释:

填充内表

要填充内表 ,既可逐行 添加数据, 也可复制另 一个表格的 内容。 要逐行填充 内表,可以 使用 APPEND、 COLLECT 或 INSERT 语句。

_ 要将内表 仅用于存储 数据,出于 性能方面的 考虑,建议 使用 APPEND。 用 APPEND 也可

以创建 序列清单。

_ 要计算数 字字段之和 或要确保内 表中没有出 现重复条目 ,请使用 COLLECT 语句,它根 据

标准关键 字处理行。

_ 要在内表 现有行之前 插入新行, 请使用 INSERT 语句。

要将内表内 容复制到另 一个内表中 ,请使用 APPEND、 INSERT 或 MOVE 语句的变式 。

_ 要将内表 行附加到另 一个内表中 ,请使用 APPEND 语句的变式 。 _ 要将内表 行插入另一 个内表中, 请使用 INSERT 语句的变式 。

_ 要将内表 条目内容复 制到另一个 内表中,并 且覆盖该目 标表格,请 使用 MOVE 语句。

关于如何使 用 SELECT 语句用数据 库表格中的 数据填充内 表的详细信 息,参见 将数据读入内表。

附加行

要将行附加 到内表中, 请使用 APPEND 语句,用法 如下:

语法

APPEND [ TO|INITIAL LINE TO] . 该语句将新 行附加到内 表 中。

通过使用 TO 选项,指定 要附加的源 区域 。 对于带表头 行的表格, 可以忽略 TO 选项。这样 ,表格工作 区域就成了 源区域。

可以使用 INITIAL LINE TO 选项替代 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] .

该语句通过 使用 INTO 选项指定想 附加的源区 域 。 如果表格有 表头行,则 可以忽略 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 [ INTO|INITIAL LINE INTO] [INDEX ]. 该语句通过 使用 INTO 选项指定想 插入的源区 域 。 如果表格有 表头行,则 可以忽略 INTO 选项。这样 ,表格工作 区域就成了 源区域。

可以使用 INITIAL LINE TO 选项替代 TO,将用 其类型的正 确值初始化 的行添至表 格中。

如果使用 INDEX 选项,则将 新行插入到 有索引 的行之前。 插入之后, 新条目索引 为 , 下行索引加 1。

如果表格包 含 - 1 条目,系统 将新条目附 加到最后的 现有表格行 之后。如果 表格的条目 小于 - 1,系统无 法插入条目 并将 SY-SUBRC 设置为4。 如果操作成 功,将 SY-SUBRC 设置为0。

如果使用不 带 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 [FROM ] [TO ] TO . 如果没有 FROM 和 TO 选项,该语 句将整个表 格 ITAB1 附加到 ITAB2 中。如果使 用这些选项 ,则可通过 索引 指定 ITAB1 中要附加的 第一或最后 一行。 用该方式将 表格行附加 到另一个表 格中的速度 比在循环中 逐行进行附 加快3到4倍 。 在 APPEND 语句之后, 系统字段 SY-TABIX 包含附加的 最后一行的 索引。 DATA: BEGIN OF ITAB OCCURS 10. COL1 TYPE C, COL2 TYPE I, END OF ITAB. DATA JTAB LIKE ITAB OCCURS 10 WITH HEADER LINE. DO 3 TIMES. ITAB-COL1 = SY-INDEX. ITAB-COL2 = SY-INDEX ** 2. APPEND ITAB. JTAB-COL1 = SY-INDEX. JTAB-COL2 = SY-INDEX ** 3. 8–10

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 [FROM ] [TO ] INTO [INDEX ]. 如果没有 FROM 和 TO 选项,该语 句将整个表 格 ITAB1 附加到 ITAB2 中。如果使 用这些选项 ,则可通过 索引 指定 ITAB1 中要附加的 第一或最后 一行。

如果使用 INDEX 选项,将 的行插入到 中索引为 的行之前。 如果不使用 INDEX 选项,系统 只能在 LOOP - ENDLOOP 块中通过在 当前行(例 如,其索引 在 SY-TABIX 中返回的行 )之前插入 新条目来处 理它。 取决于表格 大小和插入 地点的不同 ,用该方式 将一个表格 插入到另一 个中的速度 比在循环中 逐行进行插 入要快近20倍 。 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. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 3. APPEND LINE TO JTAB. ENDDO. INSERT LINES OF ITAB INTO JTAB INDEX 1. LOOP AT JTAB INTO LINE. WRITE: / SY-TABIX, LINE-COL1, LINE-COL2. ENDLOOP. 本示例创建 两个类型相 同的内表: ITAB 和 JTAB, 并且用 3 行对其进行 填充。然后 将整个表格 ITAB 插入到 JTAB 的第一行之 前。JTAB 的输出如下 所示: 8–11

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 TO . 该语句等价 于:

= . 也可进行多 重赋值,例 如,

= = = . 也是可能的 。ABAP/4 从右到左进 行处理: = . = . = .

这些语句执 行完整操作 。复制整个 表格内容, 包括作为表 格组件的任 何其它内表 的数据。覆 盖目标表格 原来的内容 。

语法与复制 基本字段相 同(详细信 息,参见 基本分配操作 (页 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 ] [TO ] [WHERE ]. ..... ENDLOOP.

用 INTO 选项指定目 标区域 。 如果表格有 表头行,则 可以忽略 INTO 选项。这样 ,表格工作 区域就成了 目标区域。

逐行将内表 读入 或表格工作 区域 。 对于读取的 每一行,系 统都处理以 LOOP 开始,以 ENDLOOP 结束的语句 块。可以用 控制关键字 AT 在 LOOP - ENDLOOP 块内控制语 句块流(参 见 循环处理 (页 错误!未找到引用源。) )。 在语句块内 ,系统字段 SY-TABIX 包含当前行 的索引。处 理完表格的 所有行之后 循环结束。 在 ENDLOOP 语句之后, 如果至少读 取了一行, 则将系统字 段 SY-SUBRC 设置为0。 否则,将其 设置为4。 可以使用 FROM、 TO 或 WHERE 选项限制要 在循环中进 行处理的行 数。

_ 使用 FROM 选项,可以 用 指定要读取 的第一行 _ 使用 TO 选项,可以 用 指定要读取 的最后一行 。

_ 用 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 ] INDEX .

用 INTO 选项指定目 标区域 。 如果表格有 表头行,可 以忽略 INTO 选项。这样 ,表格工作 区域就成了 目标区域。

系统用索引 从表格 中读取行。 这比用关键 字访问表格 要快(参见 用关键字读取单行 (页 错误!未找到引用源。) )。

如果找到有 指定索引的 条目,则将 系统字段 SY-SUBRC 设置为0, 而且 SY-TABIX 包含该行的 索引。否则 ,SY-SUBRC 包含非0值 。 如果 小于或等于 0,则会发 生实时错误 。如果 超过表格大 小,系统将 SY-SUBRC 中的返回代 码值设置为 4。 DATA: BEGIN OF ITAB OCCURS 10, COL1 TYPE I, COL2 TYPE I, END OF ITAB. DO 20 TIMES. ITAB-COL1 = SY-INDEX. ITAB-COL2 = 2 * SY-INDEX. APPEND ITAB. ENDDO. READ TABLE ITAB INDEX 7. WRITE: SY-SUBRC, SY-TABIX. WRITE: / ITAB-COL1, ITAB-COL2. 其输出为: 0 7 7 14 在此创建有 表头行的内 表 ITAB, 并用20行 对其进行填 充。读取并 输出索引为 7的行。

读取有关键 字的单行

按如下方式 从内表中读 取有关键字 的单行:用

读取有关键 字的单行时 ,可以用二 分法搜索代 替顺序搜索 。关于二分 法搜索的详 细信息,参 见

8–15

SAP AG

第八章:错误!使用“开始”选项卡将8–16 Heading 1 应用于要在此处显示的文字。

用自定义关 键字读取单 行

要从有自定 义关键字的 内表中读取 单行,请使 用 READ 语句的 WITH KEY 选项,用法 如下:

语法

READ TABLE [INTO ] WITH KEY [BINARY SEARCH].

用 INTO 选项可以指 定目标区域 。如果表格 有表头行, 则可以忽略 INTO 选项。这样 ,表格工作 区域就成了 目标区域。

系统读取 中匹配 中所定义的 关键字的第 一个条目。 关于 二分法搜索 选项的详细 信息,参见 二分法搜索 (页 错误!未找到引用源。) 。 如果找到有 适当关键字 的条目,则 将系统字段 SY-SUBRC 设置为0, 并且 SY-TABIX 包含该行的 索引。否则 ,将 SY-SUBRC 设置为非0值 。

如下所述, 可以定义多 个关键字

定义一系列 关键字段

要定义自己 的一系列关 键字段,请 使用 WITH KEY 选项,用法 如下:

语法

....WITH KEY = ... = ...

自定义关键 字包含表格 组件 ...。 字段 ... 是关键字段 的内容必须 匹配的值。 如果 的数据类型 与数据类型 不兼容,则 转换为类型

可以用 () 代替 来实时设置 关键字段。 关键字段是 字段 的内容。如 果在运行时 为空,则系 统忽略该关 键字段。如 果 包含无效的 组件名称, 则发生实时 错误。

用户可以为 任何在关键 字中使用的 组件指定偏 移量和长度 (参见 指定数据对象的偏移值 (页 6–35) )。 将整行定义 为关键字

通过使用 WITH KEY 选项可将内 表整行定义 为其关键字 ,如下所示 :

语法

....WITH KEY = ...

如果 的数据类型 与表格行的 数据类型不 兼容,则将 转换为表格 行的数据类 型。

对于此类关 键字,也可 以选择由某 个基本数据 类型或内表 直接定义的 ,而不是由 字段串直接 定义的特定 内表行。

将行首定义 为关键字

要将内表的 行首定义为 关键字,请 使用 WITH KEY 选项,用法 如下:

语法

....WITH KEY ... 系统将(左 对齐)的行 首与 进行比较。 不能包含内 表或包含内 表的结构。 与上面两个 选项不同之 处在于用 的数据类型 进行比较。 DATA: BEGIN OF LINE, COL1 TYPE C, COL2 TYPE P DECIMALS 5, COL3 TYPE I, COL4 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 10 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SQRT( SY-INDEX ). LINE-COL3 = SY-INDEX ** 2. LINE-COL4 = SY-INDEX ** 3. APPEND LINE TO ITAB. ENDDO. READ TABLE ITAB INTO LINE WITH KEY COL3 = 9 COL4 = 36. WRITE: / SY-SUBRC, SY-TABIX. READ TABLE ITAB INTO LINE WITH KEY COL3 = 9 COL4 = 27. WRITE: / SY-SUBRC, SY-TABIX. READ TABLE ITAB INTO LINE WITH KEY '2'. WRITE: / SY-SUBRC, SY-TABIX. 8–16

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 [INTO ] [BINARY SEARCH]. 用户必须指 定要从 的表格工作 区域中读取 行的关键字 。 读取语句的 该变式只能 用于有表头 行的内表。 系统在表格 中搜索第一 个条目以匹 配表格工作 区域中的所 有标准关键 字段并将该 行读入表格 工作区域。 如果使用 INTO 选项,则将 该行读入工 作区域

标准关键字 包含 内表关键字 (页 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 ..... BINARY SEARCH.

如果使用 二分法搜索 选项,则必 须按关键字 中指定的次 序对内表进 行排序。 如果系统找 到匹配指定 关键字的多 行,则读取 索引最低的 行。

二分法搜索 比线性搜索 要快。因此 ,应尽可能 将内表排序 并且使用 二分法搜索 选项。

比较单行的 内容

要将使用 READ 语句读取的 单行内容与 目标区域的 内容进行比 较,可使用 READ 语句的 COMPARING 选项,用法 如下:

语法

READ TABLE [INTO ] COMPARING .

系统读取由 关键字或 中的索引指 定的单行。 读取行之后 ,将 中指定的组 件与目标区 域中的相应 组件进行比 较。可以用 INTO 选项指定目 标区域 。 如果表格有 表头,则可 以忽略 INTO 选项。这样 ,表格工作 区域就成了 目标区域。 对于 , 可以编写一 系列组件 ... ...。 也可以用

... ALL FIELDS 指定所有组 件。

如果系统找 到包含指定 的条目,且 进行比较的 字段内容相 同,则将 SY-SUBRC 设置为0。 如果进行比 较的字段内 容不同,则 返回值 2。如果系 统找不到条 目,则包含 4。 如果系统找 到条目,则 无论比较结 果如何,都 将其读入目 标区域。关 于 READ 语句的详细 信息,参见 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. 8–18

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 [INTO ] TRANSPORTING .

系统读取由 关键字或 中索引指定 的单行。读 取行之后, 将 中指定的组 件传输给目 标区域。可 以使用 INTO 选项指定目 标区域 。 如果表格有 表头行,可 以忽略 INTO 选项。这样 ,表格工作 区域就成了 目标区域。 对于 , 可以用 ... ... 指定一系列 组件。 也可以用

... 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 ] [OCCURS ].

如果使用 LINES 参数,则将 填充行的数 量写入变量 。 如果使用 OCCURS 参数,则将 行的初始号 写入变量 。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DATA: LIN TYPE I, OCC TYPE I. DESCRIBE TABLE ITAB LINES LIN OCCURS OCC. WRITE: / LIN, OCC. DO 1000 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. DESCRIBE TABLE ITAB LINES LIN OCCURS OCC. WRITE: / LIN, OCC. 其输出为: 0 10 1.000 10 在此创建内 表 ITAB。 在填充表格 前后执行 DESCRIBE 语句。更改 当前行号, 但无法更改 初始行号。

要修改已填 充的内表内 容,可以 更改行 删除行

用 MODIFY 更改行

要用 MODIFY 语句更改行 ,请使用:

语法

MODIFY [FROM ] [INDEX ].

FROM 选项中指定 的工作区域 代替 中的行。如 果表格有表 头行,可以 忽略 FROM 选项。这样 ,表格工作 区域就代替 行。

如果使用 INDEX 选项,则新 行代替索引 为 的现有行。 如果替换成 功,则将 SY-SUBRC 设置为0。 如果内表包 含的行少于 , 则不更改任 何行并且 SY-SUBRC 包含4。

如果使用没 有 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 [+][()] TO [+][()] INDEX .

8–21

SAP AG

第八章:错误!使用“开始”选项卡将8–22 Heading 1 应用于要在此处显示的文字。

将字段 中偏移量为 , 长度为 部分的内容 复制到索引 为 的表格行中 ,覆盖偏移 量为

, 长度为 的部分。请 注意,即使 对于有表头 行的表格, 带 INDEX 选项的 WRITE TO 语句也不访 问表格工作 区域,而是 访问表格的 某一行。

该语句是 用偏移量规范分配值 (页 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 .

如果使用 INDEX 选项,则从 ITAB 中删除索引 为 的行。删除 行之后,下 面行的索引 减1。

如果操作成 功,则将 SY-SUBRC 设置为0。 否则,如果 不存在索引 为 的行,则 SY-SUBRC 包含 4。 如果在 LOOP - ENDLOOP 块中删除某 一条目,则 当前行及其 对 SY-TABIX 内容的赋值 可成为未定 义。要在该 循环内进一 步处理行, 请仅使用有 INDEX 选项的语句 。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 5 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. DELETE ITAB INDEX: 2, 3, 4. WRITE: 'SY-SUBRC',SY-SUBRC. LOOP AT ITAB INTO LINE. WRITE: / SY-TABIX, LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: SY-SUBRC 4 8–23

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 ]. 系统从内表 中删除所有 邻近重复条 目。 完成以下比 较标准之后 ,条目就会 重复:

_ 如果没有 COMPARING 选项,则标 准关键字段 的内容必须 相同(参见 内表关键字 (页 8–

2) )。

_ 如果有 COMPARING 选项

.... 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 [FROM ] [TO ] [WHERE ].

用户必须至 少指定三个 选项之一。 如果使用没 有 WHERE 选项的该语 句,则系统 从 中删除所有 索引在 之间的行。 如果不使用 FROM 选项,则系 统从第一行 开始删除。 如果不使用 TO 选项,则系 统删除所有 行直到最后 一行。

如果使用 WHERE 选项,则系 统仅从 中删除满足 条件 的行。对于 , 可指定任何 逻辑表达式 (参见 编写逻辑表达式 (页 7–3) )。第一个 操作数必须 是内表行结 构的组件。 如果系统至 少删除一行 ,则将 SY-SUBRC 设置为0。 否则,将其 设置为4。 DATA: BEGIN OF LINE, COL1 TYPE I, COL2 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. DO 40 TIMES. LINE-COL1 = SY-INDEX. LINE-COL2 = SY-INDEX ** 2. APPEND LINE TO ITAB. ENDDO. DELETE ITAB FROM 3 TO 38 WHERE COL2 > 20. LOOP AT ITAB INTO LINE. WRITE: / LINE-COL1, LINE-COL2. ENDLOOP. 其输出为: 1 1 2 4 3 9 8–25

SAP AG

第八章:错误!使用“开始”选项卡将8–26 Heading 1 应用于要在此处显示的文字。

4 16 39 1.521 40 1.600 在此,如果 COL2 之值大于 20,则系 统删除 ITAB 中 3 行和 39 行之间的所 有条目。

要将内表排 序,请使用 SORT 语句,用法 如下:

语法

SORT [] [AS TEXT]

[BY [] [AS TEXT] ... [] [AS TEXT]]. 如果不使用 BY 选项,则根 据其标准关 键字对内表 进行排序( 参见 内表关键字 (页 8–2) )。要定义 不同的排序 关键字,使 用 BY 选项。系统 就根据指定 组件 ... 对数据集进 行排序。这 些字段可以 是任何类型 ,包括类型 P、I 和 F 字段,或者 表格。排序 关键字段的 数目限制在 250 以内。如果 指定多个关 键字段,则 系统首先根 据 ,然后根据 , 以此类推对 记录进行排 序。系统使 用 BY 之前指定的 选项作为 BY 之后指定的 所有字段的 缺省选项。 在单个字段 之后指定的 选项覆盖选 项在 BY 之前指定的 这些字段。

如果在运行 时排序标准 仍然未知, 可以通过写 入 () 代替 进行动态设 置。字段 包含排序关 键字段的名 称。如果 在运行时为 空,系统就 将其忽略。 如果包含无 效的组件名 ,则发生实 时错误。对 于任何在排 序字段中使 用的字段, 用户都可指 定偏移量和 长度(参见 为数据对象指定偏移值 (页 6–35) )。

用户可以通 过在 选项中输入 DESCENDING 或 ASCENDING 来指定排序 顺序。标准 顺序是升序 。 用户可以用 选项 AS TEXT 影响字符字 段的排序方 式。如果没 有 AS TEXT, 则系统二分 排序字符字 段并根据它 们的平台相 关内部编码 。如果有选 项 AS TEXT, 系统根据当 前文本环境 按字母顺序 排序字符字 段。用户可 用语句 SET LOCAL LANGUAGE 设置文本环 境,这是例 外。使用选 项 AS TEXT, 用户可免除 在排序之前 将字符字段 转换为可排 序格式之劳 (参见 转换成可排序格式 (页 6–26) )。此类转 换仅在下列 情况下才有 必要:

_ 首先按字 母顺序对内 表进行排序 ,然后二分 法进行搜索 (参见 二分法搜索 (页 错误!未找

到引用源。) )。按字母 顺序排序后 的内表次序 与按二分法 排序后的次 序不同。

_ 用字母关 键字多次对 内表进行排 序。在这种 情况下效率 更佳,因为 只进行一次 转换。 _ 在程序中 为数据库表 格创建字母 索引。

如果在 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 [ TO] SORTED BY .

如果使用有 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 .

ENDAT.

在其中处理 AT - ENDAT 内语句块的 行条件 可以是: 含 义 FIRST LAST NEW 内 表的第一行 内 表的最后一 行 行组 的开头,与 字段 剩余字段中 的内容相同 END Of 行组 的结尾,与 字段 剩余字段中 的内容相同 AT - ENDAT 块中的语句 块使用这些 行条件代表 预定义的控 制结构。用 户可以使用 它们处理内 表中的控制 断点,而不 必使用 编写分支和循环 (页 7–14) 中所述的控 制语句自己 编程。

在 AT - ENDAT 语句块中, 工作区域没 有用当前表 格行进行填 充。初始化 所有不是标 准关键字部 件的字段( 参见 标识表格行 (页 8–2) )。对于行 条件 FIRST 和 LAST, 系统用星号 (*) 改写所有标 准关键字段 。对于行条 件 NEW 和 END OF ,系 统用星号 (*) 改写所有出 现在工作区 域中指定字 段 右边的标准 关键字段。 用户可根据 自己的需求 在 AT - ENDAT 语句块中填 充工作区域 。 不要在 LOOP 语句的作用 受 FROM、 TO 或 WHERE 限制的循环 中使用控制 级别语句( 参见逐行读取内表 (页 错误!未找到引用源。) ),因为没 有很好地定 义交互作用 vDATA: BEGIN OF LINE, COL1 TYPE C, COL2 TYPE I, COL3 TYPE I, END OF LINE. DATA ITAB LIKE LINE OCCURS 10. 8–30

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 内容以及系 统处于最后 一次循环时 计算所有数 字字段之和 。请将本例 与 计算总计 (页 错误!未找到引用源。) 中的例子进 行比较。 比较内表

可以将内表 用作逻辑表 达式的操作 数(参见 编写逻辑表达式 ):

语法

.... ... 对于 , 可以使用 比较所有字段类型 (页 7–4) 中的表格内 列出的所有 操作符(EQ、 =、 NE、 <>、 ><、 GE、 >=、 LE、 <=、 GT、 >、 LT、 <)。

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 语句之后, 可以再次定 位内表。这 样,系统就 再次保留内 存空间。 可以使用如 下逻辑表达 式检查内表 是否为空: 语法

... IS INITIAL ... (参见检查内部值 (页 7–12) )。

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

本文来源:https://www.bwwdw.com/article/ax5p.html

Top