使用简单内部表

学习目标

  • 定义简单的内部表。

  • 使用简单的内部表处理数据。

简单内部表的定义

内表

内部表是变量数据对象,您可以在其中存储多个相同类型的值。此类型必须在声明中指定,称为内部表的行类型。

每个值占用内部表的一行。行数不受限制。理论上,您可以在一个内部表中存储任意数量的值。限制仅来自技术边界,如可用内存或系统配置。

内部表的初始值是空表,即具有 0 行的表。存在用于填充内部表的不同技术。本示例使用 APPEND 语句在内部表的末尾添加新行,并用值填充该行。

表类型

内部表的类型称为表类型。

在上一示例中,我们直接在 DATA 语句中使用 TYPE TABLE OF。表类型已绑定到声明的变量。

或者,您可以在 TYPES 语句中使用 TYPE TABLE OF 来定义具有名称的表类型。然后,您可以在 DATA 语句中使用此表类型。这些类型的可见性取决于 TYPES 语句的位置。

ABAP 字典中也存在表类型。这些表类型通过专用编辑器进行维护。它们称为全局表类型,因为它们在系统中任何位置都可见。

使用简单内部表的数据处理

观看此视频,了解如何使用 APPEND 语句填充内部表。

视频:本节含 SAP 官方视频(视频 ID 1_d7ntsls8),需在 learning.sap.com 在线观看。

内部表的初始值是空表,即行为零的内部表。

您已了解可以使用语句 CLEAR 将 ABAP 变量重置为其类型特定的初始值。

将 CLEAR 用于内部表时,将删除该表的所有内容并将行数设置为零。

有多种方法可以从内部表中检索数据。此示例使用内部表表达式检索单个行的内容。在表表达式中,内部表的名称后面紧跟一对方括号。括号内的整数表达式指定要读取的行的位置。

注意:

正确的语法需要在左方括号之后和右括号之前至少有一个空格。

从循环中的内部表读取

以下视频说明了如何从循环中的内部表中进行读取。

视频:本节含 SAP 官方视频(视频 ID 1_g9c31mzw),需在 learning.sap.com 在线观看。

对内部表实现循环时,可以在添加 INTO 后使用内联声明,而不是使用 DATA 语句显式声明工作区域。

通过执行此操作,您不仅可以减少必须键入的代码量,还可以确保工作区类型适合内部表的行类型,因为内联声明数据对象的类型派生自上下文,在本例中为内部表。

试用:简单内部表

  1. 与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。

  2. 将以下代码片段复制到方法 if_oo_adt_classrun~main() 的实施部分:

* Declarations
**********************************************************************
" Internal tables
DATA numbers TYPE TABLE OF i.
"Table type (local)
TYPES tt_strings TYPE TABLE OF string.
DATA texts1      TYPE tt_strings.
" Table type (global)
DATA texts2 TYPE string_table.
" work areas
DATA number TYPE i VALUE 1234.
DATA text TYPE string.
* Example 1: APPEND
**********************************************************************
APPEND 4711       TO numbers.
APPEND number     TO numbers.
APPEND 2 * number TO numbers.
out->write(  `-----------------` ).
out->write(  `Example 1: APPEND` ).
out->write(  `-----------------` ).
out->write( numbers ).
* Example 2: CLEAR
**********************************************************************
CLEAR numbers.
out->write(  `----------------` ).
out->write(  `Example 2: CLEAR` ).
out->write(  `----------------` ).
out->write( numbers ).
* Example 3: table expression
**********************************************************************
APPEND 4711       TO numbers.
APPEND number     TO numbers.
APPEND 2 * number TO numbers.
out->write(  `---------------------------` ).
out->write(  `Example 3: Table Expression` ).
out->write(  `---------------------------` ).
number = numbers[ 2 ] .
out->write( |Content of row 2: { number }|    ).
"Direct use of expression in string template
out->write( |Content of row 1: { numbers[ 1 ]  }| ).
* Example 4: LOOP ... ENDLOOP
**********************************************************************
out->write(  `---------------------------` ).
out->write(  `Example 4: LOOP ... ENDLOOP` ).
out->write(  `---------------------------` ).
LOOP AT numbers INTO number.
out->write( |Row: { sy-tabix } Content { number }| ).
ENDLOOP.
* Example 5: Inline declaration in LOOP ... ENDLOOP
**********************************************************************
out->write(  `-----------------------------` ).
out->write(  `Example 5: Inline Declaration` ).
out->write(  `-----------------------------` ).
LOOP AT numbers INTO DATA(number_inline).
out->write( |Row: { sy-tabix } Content { number_inline }| ).
ENDLOOP.
  1. 按 CTRL + F3 激活类,按 F9 将其作为控制台应用执行。

  2. 分析控制台输出。浏览源代码以熟悉概念。

使用简单内部表

在本练习中,使用迭代和简单内部表计算和显示 Fibonacci 编号。

注意

Fibonacci 数字是数字序列,其中每个数字是前面两个数字的总和。序列以 0 和 1 开头,每个后续编号是之前两个编号的总和。序列在数学、计算机科学、自然和艺术等领域具有各种数学属性、模式和应用。

模板:

解决方案:

  • /LRN/CL_S4D400_BTS_ITERATE(全局类)

任务 1: 计算数字

在您自己的包中,创建新的全局类。为迭代次数定义一个常量,并为 Fibonacci 编号定义一个内部表。然后在迭代中计算 Fibonacci 数字并将其存储在内部表中。

步骤

  1. 创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类(建议名称:ZCL_##_ITERATE,其中 ## 代表组编号)。

  2. 选择 文件新建ABAP 类

  3. 在包字段中输入的名称。在名称字段中,输入名称 ZCL_##_ITERATE,其中 ## 代表组编号。

  4. 输入描述。

  5. 接口组框中,选择添加

  6. 输入 IF_OO_ADT_CLASSRUN。当接口出现在命中列表中时,双击该接口将其添加到类定义中。

  7. 选择下一步

  8. 选择传输请求,然后选择完成

  9. IF_OO_ADT_CLASSRUN~MAIN 方法中,使用较小的值(例如 20)定义迭代次数(建议名称:max_count)的常量。

  10. 添加以下代码:

CONSTANTS max_count TYPE i VALUE 20.
  1. 声明一个简单的内部表以存储 Fibonacci 编号(建议名称:数字)。

  2. 添加以下代码:

DATA numbers TYPE TABLE OF i.
  1. 实现执行 max_count 次的迭代。

  2. 声明后,添加以下代码:

DO max_count TIMES.
ENDDO.
  1. 在迭代中,根据内置迭代计数器实现大小写区分:在第一个迭代中,在内部表**编号中添加值 0。在第二次迭代中,将值 1 添加到内部表编号的**末尾。

提示

内置迭代计数器是系统字段 sy-index。

  1. DOENDDO 之间,添加以下代码:

CASE sy-index.
WHEN 1.
APPEND 0 TO numbers.
WHEN 2.
APPEND 1 TO numbers.
ENDCASE.
  1. 添加针对所有其他值执行的分支。在此分支中,将新条目计算为前两个条目的总和(以**数字**表示)。

提示

使用索引 sy-index - 1 和 sy-index - 2 访问前面的条目。

  1. 如下调整代码:

CASE sy-index.
WHEN 1.
APPEND 0 TO numbers.
WHEN 2.
APPEND 1 TO numbers.
WHEN OTHERS.
APPEND numbers[  sy-index - 2 ]
+ numbers[  sy-index - 1 ]
TO numbers.
ENDCASE.

任务 2: 准备格式化输出

在内部表的循环中,准备一个格式化输出,其中列出每个 Fibonacci 编号及其相应的序号。在行类型字符串的另一个内部表中准备输出。

步骤

  1. 在方法 if_oo_adt_classrun~main 的开头,声明行类型字符串的内部表(建议名称:output)。

  2. 对内部表**编号实施循环,以将 Fibonacci 编号逐一读取到变量编号**中。

提示

将内联声明用于编号。

  1. 在 方法的末尾,添加以下代码:

LOOP AT numbers INTO DATA(number).
ENDLOOP.
  1. 声明一个整数变量(建议名称:counter),该变量在循环之前设置为零,并在每次迭代中增加 1。

提示

您可以对计数器使用内联声明。

  1. 如下调整代码:

DATA(counter) = 0.
LOOP AT numbers INTO DATA(number).
counter = counter + 1.
ENDLOOP.
  1. 在每个迭代中,在内部表**输出中添加一个新行,其中包含计数器(4 个字符宽,左对齐)、冒号 (:) 和数字**内容(10 个字符宽,右对齐)。

提示

使用具有适当格式选项的字符串模板调整格式。

  1. 如下调整代码:

DATA(counter) = 0.
LOOP AT numbers INTO DATA(number).
counter = counter + 1.
APPEND |{ counter WIDTH = 4 ALIGN = LEFT }: { number WIDTH = 10 ALIGN = RIGHT }|
TO output.
ENDLOOP.

任务 3: 输出和测试

将结果写入控制台。然后激活类并将其作为控制台应用进行测试。

步骤

  1. 该方法结束时,调用方法 out->write 将**输出内容写入控制台。为导入参数名称**提供合适的标题。

  2. ENDLOOP. 之后,添加以下代码:

out->write(
data   = output
name   = |The first { max_count } Fibonacci Numbers|
) .
  1. 激活此类。

  2. Ctrl + F3 激活类。

  3. 将类作为控制台应用执行。

  4. F9 以控制台应用身份执行类。