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
) 後面的處理。在巢狀迴圈中,系統僅退出當前迴圈。