ABAP 开发系列(06): ABAP 控制语句3. 控制语句对 ABAP语言的掌握到一定程序后,会处理一些复杂的内容,而 SAP的数据流控制中,更有很多复杂的逻辑操作。 这时候需要一些手段来管理和组织这些项目, ABAP的分支结构,如 if,case;循环操作,如 Do,While 等。 以便程序按照所需要的逻辑处理相应的任务。
[size=1em][size=1em]01
[size=1em]02
[size=1em]03
[size=1em]04
[size=1em]05
[size=1em]06
[size=1em]07
[size=1em]08
[size=1em]09
[size=1em]10
[size=1em]11
| [size=1em][size=1em]DATA: X TYPE I VALUE 5.
[size=1em]IF X =5.
[size=1em]
[size=1em] WRITE :/ ‘The value of X is 5’.
[size=1em]ELSE.
[size=1em] WRITE :/ ‘The value of X is no 5’.
[size=1em]ENDIF.
|
在定义变量 X 时,将其默认值设为 5。 在 IF 语句中,进行判断,当 X = 5 时,为 真(True),则输出 X 的值为 5; 如若把 X 的改成其他值,判断的结果为假 (False),所以执行 ELSE 中的语句,输出 X 的值不为 5。
IF 语句被称为分支结构 或 选择语句,因为它提供了一个交汇点,可以选择两个分支中的一个。 IF 语句的通用形式: IF <表达式>. 语句1 … ELSE. 语句2 … ENDIF. 如果表达式为真 (True),则执行语句1, 如果为假 (False),则执行语句2.
如若出现两个选择以上时,可以使用嵌套的 IF语句: IF <表达式1>. 语句1 … ELSEIF <表达式2>. 语句2 … ELSE. 语句3 … ENDIF.
其中,ELSEIF 为多重选择语句,用于适应不同的分支选择。
3.2 逻辑表达式 在 IF语句中,重点在于 if 中的判断,也就是表达式的操作。 而逻辑表达式,主要由以下几类组成: 1.关系操作符 2.逻辑操作符
3.2.1 关系操作符 ABAP中的关系运算符如下所示: 描 述 | 语 法 | 等于(Is Equal to) | =, EQ | 不等于(Is not equal to) | <>, ><, NE | 大于(Greater than) | >, GT | 大于等于(Greater than or equal to) | >=, => , GE | 小于(Less than) | <, LT | 小于等于(Less than or equal to) | <=, =<, LE |
其中,字符 EQ、GT 等也可作为关系运算操作。
3.2.2 逻辑操作符 逻辑操作符只有 AND 和 OR 两种。 AND: 和/并 操作 OR: 或 操作
3.2.3 操作符优先级 在条件判断时,往往关系操作符和逻辑操作符会组合在一起,这时就会存在有优先级的处理。 逻辑操作符的优先级低于关系操作符,逻辑操作符中 AND 的优先级要比OR的高,而这两者的优先级都比赋值运算的高。 比如: a > b AND c < d OR b > d 可以看成: ( ( a > b ) AND ( c < d) ) OR ( b > d )
使用条件运算符和if语句可以很快编写从两个选择中进行选择的程序。 但当出现多个选择的时候,可以通过 IF … ELSEIF … ELSE… ENDIF. 语句来完成。 如若出现3种或3种以上选择时,使用 CASE… ENDCASE. 语句会更为方便: [size=1em][size=1em]01
[size=1em]02
[size=1em]03
[size=1em]04
[size=1em]05
[size=1em]06
[size=1em]07
[size=1em]08
[size=1em]09
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
| [size=1em][size=1em]* CASE 语句
[size=1em]CASE sy-ucomm.
[size=1em] WHEN ‘SAVE’.
[size=1em] …
[size=1em] WHEN ‘SRTA’.
[size=1em] …
[size=1em] WHEN ‘SRTD’.
[size=1em] …
[size=1em] WHEN ‘GETD’.
[size=1em] …
[size=1em] WHEN OTHERS.
[size=1em] …
[size=1em]END CASE.
|
3.4 循环操作:Do、While语句 3.4.1 Do语句 Do语句形式: …
通过设置 TIMES 的值来指定循环次数: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
| [size=1em][size=1em]J = 4.
[size=1em]DO J TIMES.
[size=1em] WRITE :/ ‘Hello world!’.
[size=1em]ENDDO.
|
注意的是:使用Do语句时,切勿不能进入死循环: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
| [size=1em][size=1em]DO.
[size=1em] WRITE :/ ‘Hello world!’.
[size=1em]ENDDO.
|
以上程序语法可以通过,但会陷入死循环,这样会致使程序死掉。 所以在操作时,应细心慎重,避免出现这类错误,程序陷入死循环时可大可小,严重时甚至会导致整个系统崩溃。
3.4.2 While语句 WHILE循环是一个入口条件循环的语句,必须在进入循环前检查判断并返回结果。 只有条件为真(True)时,才会进入循环体内操作; 如果为 假(False)则会直接跳过 ENDWHILE 后面,不会执行循环体。
WHILE语句格式: WHILE <表达式> … ENDWHILE.
3.4.3 嵌套循环 在 DO 和 WHILE 之间都可以嵌套循环操作。 不过,为避免性能消耗,一般超过3层的嵌套,就要考虑优化程序。 以下是两层嵌套的简单例子: [size=1em][size=1em]01
[size=1em]02
[size=1em]03
[size=1em]04
[size=1em]05
[size=1em]06
[size=1em]07
[size=1em]08
[size=1em]09
[size=1em]10
[size=1em]11
| [size=1em][size=1em]DO 2 TIMES.
[size=1em] WRITE : / SY-INDEX.
[size=1em] DO 3 TIMES.
[size=1em] WRITE : / ‘ ‘, SY-INDEX.
[size=1em] ENDDO.
[size=1em]ENDDO.
|
一般来说,进入循环体后,在下次循环判断之前,会执行完循环体内所有程序。 而 CONTINUE语句可以在循环过程中,根据判断结果,忽略部分程序,直接进入下次循环,甚至终止。 [size=1em][size=1em]01
[size=1em]02
[size=1em]03
[size=1em]04
[size=1em]05
[size=1em]06
[size=1em]07
[size=1em]08
[size=1em]09
[size=1em]10
[size=1em]11
| [size=1em][size=1em]DO 10 TIMES.
[size=1em] IF SY-INDEX > 4.
[size=1em] CONTINUE .
[size=1em] ENDIF.
[size=1em] WRITE :/ SY-INDEX.
[size=1em]ENDDO.
|
上面程序中,当循环到第4次之后,才会输出 sy-tabix 的值。
EXIT语句的作用和CONTINUE语句相似,只是不同的是: CONTINUE语句在循环过程中,可以进入下次循环 而EXIT语句则直接终止循环。 [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
| [size=1em][size=1em]WHILE J > 3.
[size=1em] IF SY-SUBRC <>0.
[size=1em] EXIT.
[size=1em] ENDIF.
[size=1em]ENDWHILE.
|
所以 CHECK 多用于执行结果或者循环中的条件判断: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
| [size=1em][size=1em]DO 10 TIMES.
[size=1em] CHECK SY-INDEX <= 4.
[size=1em] WRITE : / SY-INDEX.
[size=1em]ENDDO.
|
最后,展示下通过用控制语句输出 乘法口诀表 的实例: [size=1em][size=1em]01
[size=1em]02
[size=1em]03
[size=1em]04
[size=1em]05
[size=1em]06
[size=1em]07
[size=1em]08
[size=1em]09
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
[size=1em]25
[size=1em]26
[size=1em]27
[size=1em]28
[size=1em]29
[size=1em]30
[size=1em]31
[size=1em]32
[size=1em]33
| [size=1em][size=1em]DATA x TYPE I.
[size=1em]DATA y TYPE I.
[size=1em]DATA z TYPE I
[size=1em]DATA xc(2) TYPE C .
[size=1em]DATA yc(2) TYPE C .
[size=1em]DATA zc(2) TYPE C .
[size=1em]x = 0 .
[size=1em]y = 0 .
[size=1em]DO 9 TIMES.
[size=1em] WRITE / .
[size=1em] x = x + 1 .
[size=1em] y = 0 .
[size=1em] DO 9 TIMES.
[size=1em] y = y + 1 .
[size=1em] z = x * y .
[size=1em] xc = x .
[size=1em] yc = y .
[size=1em] zc = z .
[size=1em] WRITE : xc ,
[size=1em] 'X' ,
[size=1em] yc ,
[size=1em] '=' ,
[size=1em] zc ,
[size=1em] ',' .
[size=1em] ENDDO.
[size=1em]ENDDO.
|
执行结果:
ABAP Basis, SAP ABAP, SAP ABAP 开发系列\ ABAP 开发, CASE, CHECK, CONTINUE, DO, EXIT, IF, LOOP, Nested Loop, SAP, SAP ABAP, WHILE
|