我们一起学ABAP(05)~流程控制
转载地址:http://blog.****.net/qq_37625033/article/details/68061827
1、ABAP-流程控制
SAP的数据流程控制中,有很多复杂的逻辑操作。因此也开发有相应的管理和组织项目的语法,如:ABAP的分支结构: if、case 。循环操作:do、while等。
1.1、IF 分支结构(选择结构)
用法:当程序需要在一个二叉路口做出选择时,需要用IF语句,控制程序在某种情况下,执行某种选择。当第一个语句的结果不成立(为false)时,执行下一个语句。
IF语句实现分支有三种类型:
a、若发生了某情况该怎么处理
IF X = 5.
WRITE: / 'The value of X is 5'.
ENDIF.
b、若发生了某种情况,该怎么处理,否则有该怎么处理
IF X = 5.
WRITE: / 'The value of X is 5'.
ELSE.
WRITE: / 'The value of X is 6'.
ENDIF.
c、若发生某种情况怎么处理,否则又该怎么处理,还可以怎么处理(嵌套N个选择条件)
IF X = 5.
WRITE: / 'The value of X is 5'.
ELSEIF X = 6.
WRITE: / 'The value of X is 6'.
......
ELSE.
WRITE: / 'The value of X is 7 '.
ENDIF.
1.2、CASE 语句实现分支
用法:当程序面临多个交叉条件时,就可以使用CASE语句进行分支。
DATA: NUM TYPE I.
......对NUM赋值
CASE NUM.
WHEN 1.
WRITE: / 'The number is one'.
WHEN 2.
WRITE: / 'The number is two'.
......
WHEN OTHERS.
WRITE: / 'Others Number'.
ENDCASE.
注意:也许小伙伴们会有疑惑了,IF语句和CASE语句的功能类似啊,该怎么区分使用呢?
IF语句 最好使用 在3种以内的选择条件的程序中。超过3种 的选择条件,最好使用 CASE语句 更简洁高效。因为过多的使用IF嵌套语句,代码会显得十分臃肿,可读性差。
2、循环控制
2.1 DO语句(无条件循环)
语法:
DO [<n> TIMES] [VARYING <f> FROM <f1>] NEXT <f2>].
<statement block> "代码块
ENDDO.
注意:可以使用TIMES选项限制循环次数。<n>可以是文字或变量。如果<n>是0或负数,系统不执行该循环。系统字段
SY-INDEX 中包含已处理过的循环次数。
栗子:
DO 15 TIMES.
STR_A = SY-INDEX.
ENDDO.
栗子2:DO语句内部也可以实现多层嵌套循环,但是为了程序的可读性,建议最多不超过6层。
DO 5 TIMES.
WRITE: / ' The index is ', SY-INDEX.
DO 2 TIMES.
WRITE: / 'The Next index is', SY-INDEX.
ENDDO.
ENDDO.
2.2、WHILE语句(条件循环)
语法:
WHILE <condition> [VARY <f> FROM <f1> NEXT <f2>].
<statement block>
ENDWHILE.
注意:使用WHILE语句时,要注意避免死循环。死循环就是循环条件一直成立(true),一直运行,不会自动停止。严重的会造成内存溢出,系统崩溃!
所以,在循环达到目的后,应该使WHILE语句的条件变为假(不成立 = false)的,或使用 EXIT、STOP、REJECT语句退出循环。
栗子:
WHILE i < 10.
i = i + 1.
a = a + 10.
ENDWHILE.
2.3 LOOP ...ENDLOOP语句
用法:LOOP语句通常用来循环读取和操作内表。
LOOP AT <itab>.
WRITE: itab.
ENDLOOP.
2.4 ON CHANGE(循环内部数据管控)
用法:当循环中的数据值发生变动时,可以使用ON CHANGE表达式来触发数值变动事件。
栗子:
DO 5 TIMES.
ON CHANGE OF SY-INDEX.
WRITE: / 'The index is',SY-INDEX.
ENDON.
ENDDO.
2.6 循环终止语句
a、CONTINUE 语句(用于结束当前循环进行下一步循环)
b、EXIT 语句 (用于结束当前整个循环)
栗子:
DO 100 TIMES.
IF SY-INDEX >= 10 AND SY-INDEX <= 20.
CONTINUE. "结束当前循环,进入循环下个语句,所以不会输出
10~20 间的数据
ELSEIF SY-INDEX = 50.
EXIT. "当前循环到第50次时,结束整个循环,输出的最大数据
49
ENDIF.
ENDDO.
c、CHECK语句
用法:CHECK语句后面会跟一个表达式,表达式值为假(false)时,CHECK语句被**,会退出循环(LOOP)或处理程序(statementblock).
1、当CHECK语句用在循环中时,被**后会退出当前循环,进行下一次循环,类似于CONTINUE的作用;
2、当CHECK语句出现在循环之外,被**后退出的是当前执行的 Processing Block(程序块),像方法、事件等代码块。
栗子:
DO 10 TIMES.
CHECK SY-INDEX <= 4.
WRITE: / SY-INDEX.
ENDDO.
3、比较运算符
表达中比较常用的比较运算符:
4、用循环控制语句,输出乘法口诀表
栗子:
DATA: X TYPE I,
Y TYPE I,
Z TYPE I.
DATA: XS(2) TYPE C,
YS(2) TYPE C,
ZS(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.
XS = X.
YS = Y.
ZS = Z.
WRITE : XS, 'X' , YS , ' = ' , ZS , ' , ' .
ENDDO.
ENDDO.