Implementing Conditional Logic

Objective

After completing this lesson, you will be able to 在 ABAP 程序中实施条件逻辑

实施条件分支

条件分支:实施

关键字 IF、ELSEIF、ELSE 和 ENDIF 可用于在 ABAP 代码中实施条件分支

条件分支是一种控制结构,允许您根据逻辑条件执行代码。

最常见的条件分支由一对关键字 IF 和 ENDIF 组成。仅当满足 IF 后的条件时,才会执行 IF 和 ENDIF 之间的 ABAP 代码块。

您可以添加更多扩展 IF 的代码块。ENDIF 通过使用关键字 ELSE 逐一构建结构,并使用关键字 ELSEIF 设置任意数量的块。通过添加关键字 ELSE,可确保始终仅执行其中一个 ABAP 代码块。如果缺少 ELSE,则不能执行任何 ABAP 代码块。

每个 IF . . ENDIF 关键字是必需的,每个 IF 都必须具有 ENDIF。

执行的 ABAP 代码块如下:

  • 首先,对 IF 条件求值。如果满足,则执行相关的 ABAP 代码块,并且程序在 ENDIF 之后继续。
  • 仅当未满足 IF 条件时,才对第一个 ELSEIF 求值后的条件。如果满足,则执行相关代码块,并且程序在 ENDIF 之后继续。

  • 此操作针对所有 ELSEIF 条件连续完成。如果不满足任何条件且结构包含 ELSE,则执行 ELSE 之后的 ABAP 代码块。否则,将不执行任何 ABAP 代码块。

提示

与许多其他编程语言相反,ABAP 在每个逻辑条件之后甚至在关键字 ELSE 之后都需要分隔符 (.)。

逻辑条件

用于通过三个示例实施构建逻辑条件的关键字列表。

逻辑条件是运行时系统评估的比较、逻辑运算、表达式和函数的组合,用于确定条件为真还是假。

逻辑条件的最常见用例位于 IF. . 中的关键字 IF 或 ELSEIF 之后。ENDIF 结构。

第一个示例(在上图中)是一个简单的比较:如果两个数据对象(x 和 y)具有相同的值,则条件为真。

第二个示例(在上图中)有点复杂:x 的值大于或等于 y 且小于 y 值的两倍,或者小于或等于 y 且大于 y 值的两倍。

第三个示例(在上图中)使用算术函数 abs( ) 和逻辑表达式 BETWEEN <expression 1> AND <expression 2>. 如果 x 的绝对值介于 y 的绝对值与两次 y 的绝对值之间,则条件为真。

对于简单的值比较,可以使用运算符 =, <>, >, <, >=, and <=。您不仅可以比较数据对象的值,还可以比较许多其它表达式的值,如上例中的算术表达式 2 * y。

注意

ABAP 对值分配和值比较使用相同的符号 (=)。根据职位进行区分。

运算符和含义

运算符含义
AND

用于连接多个逻辑表达式,以创建仅在所有多个逻辑表达式均为真时为真的新逻辑表达式。

OR

用于连接多个逻辑表达式以创建新的逻辑表达式,如果至少有一个逻辑表达式为真,则该表达式为真。

NOT

如果逻辑表达式为真(反之亦然),使用 NOT 对逻辑表达式的取反将创建新的逻辑表达式,该表达式为假。

可以使用运算符 AND 和 OR 组合逻辑表达式和运算符 NOT 来否定表达式。如果没有括号,则"不"绑定比"与"和"与"强于"或"的绑定。

ABAP 知道一些特殊逻辑表达式:

  • <data object> IS INITIAL 为 true 如果 <data object>包含其类型特定值
  • 如果 <data object> 包含的值与类型特定的初始值不同,则 <data object> NOT INITIAL 为真
  • <data object> BETWEEN <expression 1> AND <expression 2>

一些特殊的 ABAP 函数是谓词函数。  这意味着它们是逻辑条件本身。例如,Contains( ) 是用于比较字符型值的函数。

实现 IF 语句

业务示例

使用 IF ...ENDIF 关键字用户可能希望创建和评估 ABAP 程序中的逻辑条件并输出结果。创建新的应用程序并使用关键字 IF、ELSE 和 ENDIF 并输出结果。

注意

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

步骤

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

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

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

  2. 激活应用程序。

    1. 激活 (Ctrl+F3)

  3. METHOD IF_OO_ADT_CLASSRUN~MAIN 中,使用初始值 0 定义常量 C_NUMBER0。使用 IF 语句可在常量值为零或不为零时输出消息。

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

      Code Snippet
      1234567891011
      CONSTANTS: c_number0 TYPE i VALUE 0. out->write( '-----------------------------' ). out->write( 'Example 1: IF...ELSE...ENDIF' ). out->write( '-----------------------------' ). IF c_number0 = 0. out->write( 'The value of c_number0 equels zero' ). ELSE. out->write( 'The value of c_number0 equels some numer other than zero' ). ENDIF.
  4. 激活并测试类。

    1. 激活 (Ctrl+F3)

    2. F9 运行类。

    实践

案例声明

关键字 CASE、WHEN、WHEN OTHERS 和 ENDCASE 也可用于实现条件分支

条件分支的第二种技术是 CASE . . . WHEN . . . ENDCASE 控制结构。

使用 CASE . . . 的条件分支ENDCASE 是使用 IF . . . 进行更常规分支的特殊情况。ENDIF. 可以在分支取决于单个数据对象的值的情况下使用 CASE,每次使用相等比较将其与一组可能值连续进行比较。

在上面的示例中,数据对象"number"的值与值 1 和 2 进行比较。如果值等于 1,则执行 <code_block_1>,如果值等于 2,则改为执行 <code_block_2>。对于任何其他值,执行 WHEN OTHERS 后的代码块。

使用 CASE ... 的任何条件分支ENDCASE 可在 IF ...ENDIF 结构也是如此。上述右侧示例对此进行了说明。

处理字符串

业务示例

您具有客户的全名,但需要显示名字。创建 ABAP 代码以将全名拆分为名字和姓氏,并将名字输出到控制台。

注意

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

步骤

  1. 创建类 ZCL_S4D100_XX_CONDZCL_S4D100_XX_CASE

    1. 在项目浏览器中展开 CLASS ZLCOAL

    2. 右键单击包 ZS4D100_XX,然后选择新建ABAP 类

    3. 名称中输入 ZCL_S4D100_XX_CHAR

    4. 描述:中输入字符串

    5. 选择添加以添加接口 IF_OO_ADT_CLASSRUN

    6. 选择确定

    7. 选择下一步

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

    9. 激活 (Ctrl+F3)

  2. if_oo_adt_classrun~main 中的代码更改为使用 CASE 语句,而不是 IF 语句,以检查 c_number0 是否为初始值。

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

      Code Snippet
      1234567
      DATA: lv_full_name TYPE string VALUE 'Stan Wilson', lv_first_name TYPE string, lv_last_name TYPE string. SPLIT lv_full_name AT '' INTO lv_first_name lv_last_name. out->write( |user { lv_first_name }| ).
  3. 激活并测试程序。

    1. 激活 (Ctrl+F3)

    2. F9 运行类。

    实践