Implementing Loops

Objective

After completing this lesson, you will be able to 实施循环

实施循环

关键字 DO、ENDDO、LOOP 和 ENDLOOP 可用于定义循环

ABAP 中的循环在一个多次执行的代码块中定义。

最简单的循环形式由语句 DO – ENDDO 包围的代码块组成。如果没有进一步措施,这些语句可以建立无限循环,必须避免以下一种可能性:

指定的循环数
通过使用后跟关键字 TIMES 的整数表达式扩展 DO 语句,可以明确指定代码块的处理频率。整数表达式可以像数字文字一样简单,但也可以使用算术计算。如果表达式的值等于 0,则 DO 和 ENDDO 之间的代码块根本不会执行,并且程序会立即在 ENDDO 后继续使用该代码。
基于逻辑条件中止
您可以随时使用 EXIT 语句中止循环。然后,程序在 ENDDO 后继续使用该代码。请注意,在循环 EXIT 之外,会产生不同的影响。在此,它会终止当前处理块(例如,当前方法)的处理。

通常,EXIT 由 IF 和 ENDIF 括起来,以根据中止条件终止循环。请注意,如果中止条件从不为 true,则此类循环可以变成无限循环。

当然,可以结合这两种技术,即显式指定循环数,然后用 EXIT 退出循环。因此,循环数成为运行时可能无法达到的最大数量。

在 DO 和 ENDDO 之间的代码块中,可以实施对 ABAP 内置数据对象 SY-INDEX 的读取访问。此整数变量用作循环计数器,即 ABAP 运行时在每个新循环开始时将变量增加 1。

ABAP 内置变量 SY-TABIX 可实现类似的循环目的。但请注意,SY-TABIX 实际上不是计数器,但它标识在当前循环中处理的表行的位置。

实施 DO – ENDDO 循环

业务示例

使用 DO . . ENDDO 关键字,用户可能希望创建具有指定循环数的循环。

步骤

  1. 使用接口 IF_OO_ADT_CLASSRUN 创建新的 ABAP 类 ZCL_S4D100_XX_DO_ENDDO

    1. 创建名称为 ZCL_S4D100_XX_ENDDO 的新 ABAP 类并添加接口 IF_OO_ADT_CLASSRUN

    2. 将其分配到包并将其绑定到您的传输请求。

  2. 激活应用程序。

    1. 激活 (Ctrl+F3)

  3. METHOD IF_OO_ADT_CLASSRUN~MAIN 中,定义一个 LOOP,用于迭代 3 次并输出消息,

    1. METHOD IF_OO_ADT_CLASSRUN~MAIN 中实施以下代码。

      Code Snippet
      123456789
      CONSTANTS: c_number0 TYPE i VALUE 3. out->write( '---------------------------------' ). out->write( 'Example 1: DO...ENDDO with TIMES' ). out->write( '---------------------------------' ). DO c_number0 TIMES. out->write( 'Hello World' ). ENDDO.
  4. 激活并测试类。

    1. 激活 (Ctrl+F3)

    2. F9 运行类。

    实践

实施 DO – 具有中止条件的 ENDDO 循环

业务示例

使用 DO . . ENDDO 关键字,用户可能希望使用关键字 EXIT 创建含中止条件的循环。

注意

在本练习中,XX 是指您的编号。

步骤

  1. 将类 ZCL_S4D100_XX_DO_ENDDO 复制到 ZCL_S4D100_XX_EXIT

    1. 右键单击项目浏览器中的 CLASS ZCL_S4D100_XX_DO_ENDDO,然后选择复制

    2. 输入您的包、名称和新类名称 ZCL_S4D100_XX_EXIT,然后按下一步

    3. 将其添加到您的传输请求并按完成

  2. 激活应用程序。

    1. 激活 (Ctrl+F3)

  3. 更改 if_oo_adt_classrun~main 中的代码以将新的整数 lv_number0 设置为值 c_number0 * c_number0。创建 DO 循环,并在每次循环迭代期间从 lv_number0 中减去 1。当 lv_number0 等于 c_number0 时退出循环。

    1. 使用以下代码实施 METHOD IF_OO_ADT_CLASSRUN~MAIN. :

      Code Snippet
      123456789101112131415
      CONSTANTS: c_number0 TYPE i VALUE 3. DATA: lv_number0 TYPE i. lv_number0 = c_number0 * c_number0. * Count backwards from lv_number0 to c_number0 DO. out->write( |{ sy-index }: Value of lv_number0: { lv_number0 }| ). lv_number0 = lv_number0 - 1. * Abort condition IF lv_number0 <= c_number0. "If 3 = 3 EXIT. ENDIF. ENDDO.
  4. 激活并测试程序。

    1. 激活 (Ctrl+F3)

    2. F9 运行类。

    实践