使用简单内部表
学习目标
定义简单的内部表。
使用简单的内部表处理数据。
简单内部表的定义
内表
内部表是变量数据对象,您可以在其中存储多个相同类型的值。此类型必须在声明中指定,称为内部表的行类型。

每个值占用内部表的一行。行数不受限制。理论上,您可以在一个内部表中存储任意数量的值。限制仅来自技术边界,如可用内存或系统配置。
内部表的初始值是空表,即具有 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 语句显式声明工作区域。
通过执行此操作,您不仅可以减少必须键入的代码量,还可以确保工作区类型适合内部表的行类型,因为内联声明数据对象的类型派生自上下文,在本例中为内部表。
试用:简单内部表
与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。
将以下代码片段复制到方法 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.
按 CTRL + F3 激活类,按 F9 将其作为控制台应用执行。
分析控制台输出。浏览源代码以熟悉概念。
使用简单内部表
在本练习中,使用迭代和简单内部表计算和显示 Fibonacci 编号。
注意
Fibonacci 数字是数字序列,其中每个数字是前面两个数字的总和。序列以 0 和 1 开头,每个后续编号是之前两个编号的总和。序列在数学、计算机科学、自然和艺术等领域具有各种数学属性、模式和应用。
模板:
无
解决方案:
/LRN/CL_S4D400_BTS_ITERATE(全局类)
任务 1: 计算数字
在您自己的包中,创建新的全局类。为迭代次数定义一个常量,并为 Fibonacci 编号定义一个内部表。然后在迭代中计算 Fibonacci 数字并将其存储在内部表中。
步骤
创建一个实施接口
IF_OO_ADT_CLASSRUN的新全局类(建议名称:ZCL_##_ITERATE,其中 ## 代表组编号)。选择 文件→新建→ABAP 类 。
在包字段中输入包的名称。在名称字段中,输入名称
ZCL_##_ITERATE,其中 ## 代表组编号。输入描述。
在接口组框中,选择添加。
输入
IF_OO_ADT_CLASSRUN。当接口出现在命中列表中时,双击该接口将其添加到类定义中。选择下一步。
选择传输请求,然后选择完成。
在 IF_OO_ADT_CLASSRUN~MAIN 方法中,使用较小的值(例如
20)定义迭代次数(建议名称:max_count)的常量。添加以下代码:
CONSTANTS max_count TYPE i VALUE 20.
声明一个简单的内部表以存储 Fibonacci 编号(建议名称:
数字)。添加以下代码:
DATA numbers TYPE TABLE OF i.
实现执行
max_count次的迭代。声明后,添加以下代码:
DO max_count TIMES.
ENDDO.
在迭代中,根据内置迭代计数器实现大小写区分:在第一个迭代中,在内部表**
编号中添加值0。在第二次迭代中,将值1添加到内部表编号的**末尾。
提示
内置迭代计数器是系统字段 sy-index。
在
DO和ENDDO之间,添加以下代码:
CASE sy-index.
WHEN 1.
APPEND 0 TO numbers.
WHEN 2.
APPEND 1 TO numbers.
ENDCASE.
添加针对所有其他值执行的分支。在此分支中,将新条目计算为前两个条目的总和(以**
数字**表示)。
提示
使用索引 sy-index - 1 和 sy-index - 2 访问前面的条目。
如下调整代码:
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 编号及其相应的序号。在行类型字符串的另一个内部表中准备输出。
步骤
在方法
if_oo_adt_classrun~main的开头,声明行类型字符串的内部表(建议名称:output)。对内部表**
编号实施循环,以将 Fibonacci 编号逐一读取到变量编号**中。
提示
将内联声明用于编号。
在 方法的末尾,添加以下代码:
LOOP AT numbers INTO DATA(number).
ENDLOOP.
声明一个整数变量(建议名称:
counter),该变量在循环之前设置为零,并在每次迭代中增加 1。
提示
您可以对计数器使用内联声明。
如下调整代码:
DATA(counter) = 0.
LOOP AT numbers INTO DATA(number).
counter = counter + 1.
ENDLOOP.
在每个迭代中,在内部表**
输出中添加一个新行,其中包含计数器(4 个字符宽,左对齐)、冒号 (:) 和数字**内容(10 个字符宽,右对齐)。
提示
使用具有适当格式选项的字符串模板调整格式。
如下调整代码:
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: 输出和测试
将结果写入控制台。然后激活类并将其作为控制台应用进行测试。
步骤
该方法结束时,调用方法
out->write将**输出内容写入控制台。为导入参数名称**提供合适的标题。在
ENDLOOP.之后,添加以下代码:
out->write(
data = output
name = |The first { max_count } Fibonacci Numbers|
) .
激活此类。
按
Ctrl + F3激活类。将类作为控制台应用执行。
按
F9以控制台应用身份执行类。