ABAP语法基础篇(6)——流程控制
六、逻辑流控制
6.1 比较运算符
要比较所有的字段类型,可以在逻辑表达式中使用下列运算符:
| < 运算符 > | 含义 |
|---|---|
| EQ | 等于 |
| = | 等于 |
| NE | 不等于 |
| <> | 不等于 |
| >< | 不等于 |
| LT | 小于 |
| < | 小于 |
| LE | 小于等于 |
| <= | 小于等于 |
| GT | 大于 |
| > | 大于 |
| GE | 大于等于 |
| >= | 大于等于 |
操作数可以是数据库字段、内部字段、文字或常数。
除基本字段外,还可以将结构数据类型和上表中的运算符结合起来作为操作数。字段串逐个组件进行比较,嵌套的结构分为基本的字段。
如果有意义,可以对不同数据类型的字段进行比较。如果字段可转换,就可以进行比较。在比较之前,系统将按照下列层次规则执行自动类型转换:
-
如果操作数之一是浮点数(类型 F ),则系统将其它操作数转换为类型 F 。
-
如果操作数之一是压缩字段(类型 P ),则系统将其它操作数转换为类型P 。
-
如果操作数之一是日期字段(类型 D )或时间字段(类型 T),则系统将其它操作数转换为类型 D 或 T。不支持日期和时间字段之间的比较,这会导致程序中断。
-
如果操作数之一是字符字段(类型 C )且其它操作数是十六进制字段(类型 X),则系统将类型 X 的操作数转换为类型 C 。
-
如果操作数之一是字符字段(类型 C ),其它操作数为数字字段(类型 N),则系统将这两种操作数都转换为类型 P 。
6.2 比较字符串和数字串
要比较字符串(类型 C )和数字文本(类型 N ),可以在逻辑表达式中使用下列运算符。
| < 运算符 > | 含义 |
|---|---|
| CO | 仅包含 |
| CN | 不仅包含 |
| CA | 包含任何 |
| NA | 不包含任何 |
| CS | 包含字符串 |
| NS | 不包含字符串 |
| CP | 包含模式 |
| NP | 不包含模式 |
因为除类型 N 和 C 外,系统不能执行任何其它类型转换,所以,在进行包含这些运算之一的比较时,操作数应该是类型 N 或 C 。
运算符的功能如下:
- CO ( 仅包含 )
如果
仅包含中的字符,则逻辑表达式为真。该比较区分大小写,并包括尾部空格。如果比较结果为真,则系统字段CO SY-FDPOS包括的长度。如果为假,则SY-FDPOS包含中第一个未在内出现的字符的偏移量。
- CN ( 不仅包含 )
如果
还包含之外的其他字符,则逻辑表达式为真。该比较区分大小写,并包括尾部空格。如果比较结果为真,则系统字段CN SY-FDPOS包含中第一个未同时在中出现的字符的偏移量。如果为假,SY-FDPOS包含的长度。
- CA ( 包含任何 )
如果
至少包含的一个字符,则逻辑表达式为真。该比较区分大小写。如果比较结果为真,则系统字段CA SY-FDPOS包含中第一个也在中出现的字符的偏移量。如果为假,SY-FDPOS包含的长度。
- NA ( 不包含任何 )
如果
不包含的任何字符,则逻辑表达式为真。该比较区分大小写。如果比较结果为真,则系统字段NA SY-FDPOS包含的长度。如果为假,则SY-FDPOS包含中在内出现的第一个字符的偏移量。
- CS ( 包含字符串 )
如果
包含字符串,则逻辑表达式为真。忽略尾部空格并且比较不区分大小写。如果比较结果为真,则系统字段CS SY-FDPOS包含在中的偏移量。如果为假,SY-FDPOS包含的长度。
- NS ( 不包含字符串 )
如果
不包含字符串,则逻辑表达式为真。忽略尾部空格且比较不区分大小写。如果比较为真,系统字段NS SY-FDPOS包含的长度。如果为假,系统字段SY-FDPOS包含在中的偏移量。
- CP ( 包含模式 )
如果
包含模式,则逻辑表达式为真。如果CP 属于类型 C ,则可以在中使用下列通配符:
-
* 用于任何字符串
-
+ 用于任何单个字符
忽略尾部空格且比较不区分大小写。如果比较结果为真,系统字段
SY-FDPOS包含在中的偏移量。如果为假,SY-FDPOS包含的长度。
如果要对中的特殊字符进行比较,请将换码符 # 放到其前面。可以使用换码字符# 指定 :
大小写字符
通配符 "*"( 输入 #*)
通配符 "+" ( 输入 #+)
换码符号本身 ( 输入 ##)
字符串结尾的空格 ( 输入 #_) -
NP ( 不包含模式 )
如果
不包含模式,则逻辑表达式为真。在NP 中,可以使用与CP相同的通配符和换码字符。忽略尾部空格且比较不区分大小写。如果比较结果为真,则系统字段SY-FDPOS包含的长度,如果为假,SY-FDPOS包含在中的偏移量。
6.3 比较二进制位结构
要将逻辑表达式初始操作数第一字节的二进制位结构与第二操作数的进行比较,请使用下列操作符。
| < 运算符 > | 含义 |
|---|---|
| O | 二进制位是 1 |
| Z | 二进制位是 0 |
| M | 混合二进制位 |
第二操作数的长度应为一个字节。
没有必要对第二操作数使用长度为 1 的十六进制字段(类型 X),但却较方便,因为其长度为一个字节且数字值直接与二进制位结构相关。
操作符功能如下:
O ( 二进制位是 1)
如果 中二进制位是 1 的位置,在 中是 1 ,则逻辑表达式 为真。
Z ( 二进制位是 0)
如果 中二进制位是 1 的位置,在 中是 0 ,则逻辑表达式 为真。
M ( 混合二进制位 )
如果从 中二进制位是 1 的位置起, 中至少一个是 1 ,一个是 0,则逻辑表达式 为真。
6.4 编程分支和循环
6.4.1 IF条件分支
IF 语句允许依据条件将程序流转到特定的语句块中。该语句块包括 IF 语句及其后面的 ELSEIF 、 ELSE 或 ENDIF 之间的所有命令。
IF .
ELSEIF .
ELSEIF .
.....
ELSE.
ENDIF.
如果第一个条件是真,系统将执行所有语句直到第一个语句块结束,然后继续处理 ENDIF 语句之后的程序。
要采用选择性条件,可以使用 ELSEIF 语句。如果第一个条件是假,系统使用与 IF 语句一样的方式处理后面的 ELSEIF 语句。
如果 IF 或 ELSEIF 条件都为假,则执行 ELSE 开始的语句块。最后的语句块必须用ENDIF 结束。
要用公式表达 IF 和 ELSEIF 语句中的条件,可以使用任何编程逻辑表达式描述的逻辑表达式。
6.4.2 CASE 条件分支
要根据特殊数据字段的内容执行不同的语句块,可以如下使用 CASE 语句:
CASE .
WHEN .
WHEN .
WHEN .
WHEN ...
......
WHEN OTHERS.
ENDCASE.
系统执行 WHEN 语句之后的语句块,如果 内容等于 的内容,且继续处理 ENDCASE 语句后面的语句。
如果 的内容不等于 的内容,则执行选项 WHEN OTHERS 后面的语句块。最后的语句块必须用 ENDCASE 结束。
6.4.3 DO无条件循环
如果想要多次执行语句块,则可以如下使用 DO 语句编程循环:
DO [ TIMES] [VARYING FROM NEXT ].
ENDDO.
在发现 EXIT 、 STOP 或 REJECT 语句之前,系统继续执行由 DO 引导、 ENDDO 结束的语句块。
可以使用 TIMES 选项限制循环次数。 可以是文字或变量。如果 是 0 或负数,系统不执行该循环。
系统字段 SY-INDEX 中包含已处理过的循环次数。
6.4.4 WHILE条件循环
如果只要条件为真,就不止一次执行语句,可以如下使用 WHILE 语句编程:
WHILE [VARY FROM NEXT ].
ENDWHILE.
只要 是真,或系统发现 EXIT 、 STOP 或 REJECT 语句,系统将继续执行由 WHILE 语句引导、 ENDWHILE 结束的语句块。
对于 ,可以使用编程逻辑表达式中描述的任何逻辑表达式。
系统字段 SY-INDEX 中包含已执行的循环次数。
可以任意嵌套 WHILE 循环,也可与其他循环结合使用。
WHILE 语句的 VARY 选项与 DO 循环的 VARYING 选项工作方式一样。允许每次执行循环时为变量 重新赋值。 必需是内存中类型相同和长度相等的一系列等距字段。第一次循环时,将 分配给 ,第二次循环时,将 分配给 ,以此类推。可以在一个 WHILE 语句中使用多个 VARY 选项。
6.5 终止循环
要终止循环过程,请使用下列关键字之一。
| 关键字 | 用途 |
|---|---|
| CONTINUE | 无条件终止循环过程 |
| CHECK | 有条件终止循环过程 |
| EXIT | 完全终止循环 |
在循环中只能使用 CONTINUE ,但在循环外还可使用关键字 CHECK 和 EXIT,分别完成不同的功能。
6.5.1 无条件终止
要立即无条件终止循环,请如下使用 CONTINUE 语句:
CONTINUE.
在 CONTINUE 语句之后,系统跳过当前语句块中所有剩余语句块,继续该语句后面的循环。
6.5.2 有条件终止
要有条件终止循环过程,请如下使用 CHECK 语句:
CHECK
如果条件是假,系统跳过当前语句块中所有剩余语句块,继续后面的循环过程。对于 ,可使用编程逻辑表达式中描述的任何逻辑表达式。
6.5.3 完全终止
要无条件完全终止循环,请如下使用 EXIT 语句:
EXIT.
EXIT 语句之后,系统立即退出循环,继续结束语句 (ENDDO 、 ENDWHILE 、 ENDSELECT) 后面的处理。在嵌套循环中,系统仅退出当前循环。