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