ABAP 开发系列(06): ABAP 控制语句

3. 控制语句

ABAP语言的掌握到一定程序后,会处理一些复杂的内容,而SAP的数据流控制中,更有很多复杂的逻辑操作。

这时候需要一些手段来管理和组织这些项目,ABAP的分支结构,如 if,case;循环操作,如 Do,While 等。

以便程序按照所需要的逻辑处理相应的任务。

 

3.1 IF语句

先看下 IF 语句的例子:

DATA:  X  TYPE I VALUE 5.

IF X =5.
  
  WRITE :/ ‘The value of X is 5’.

ELSE.

  WRITE :/ ‘The value of X is no 5’.

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 逻辑操作符

逻辑操作符只有 ANDOR 两种。

AND: 和/并 操作

OR: 或 操作

 
 

3.2.3 操作符优先级

在条件判断时,往往关系操作符和逻辑操作符会组合在一起,这时就会存在有优先级的处理。

逻辑操作符的优先级低于关系操作符,逻辑操作符中 AND 的优先级要比OR的高,而这两者的优先级都比赋值运算的高。

比如:

a > b AND c < d  OR b > d

可以看成:

( ( a > b )  AND ( c < d)  ) OR ( b > d )

 
 

3.3  多重选择:CASE 语句

使用条件运算符和if语句可以很快编写从两个选择中进行选择的程序。

但当出现多个选择的时候,可以通过 IF … ELSEIF … ELSE… ENDIF. 语句来完成。

如若出现3种或3种以上选择时,使用 CASE… ENDCASE. 语句会更为方便:


* CASE 语句
CASE sy-ucomm.
   WHEN ‘SAVE’.
           …
   WHEN ‘SRTA’.
       …
   WHEN ‘SRTD’.
      …
   WHEN ‘GETD’.
     …
   WHEN OTHERS.
     …
END CASE.

 
 

3.4 循环操作:Do、While语句

3.4.1 Do语句

Do语句形式:

DO  X  TIMES.

END DO.

 

通过设置 TIMES 的值来指定循环次数:

J = 4.
DO J TIMES.

   WRITE :/ ‘Hello world!’.

ENDDO.

 

注意的是:使用Do语句时,切勿不能进入死循环:

DO.

   WRITE :/ ‘Hello world!’.

ENDDO.

以上程序语法可以通过,但会陷入死循环,这样会致使程序死掉。

所以在操作时,应细心慎重,避免出现这类错误,程序陷入死循环时可大可小,严重时甚至会导致整个系统崩溃。

 
 

3.4.2 While语句

WHILE循环是一个入口条件循环的语句,必须在进入循环前检查判断并返回结果。

只有条件为真(True)时,才会进入循环体内操作;

如果为假(False)则会直接跳过 ENDWHILE 后面,不会执行循环体。

 

WHILE语句格式:

WHILE <表达式>

ENDWHILE.

 
 

3.4.3  嵌套循环

DOWHILE 之间都可以嵌套循环操作。

不过,为避免性能消耗,一般超过3层的嵌套,就要考虑优化程序。

以下是两层嵌套的简单例子:

DO 2 TIMES.

  WRITE : / SY-INDEX.

  DO 3 TIMES.

    WRITE :  / ‘    ‘, SY-INDEX.

  ENDDO.

ENDDO. 

 

 

3.4.4 循环助手:CONTINUEEXIT语句

1. CONTINUE语句

一般来说,进入循环体后,在下次循环判断之前,会执行完循环体内所有程序。

CONTINUE语句可以在循环过程中,根据判断结果,忽略部分程序,直接进入下次循环,甚至终止。


DO 10 TIMES.

  IF SY-INDEX > 4.

    CONTINUE .

  ENDIF.

  WRITE :/ SY-INDEX.

ENDDO.

上面程序中,当循环到第4次之后,才会输出 sy-tabix 的值。

 
 

2. EXIT语句

EXIT语句的作用和CONTINUE语句相似,只是不同的是:

CONTINUE语句在循环过程中,可以进入下次循环

EXIT语句则直接终止循环。


WHILE  J > 3.

  IF SY-SUBRC <>0.

    EXIT.

  ENDIF.

ENDWHILE.

 
 

3.4.5 CHECK语句

CHECK语句IF语句相似,区别在于 CHECK 只能做一次判断,且没有分支。

所以 CHECK 多用于执行结果或者循环中的条件判断:

DO 10 TIMES.

  CHECK SY-INDEX <= 4. 
  WRITE : / SY-INDEX.

ENDDO.

 

 

最后,展示下通过用控制语句输出 乘法口诀表 的实例:


DATA x TYPE I.
DATA y TYPE I.
DATA z TYPE I

DATA xc(2) TYPE C .
DATA yc(2) TYPE C .
DATA zc(2) TYPE C .

x = 0 .
y = 0 .

DO 9 TIMES.
  WRITE / .
  x = x + 1 .
  y = 0 .

  DO 9 TIMES.
    y = y + 1 .
    z = x * y .

    xc = x .
    yc = y .
    zc = z .

    WRITE : xc  ,
            'X'  ,
            yc  ,
            '='  ,
            zc  ,
            ',' .
  ENDDO.

ENDDO.

 

执行结果:

abap_06_Control_Statement_Demo

 

 

 

关于 “ABAP 开发系列(06): ABAP 控制语句” 的评论

  1. cccpq 说:

    3.4.4 循环助手:CONTINUE、EXIT语句
    1. CONTINUE语句:

    DO 10 TIMES.
    IF SY-INDEX > 4.
    CONTINUE .
    ENDIF.
    WRITE :/ SY-INDEX.
    ENDDO.这个地方应该是错了,按照逻辑应该是输入1至4次的 sy-index值。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>