SAP的ABAP4語言中文培訓(xùn)教材第一部分第七章 控制 ABAP4 程序流.doc_第1頁
SAP的ABAP4語言中文培訓(xùn)教材第一部分第七章 控制 ABAP4 程序流.doc_第2頁
SAP的ABAP4語言中文培訓(xùn)教材第一部分第七章 控制 ABAP4 程序流.doc_第3頁
SAP的ABAP4語言中文培訓(xùn)教材第一部分第七章 控制 ABAP4 程序流.doc_第4頁
SAP的ABAP4語言中文培訓(xùn)教材第一部分第七章 控制 ABAP4 程序流.doc_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

7: 1 1控制 ABAP/4 程序流概覽內(nèi)容ABAP/4中 流控制的概 念編程邏輯表 達式比較所有的 字段類型比較字符串 和數(shù)字串二進制位結(jié) 構(gòu)的比較檢查字段是 否屬于某一 范圍檢查初始值檢查選擇條 件組合幾個邏 輯表達式編程分支和 循環(huán)使用 IF 的條件分支使用 CASE 的條件分支使用 DO 的無條件循 環(huán)使用 WHILE 的條件循環(huán)終止循環(huán)要根據(jù)一定 條件執(zhí)行程 序組件,或 要將重復(fù)語 句序列組合 在循環(huán)中, 可以使用 ABAP/4 提供的用于 控制程序流 的標(biāo)準(zhǔn)關(guān)鍵 字。ABAP/4 也包含重要 的附加特征 。ABAP/4 程序流可以 內(nèi)部控制和 外部控制。 ABAP/4 程序流的內(nèi) 部控制和外 部控制之間 的差別在ABAP/4中 流控制的概 念 (頁 8) 中 解釋。本節(jié)主要討 論內(nèi)部流控 制。為此, 可使用其他 編程語言( 例如,C、 FORTRAN、 PASCAL 等等)中熟 悉的標(biāo)準(zhǔn)控 制關(guān)鍵字。下列主題描 述1ABAP/4中 流控制的概 念與其他高級 編程語言一 樣(如,C、 FORTRAN 和 PASCAL 等等),ABAP/4 提供也用于 控制程序流 的標(biāo)準(zhǔn)關(guān)鍵 字。這些關(guān) 鍵字用于_ 分支 (IF、CASE)_ 循環(huán) (DO、WHILE)然而,ABAP/4 與其他編程 語言不同之 處在于其具 有程序流的 內(nèi)部控制和 外部控制。_ 內(nèi)部控制 由上述標(biāo)準(zhǔn) 關(guān)鍵字引導(dǎo) 。在程序代 碼中對其進 行定義。_ 外部控制 由事件引導(dǎo) 。事件由 ABAP/4 程序(系統(tǒng) 程序或用戶 程序)或者 交互式用戶 輸入(例如 ,使用鼠標(biāo) 在屏幕上單 擊)生成。 系統(tǒng)不必按 ABAP/4 程序中列出 的順序?qū)M 行語句處理 。這使得 ABAP/4 成為事件驅(qū) 動編程語言 ,類似于 Microsoft 的Visual Basic。時間事件和 ABAP/4 程序的連接 由事件關(guān)鍵 字提供。ABAP/4 程序中的每 個語句都屬 于特別的事 件關(guān)鍵字。 即使在程序 中沒有指定 任何事件關(guān) 鍵字,所有 語句都自動 歸屬于標(biāo)準(zhǔn) 事件關(guān)鍵字 (START-OF-SELECTION) ,與程序中 事件語句的 次序完全不 相干。所有屬于某 一特定事件 關(guān)鍵字的語 句形成一個 處理塊。處 理塊是一個 在事件發(fā)生 時執(zhí)行的模 塊。處理塊 內(nèi)的程序流 依賴于內(nèi)部 控制。系統(tǒng) 按順序處理 語句,或按 照前面提到 的標(biāo)準(zhǔn)關(guān)鍵 字定義的順 序處理。ABAP/4 程序常規(guī)結(jié) 構(gòu)如下:假設(shè)當(dāng)用戶 選擇一行后 ,生成列表 且提供一些 細分設(shè)備的 報表程序必 須作出反應(yīng) (詳細信息 ,參見 交互列表)。需要為 該事件處理 的代碼必須 插入事件關(guān) 鍵字 AT LINE-SELECTION 之后。AT LINE-SELECTION. MOVE X TO FLAG. .無論何時用 戶通過單擊 鼠標(biāo)或按 F2 鍵在列表中 選擇一個項 目時,AT LINE-SELECTION 和下一個事 件關(guān)鍵字之 間的所有語 句將被處理關(guān)于外部控 制的詳細信 息,如事件 及其如何與 ABAP/4 程序相互作 用的信息, 參見 C通過事件控制 ABAP/4 程序流。該節(jié)說明如 何使用外部 控制控制處 理塊內(nèi)的程 序流。要控制 ABAP/4 程序中的內(nèi) 部流,請遵 循結(jié)構(gòu)化編 程原則并將 程序模塊劃 分為單個邏 輯相關(guān)語句 塊(這些組 成控制結(jié)構(gòu) )。其中的 每個語句塊 都執(zhí)行主任 務(wù)的一部分 。要使程序易 于閱讀,應(yīng) 該縮排控制 結(jié)構(gòu)中的語 句塊。出于 布局需要, 可以使用 ABAP/4 編輯器功能 “編輯 - 插入語句.” 和“程序 - 整齊打印程 序”(詳細 信息,參見 ABAP/4 程序布局 (頁 26)??梢杂?IF、CASE、 DO 和 WHILE 之類的關(guān)鍵 字控制處理 塊中不同語 句之間的程 序流。這些 語句允許編 制條件和無 條件的分支 和循環(huán)。條 件使用邏輯 表達式,可 以是真,也 可以為假。2編程邏輯表 達式使用條件控 制程序中的 內(nèi)部流。要 用公式指定 條件,請使 用比較數(shù)據(jù) 字段的邏輯 表達式,如 下所示:語法 . .該表達式比 較兩個字段 ??赡転檎?,也可能為 假。在帶關(guān) 鍵字 IF、 CHECK 和 WHILE 的條件語句 中使用邏輯 表達式。根據(jù)操作數(shù) 和 的數(shù)據(jù)類型 ,可以使用 不同的邏輯 運算符。允 許進行:除上述比較 之外,還可 以執(zhí)行測試 以檢查數(shù)據(jù) 字段是否完 全滿足一定 條件。可以 使用這些測 試:另外,可以 將幾個邏輯 表達式組合 為一個簡單 邏輯表達式 。3比較所有的 字段類型要比較所有 的字段類型 ,可以在邏 輯表達式中 使用下列運 算符:含 義EQ等于 =等于NE不 等于不 等于不 等于LT小 于小于LE小 于等于大于GE大 于等于=大 于等于操作數(shù)可以 是數(shù)據(jù)庫字 段、內(nèi)部字 段、文字或 常數(shù)。除基本字段 外,還可以 將結(jié)構(gòu)數(shù)據(jù) 類型和上表 中的運算符 結(jié)合起來作 為操作數(shù)。 字段串逐個 組件進行比 較,嵌套的 結(jié)構(gòu)分為基 本的字段。 關(guān)于比較內(nèi) 表的詳細信 息,參見 比較內(nèi)表 (頁 Error! Not a valid link.) 。如果有意義 ,可以對不 同數(shù)據(jù)類型 的字段進行 比較。如果 字段可轉(zhuǎn)換 ,就可以進 行比較。在 比較之前, 系統(tǒng)將按照 下列層次規(guī) 則執(zhí)行自動 類型轉(zhuǎn)換( 參見 鍵入轉(zhuǎn)換 (頁 636) ):1.如果 操作數(shù)之一 是浮點數(shù)( 類型 F),則系 統(tǒng)將其它操 作數(shù)轉(zhuǎn)換為 類型 F。2.如果 操作數(shù)之一 是壓縮字段 (類型 P),則系 統(tǒng)將其它操 作數(shù)轉(zhuǎn)換為 類型 P。3.如果 操作數(shù)之一 是日期字段 (類型 D)或時間 字段(類型 T),則系 統(tǒng)將其它操 作數(shù)轉(zhuǎn)換為 類型 D 或 T。不支持 日期和時間 字段之間的 比較,這會 導(dǎo)致程序中 斷。4.如果 操作數(shù)之一 是字符字段 (類型 C)且其它 操作數(shù)是十 六進制字段 (類型 X),則系 統(tǒng)將類型 X 的操作數(shù)轉(zhuǎn) 換為類型 C。5.如果 操作數(shù)之一 是字符字段 (類型 C),其它 操作數(shù)為數(shù) 字字段(類 型 N),則系 統(tǒng)將這兩種 操作數(shù)都轉(zhuǎn) 換為類型 P。DATA: F TYPE F VALUE 100.00, P TYPE P VALUE 50.00 DECIMALS 2, I TYPE I VALUE 30.00.WRITE The following logical expressions are true:.IF F = P . WRITE: / F,=,P.ELSE. WRITE: / F,= 50.00 30 NE 50.00這里,在 IF 語句中使用 兩個邏輯表 達式。如果 邏輯表達式 為真,則屏 幕上顯示出 來。如果邏 輯表達式為 假,則將相 反表達式顯 示在屏幕上 。4比較字符串 和數(shù)字串要比較字符 串(類型 C)和數(shù)字 文本(類型 N),可以 在邏輯表達 式中使用下 列運算符。含 義CO僅包 含CN不僅 包含CA包 含任何NA不 包含任何CS包 含字符串NS不 包含字符串 CP包含模 式NP不包 含模式因為除類型 N 和 C 外,系統(tǒng)不 能執(zhí)行任何 其它類型轉(zhuǎn) 換,所以, 在進行包含 這些運算之 一的比較時 ,操作數(shù)應(yīng) 該是類型 N 或 C。運算符的功 能如下:CO (僅包含)如果 僅包含 中的字符, 則邏輯表達 式 CO 為真。該比 較區(qū)分大小 寫,并包括 尾部空格。 如果比較結(jié) 果為真,則 系統(tǒng)字段 SY-FDPOS 包括 的長度。如 果為假,則 SY-FDPOS 包含 中第一個未 在 內(nèi)出現(xiàn)的字 符的偏移量 。CN (不僅包含 )如果 還包含 之外的其他 字符,則邏 輯表達式 CN 為真。該比 較區(qū)分大小 寫,并包括 尾部空格。 如果比較結(jié) 果為真,則 系統(tǒng)字段 SY-FDPOS 包含 中第一個未 同時在 中出現(xiàn)的字 符的偏移量 。如果為假 ,SY-FDPOS 包含 的長度。CA (包含任何 )如果 至少包含 的一個字符 ,則邏輯表 達式 CA 為真。該比 較區(qū)分大小 寫。如果比 較結(jié)果為真 ,則系統(tǒng)字 段 SY-FDPOS 包含 中第一個也 在 中出現(xiàn)的字 符的偏移量 。如果為假 ,SY-FDPOS 包含 的長度。NA (不包含任 何)如果 不包含 的任何字符 ,則邏輯表 達式 NA 為真。該比 較區(qū)分大小 寫。如果比 較結(jié)果為真 ,則系統(tǒng)字 段 SY-FDPOS 包含 的 長度。如果 為假,則 SY-FDPOS 包含 中在 內(nèi)出現(xiàn)的第 一個字符的 偏移量。CS (包含字符 串)如果 包含字符串 , 則邏輯表達 式 CS 為真。忽略 尾部空格并 且比較不區(qū) 分大小寫。 如果比較結(jié) 果為真,則 系統(tǒng)字段 SY-FDPOS 包含 在 中的偏移量 。如果為假 ,SY-FDPOS 包含 的長度。NS (不包含字 符串)如果 不包含字符 串 , 則邏輯表達 式 NS 為真。忽略 尾部空格且 比較不區(qū)分 大小寫。如 果比較為真 ,系統(tǒng)字段 SY-FDPOS 包含 的長度。如 果為假,系 統(tǒng)字段 SY-FDPOS 包含 在 中的偏移量 。CP (包含模式 )如果 包含模式 , 則邏輯表達 式 CP 為真。如果 屬于類型 C,則可以 在 中使用下列 通配符:_ * 用于任何字 符串_ + 用于任何單 個字符忽略尾部空 格且比較不 區(qū)分大小寫 。如果比較 結(jié)果為真, 系統(tǒng)字段 SY-FDPOS 包含 在 中的偏移量 。如果為假 ,SY-FDPOS 包含 的長度。如果要對 中的特殊字 符進行比較 ,請將換碼 字符 # 放到其前面 ??梢允褂?換碼字符 # 指定_ 大小寫字 符_ 通配符 *(輸 入 #*)_ 通配符 + (輸入 #+)_ 換碼符號 本身 (輸入 #)_ 字符串結(jié) 尾的空格 (輸入 #_)NP (不包含模 式)如果 不包含模式 , 則邏輯表達 式 NP 為真。在中 ,可以使用 與 CP 相同的通配 符和換碼字 符。忽略尾部空 格且比較不 區(qū)分大小寫 。如果比較 結(jié)果為真, 則系統(tǒng)字段 SY-FDPOS 包含 . 的長度,如 果為假,SY-FDPOS 包含 在 中的偏移量 。DATA: F1(5) TYPE C VALUE , F2(5) TYPE C VALUE .IF F1 F2. WRITE: / Comparison true, SY-FDPOS=, SY-FDPOS.ELSE. WRITE: / Comparison false, SY-FDPOS=, SY-FDPOS.ENDIF.下表列出該 程序的執(zhí)行 結(jié)果,取決 于所用的運 算符和 F1 / F2 字段。ResultSY-FDPOSBD COABCD 真5BD COABCDE假 2ABC12CNABCD 真3ABABCCNABCD 假5ABcdeCABd 真1ABcdeCAbD 假5ABAB NAAB 假0ababaNAAB 真5ABcdeCSbC 真1ABcdeCSce 假5ABcdeNSbC 假1ABcdeNSce 真5ABcdeCP*b*真 1ABcdeCP*#b*假 5ABcdeNP*b*假 1ABcdeNP*#b*真 56二進制位結(jié) 構(gòu)的比較要將邏輯表 達式初始操 作數(shù)第一字 節(jié)的二進制 位結(jié)構(gòu)與第 二操作數(shù)的 進行比較, 請使用下列 操作符。含 義O二進制 位是 1Z二進制 位是 0M混合二 進制位第二 操作數(shù)的長 度應(yīng)為一個 字節(jié)。沒有必要對 第二操作數(shù) 使用長度為 1 的十六進制 字段(類型 X),但卻 較方便,因 為其長度為 一個字節(jié)且 數(shù)字值直接 與二進制位 結(jié)構(gòu)相關(guān)。操作符功能 如下:O (二進制位 是 1)如果 中二進制位 是 1 的位置,在 中是 1,則邏輯 表達式 O 為真。Z (二進制位 是0)如果 中二進制位 是 1 的位置,在 中是 0,則邏輯 表達式 Z 為真。M (混合二進 制位)如果從 中二進制位 是 1 的位置起, 中至少一個 是 1,一個是 0,則邏輯 表達式 M 為真。DATA: C VALUE C, HEXDEC TYPE X, I TYPE I.HEXDEC = 0.DO 256 TIMES. I = HEXDEC. IF C O HEXDEC. WRITE: / HEXDEC, I. ENDIF. HEXDEC = HEXDEC + 1.ENDDO.產(chǎn)生下列輸 出:00 001 102 203 340 6441 6542 6643 67這里,使用 運算符 O 將字符C 的二進制位 結(jié)構(gòu)與所有 0與 FF(10 進制為 255)之 間的 16 進制數(shù)進行 比較。HEXDEC 的10 進制值 I ,在HEXDEC 分配到I 期間,通過 使用自動類 型轉(zhuǎn)換確定 。如果比較 結(jié)果為真, 則在屏幕上 顯式 16 進制數(shù)及其 10 進制值。下 表列出這些 數(shù)的二進制 位結(jié)構(gòu)。16 進制10 進制二進制 位結(jié)構(gòu)00000000000011000000010220000001003300000011406401000000416501000001426601000010436701000011字 符C的 二進制位結(jié) 構(gòu)由其 ASCII 碼 67 為當(dāng)前硬件 平臺進行定 義。與用戶 看到的一樣 ,列表輸出 中出現(xiàn)的數(shù) 字,填寫 1 的二進制位 位置與 67 的二進制位 結(jié)構(gòu)一樣。8檢查字段是 否屬于某一 范圍要檢查值是 否屬于特定 范圍,請使 用下列帶有 BETWEEN 參數(shù)的邏輯 表達式:語法. BETWEEN AND .如果 在 和 之間的范圍 內(nèi)發(fā)生,則 表達式為真 。它是下列 邏輯表達式 的短格式:IF GE AND LE .DATA: NUMBER TYPE I, FLAG.NUMBER = .IF NUMBER BETWEEN 3 AND 7. FLAG = X.ELSE. FLAG = .ENDIF.這里,如果 NUMBER 的內(nèi)容在 3 和 7 之間出現(xiàn), 字段 FLAG 設(shè)置為“X” 。9檢查初始值要檢查字段 是否設(shè)置為 初始值,請 如下使用帶 有 IS INITIAL 參數(shù)的邏輯 表達式。語法. IS INITIAL .如果 包含本身類 型的初始值 ,則表達式 為真。通常 情況下,任 何字段,基 本的或結(jié)構(gòu) 化的(字符 串和內(nèi)表) ,在 CLEAR 語句執(zhí)行后 ,都包含其 初始值(參 見 重置缺省值 (頁 610) )。DATA FLAG VALUE X. IF FLAG IS INITIAL. WRITE / Flag is initial.ELSE. WRITE / Flag is not initial.ENDIF.CLEAR FLAG.IF FLAG IS INITIAL. WRITE / Flag is initial.ELSE. WRITE / Flag is not initial.ENDIF.這產(chǎn)生如下 輸出:Flag is not initialFlag is initial.這里,DATA 語句之后, 字符串 FLAG 不包含初始 值,因為用 VALUE 參數(shù)設(shè)置為 X。執(zhí) 行 CLEAR 語句之后, 將其重置為 初始值。10檢查選擇條 件要檢查字段 內(nèi)容是否與 選擇表中的 選擇條件匹 配,可以如 下使用帶有 IN 參數(shù)的邏輯 表達式:語法. IN .如果字段 內(nèi)容的符合 選擇表 中的條件, 則表達式為 真。關(guān)于選擇條 件的詳細信 息,參見 使用選擇標(biāo)準(zhǔn)。關(guān)于邏輯表 達式中檢查 選擇條件的 詳細信息, 包括示例, 參見 使用邏輯表達式中的選擇表。10組合幾個邏 輯表達式通過使用邏 輯連接運算 符 AND、OR 和 NOT,可 以將幾個邏 輯表達式組 合為單個表 達式: _ 要將幾個 邏輯表達式 組合為單個 表達式,且 該表達式僅 當(dāng)所有組件 表達式為真 時才為真, 則表達式之 間要用 AND 連接。_ 要將幾個 邏輯表達式 組合為單個 表達式,且 只要其中一 個組件表達 式為真時, 該表達式即 為真,則表 達式之間要 用 OR 連接。_ 要轉(zhuǎn)化邏 輯表達式的 結(jié)果,請在 其前面指定 NOT。NOT 優(yōu)先于 AND,AND 優(yōu)先于 OR。但是 ,可以用任 何括弧組合 指定處理順 序。由于 ABAP/4 將括弧解釋 為單字,前 面或后面必 須至少有一 個空格。ABAP/4 從左到右處 理邏輯表達 式。如果確 定組件表達 式之一是真 或假,就不 再執(zhí)行該組 件中其余的 比較或檢查 。這意味著 采取這種方 法組織邏輯 表達式可以 提高性能, 就是將經(jīng)常 為假的比較 放置在 AND 鏈的開頭, 而將費時的 比較,如字 符串查找放 等到最后。DATA: F TYPE F VALUE 100.00, N(3) TYPE N VALUE 123, C(3) TYPE C VALUE 456.WRITE The following logical expression is true:.IF ( C LT N ) AND ( N GT F ). WRITE: / (,C,lt,N,) AND (,N,gt,F,).ELSE. WRITE: / (,C,ge,N,) OR (,N,le,F,).ENDIF.這產(chǎn)生如下 輸出:下列邏輯表達式為真: ( 456 ge 123 ) OR ( 123 le 1.000000000000000E+02 )在本例中, 在 IF 語句中使用 邏輯表達式 。如果邏輯 表達式為真 ,則將其在 屏幕上顯示 出來。如果 為假,則屏 幕上出現(xiàn)相 反的表達式 。10編程分支和 循環(huán)可以在程序 中定義條件 和無條件分 支和循環(huán)。 為此,ABAP/4 提供了幾個 在下列主題 中描述的語 句。分支循環(huán)11使用 IF 的條件分支IF 語句允許依 據(jù)條件將程 序流轉(zhuǎn)到特 定的語句塊 中。該語句 塊包括 IF 語句及其后 面的 ELSEIF、 ELSE 或 ENDIF 之間的所有 命令。語法IF . ELSEIF . ELSEIF . .ELSE. ENDIF.如果第一個 條件是真, 系統(tǒng)將執(zhí)行 所有語句直 到第一個語 句塊結(jié)束, 然后繼續(xù)處 理 ENDIF 語句之后的 程序。要采 用選擇性條 件,可以使 用 ELSEIF 語句。如果 第一個條件 是假,系統(tǒng) 使用與 IF 語句一樣的 方式處理后 面的 ELSEIF 語句。如果 IF 或 ELSEIF 條件都為假 ,則執(zhí)行 ELSE 開始的語句 塊。最后的 語句塊必須 用 ENDIF 結(jié)束。要用公式表 達 IF 和 ELSEIF 語句中的條 件,可以使 用任何 編程邏輯表 達式 (頁 8) 描述的邏輯 表達式。ABAP/4 允許無限地 嵌套 IF - ENDIF 語句塊,但 是必須在相 同的處理塊 中終止。換 句話說,就 是 IF - ENDIF 塊不能包含 事件關(guān)鍵字 。DATA: TEXT1(30) VALUE This is the first text, TEXT2(30) VALUE This is the second text, TEXT3(30) VALUE This is the third text, STRING(5) VALUE eco.IF TEXT1 CS STRING. WRITE / Condition 1 is fulfilled.ELSEIF TEXT2 CS STRING. WRITE / Condition 2 is fulfilled.ELSEIF TEXT3 CS STRING. WRITE / Condition 3 is fulfilled.ELSE. WRITE / No condition is fulfilled.ENDIF.產(chǎn)生如下輸 出:Condition 2 is fulfilled.這里,第二 個邏輯表達 式 TEXT2 CS STRING 是真,因為 字符串“eco” 存在于 TEXT2 中。12使用 CASE 的條件分支要根據(jù)特殊 數(shù)據(jù)字段的 內(nèi)容執(zhí)行不 同的語句塊 ,可以如下 使用 CASE 語句:語法CASE . WHEN . WHEN . WHEN . WHEN . . WHEN OTHERS. ENDCASE.系統(tǒng)執(zhí)行 WHEN 語句之后的 語句塊,如 果 內(nèi)容等于 的內(nèi)容,且 繼續(xù)處理 ENDCASE 語句后面的 語句。如果 的內(nèi)容不等 于 的內(nèi)容,則 執(zhí)行選項 WHEN OTHERS 后面的語句 塊。最后的 語句塊必須 用 ENDCASE 結(jié)束。使用 CASE 的條件分支 是帶 IF 的類似處理 的短格式:IF = . ELSEIF = . ELSEIF = . ELSEIF = . .ELSE. ENDIF.在 ABAP/4 中,可以嵌 套 CASE - ENDCASE 塊,且可以 與 IF - ENDIF 結(jié)合使用, 但必須在同 一處理塊中 終止。DATA: TEXT1 VALUE X, TEXT2 VALUE Y, TEXT3 VALUE Z, STRING VALUE A.CASE STRING. WHEN TEXT1. WRITE: / String is, TEXT1. WHEN TEXT2. WRITE: / String is, TEXT2. WHEN TEXT3. WRITE: / String is, TEXT3. WHEN OTHERS. WRITE: / String is not, TEXT1, TEXT2, TEXT3.ENDCASE.產(chǎn)生如下輸 出:String is not X Y Z這里,執(zhí)行 WHEN OTHERS 后面的語句 塊,因為 STRING 的內(nèi)容“A” 不等于“X” 、“Y”或 “Z”,。13使用 DO 的無條件循 環(huán)如果想要多 次執(zhí)行語句 塊,則可以 如下使用 DO 語句編程循 環(huán):語法DO TIMES VARYING FROM NEXT . ENDDO.在發(fā)現(xiàn) EXIT、 STOP 或 REJECT 語句之前, 系統(tǒng)繼續(xù)執(zhí) 行由 DO 引導(dǎo)、ENDDO 結(jié)束的語句 塊(參見 終止循環(huán) (頁 8) )。可以使用 TIMES 選項限制循 環(huán)次數(shù)。 可以是文字 或變量。如 果 是 0 或負數(shù),系 統(tǒng)不執(zhí)行該 循環(huán)。系統(tǒng)字段 SY-INDEX 中包含已處 理過的循環(huán) 次數(shù)。使用 DO 語句時要避 免死循環(huán)。 如果不使用 TIMES 選項,則在 語句塊中至 少應(yīng)包含一 個 EXIT、 STOP 或 REJECT 語句,以便 系統(tǒng)能夠退 出循環(huán)。本例顯示 DO 循環(huán)的基本 格式。DO.WRITE SY-INDEX. IF SY-INDEX = 3. EXIT. ENDIF.ENDDO.產(chǎn)生如下輸 出: 1 2 3這里,處理 3 次循環(huán),然 后在 EXIT 語句后退出 循環(huán)。可以任意嵌 套 DO 循環(huán),也可 以與其他循 環(huán)組合使用 。本例顯示 2 個嵌套循環(huán) ,都使用 TIMES 選項。DO 2 TIMES. WRITE SY-INDEX. SKIP. DO 3 TIMES. WRITE SY-INDEX. ENDDO. SKIP.ENDDO.產(chǎn)生如下輸 出: 1 1 2 3 2 1 2 3外部循環(huán)執(zhí) 行 2 次。每次執(zhí) 行外部循環(huán) 時,內(nèi)部循 環(huán)都執(zhí)行 3 次。注意系 統(tǒng)字段 SY-INDEX 記錄每個循 環(huán)各自的循 環(huán)次數(shù)。可以使用 VARYING 選項在每次 循環(huán)中給變 量 重新賦值。 、 、 、 . 必需是內(nèi)存 中類型相同 和長度相等 的一系列等 距字段。第 一次循環(huán)中 ,將 分配給 ,第 二次循環(huán)中 ,將 分配給 ,以 此類推???以在一個 DO 語句中使用 多個 VARYING 選項。如果在 DO 循環(huán)中改變 控制變量 ,則 系統(tǒng)將自動 改變相應(yīng)的 字段 。應(yīng)保證循環(huán) 次數(shù)不超過 涉及到的變 量 、 、 的數(shù)量。該示例說明 如何在 DO 循環(huán)中使用 VARYING 選項。DATA: BEGIN OF TEXT, WORD1(4) VALUE This, WORD2(4) VALUE is, WORD3(4) VALUE a, WORD4(4) VALUE loop, END OF TEXT.DATA: STRING1(4), STRING2(4).DO 4 TIMES VARYING STRING1 FROM TEXT-WORD1 NEXT TEXT-WORD2. WRITE STRING1. IF STRING1 = is. STRING1 = was. ENDIF.ENDDO.SKIP.DO 2 TIMES VARYING STRING1 FROM TEXT-WORD1 NEXT TEXT-WORD3 VARYING STRING2 FROM TEXT-WORD2 NEXT TEXT-WORD4. WRITE: STRING1, STRING2.ENDDO.這產(chǎn)生如下 輸出:This is a loopThis was a loop字段串 TEXT 代表內(nèi)存中 四個等距字 段序列。每 次執(zhí)行第一 個 DO 循環(huán)時,都 依次將其組 件分配到 STRING1 中。如果 STRING1 包含“is” ,則將其改 變?yōu)椤皐as” ,而且自動 將 TEXT-WORD2 改變?yōu)椤皐as” 。每次執(zhí)行 第二個 DO 循環(huán)時,將 TEXT 的組件傳遞 給STRING1和 STRING2。15使用 WHILE 的條件循環(huán)如果只要條 件為真,就 不止一次執(zhí) 行語句,可 以如下使用 WHILE 語句編程:語法WHILE VARY FROM NEXT . ENDWHILE.只要 是真,或系 統(tǒng)發(fā)現(xiàn) EXIT、 STOP 或 REJECT 語句,系統(tǒng) 將繼續(xù)執(zhí)行 由 WHILE 語句引導(dǎo)、 ENDWHILE 結(jié)束的語句 塊(參見 終止循環(huán) (頁 8) )。對于 , 可以使用 編程邏輯表 達式 (頁 8) 中描述的任 何邏輯表達 式。系統(tǒng)字段 SY-INDEX 中包含已執(zhí) 行的循環(huán)次 數(shù)??梢匀我馇?套 WHILE 循環(huán),也可 與其他循環(huán) 結(jié)合使用。WHILE 語句的 VARY 選項與 DO 循環(huán)的 VARYING 選項工作方 式一樣(參 見使用 DO 的無條件循 環(huán) (頁 8) )。允許 每次執(zhí)行循 環(huán)時為變量 重新賦值。 、 、 、 . 必需是內(nèi)存 中類型相同 和長度相等 的一系列等 距字段。第 一次循環(huán)時 ,將 分配給 ,第 二次循環(huán)時 ,將 分配給 ,以 此類推???以在一個 WHILE 語句中使用 多個 VARY 選項。使用 WHILE 語句要避免 死循環(huán)。請 記住,在一 段時間之后 ,WHILE 語句條件應(yīng) 變?yōu)榧?,?者系統(tǒng)能夠 找到 EXIT、 STOP 或 REJECT 語句退出循 環(huán)。DATA: LENGTH TYPE I VALUE 0, STRL TYPE I VALUE 0, STRING(30) TYPE C VALUE Test String.STRL = STRLEN( STRING ).WHILE STRING NE SPACE. WRITE STRING(1). LENGTH = SY-INDEX. SHIFT STRING.ENDWHILE.WRITE: / STRLEN: , STRL.WRITE: / Length of string:, LENGTH.產(chǎn)生如下輸 出:T e s t S t r i n gSTRLEN: 11Length of string: 11此處使用 WHILE 循環(huán)確定字 符串的長度 。做法是: 每次執(zhí)行循 環(huán)時,都將 字符串左移 一位,直到 僅包含空格 。選擇本例 主要是為了 說明 WHILE 語句。但是 ,確定字符 串長度更簡 便和有效的 辦法是通過 使用內(nèi)置的 函數(shù) STRLEN, 這在示例中 也可看出。16終止循環(huán)要終止循環(huán) 過程,請使 用下列關(guān)鍵 字之一。關(guān)鍵 字用途無條 件終 止 循 環(huán)過 程 (頁 8) CONTINUE 有條 件終 止 循 環(huán)過 程 (頁 8) CHECK 完全 終止 循 環(huán) (頁 8) EXIT 在循環(huán)中只 能使用 CONTINUE, 但在循環(huán)外 還可使用關(guān) 鍵字 CHECK 和 EXIT, 分別完成不 同的功能。 例如,可以 終止子程序 或整個程序 塊。關(guān)于 CHECK 和 EXIT 語句及其如 何在循環(huán)外 使用的詳細 信息,參見終止子系統(tǒng) 和 終止處理塊 。以下主題說 明如何在 DO 和WHILE 循環(huán)以及下 列循環(huán)中使 用 CONTINUE、 CHECK 和 EXIT:_ LOOP - ENDLOOP 循環(huán),用于 處理內(nèi)表( 參見 循環(huán)處理 (頁 Error! Not a valid link.) )。_ SELECT - ENDSELECT 循環(huán),用于 從數(shù)據(jù)表中 讀取數(shù)據(jù)( 參見 從幾行選擇所有數(shù)據(jù))。17無條件終止 循環(huán)過程要立即無條 件終止循環(huán) ,請如下使 用 CONTINUE 語句:語法CONTINUE.在CONTINUE 語句之后, 系統(tǒng)跳過當(dāng) 前語句塊中 所有剩余語 句塊,繼續(xù) 該語句后面 的循環(huán)。DO 4 TIMES. IF SY-INDEX = 2. CONTINUE. ENDIF. WRITE SY-INDEX.ENDDO.產(chǎn)生如下輸 出: 1 3 4此處系統(tǒng)不 處理 WRITE 語句就終止 第二次循環(huán) 。17有條件終止 循環(huán)過程要有條件終 止循環(huán)過程 ,請如下使 用 CHECK 語句:語法CHECK .如果條件是 假,系統(tǒng)跳 過當(dāng)前語句 塊中所有剩 余語句塊, 繼續(xù)后面的 循環(huán)過程。 對于, 可使用 編程邏輯表 達式 (頁 8) 中描述的任 何邏輯表達 式。DO 4 TIMES. CHECK SY-INDEX BETWEEN 2 and 3. WRITE SY-INDEX.ENDDO.產(chǎn)生如下輸 出: 2 3此處系統(tǒng)不 處理 WRITE 語句就終止 第一個和第 四個循環(huán), 因為 SY-INDEX 不在 2 和 3 之間。18完全終止循 環(huán)要無條件完 全終止循環(huán) ,請如下使 用 EXIT 語句:語法EXIT.EXIT 語句之后, 系統(tǒng)立即退 出循環(huán),繼 續(xù)結(jié)束語句 (ENDDO、 ENDWHILE、 ENDSELECT)后 面的處理。 在嵌套循環(huán) 中,系統(tǒng)僅 退出當(dāng)前循 環(huán)。DO 4 TIMES. IF SY-INDEX = 3. EXIT. ENDIF.WRITE SY-INDEX.ENDDO.產(chǎn)生如下輸 出: 1 2此處系統(tǒng)不 處理 WRITE 語句或第四 個循環(huán)過程 ,就在第三 個循環(huán)過程 中完全終止 循環(huán)。 8: 概覽內(nèi)容ABAP/4中 流控制的概 念編程邏輯表 達式比較所有的 字段類型比較字符串 和數(shù)字串二進制位結(jié) 構(gòu)的比較檢查字段是 否屬于某一 范圍檢查初始值檢查選擇條 件組合幾個邏 輯表達式編程分支和 循環(huán)使用 IF 的條件分支使用 CASE 的條件分支使用 DO 的無條件循 環(huán)使用 WHILE 的條件循環(huán)終止循環(huán)要根據(jù)一定 條件執(zhí)行程 序組件,或 要將重復(fù)語 句序列組合 在循環(huán)中, 可以使用 ABAP/4 提供的用于 控制程序流 的標(biāo)準(zhǔn)關(guān)鍵 字。ABAP/4 也包含重要 的附加特征 。ABAP/4 程序流可以 內(nèi)部控制和 外部控制。 ABAP/4 程序流的內(nèi) 部控制和外 部控制之間 的差別在ABAP/4中 流控制的概 念 (頁 8) 中 解釋。本節(jié)主要討 論內(nèi)部流控 制。為此, 可使用其他 編程語言( 例如,C、 FORTRAN、 PASCAL 等等)中熟 悉的標(biāo)準(zhǔn)控 制關(guān)鍵字。下列主題描 述19ABAP/4中 流控制的概 念與其他高級 編程語言一 樣(如,C、 FORTRAN 和 PASCAL 等等),ABAP/4 提供也用于 控制程序流 的標(biāo)準(zhǔn)關(guān)鍵 字。這些關(guān) 鍵字用于_ 分支 (IF、CASE)_ 循環(huán) (DO、WHILE)然而,ABAP/4 與其他編程 語言不同之 處在于其具 有程序流的 內(nèi)部控制和 外部控制。_ 內(nèi)部控制 由上述標(biāo)準(zhǔn) 關(guān)鍵字引導(dǎo) 。在程序代 碼中對其進 行定義。_ 外部控制 由事件引導(dǎo) 。事件由 ABAP/4 程序(系統(tǒng) 程序或用戶 程序)或者 交互式用戶 輸入(例如 ,使用鼠標(biāo) 在屏幕上單 擊)生成。 系統(tǒng)不必按 ABAP/4 程序中列出 的順序?qū)M 行語句處理 。這使得 ABAP/4 成為事件驅(qū) 動編程語言 ,類似于 Microsoft 的Visual Basic。時間事件和 ABAP/4 程序的連接 由事件關(guān)鍵 字提供。ABAP/4 程序中的每 個語句都屬 于特別的事 件關(guān)鍵字。 即使在程序 中沒有指定 任何事件關(guān) 鍵字,所有 語句都自動 歸屬于標(biāo)準(zhǔn) 事件關(guān)鍵字 (START-OF-SELECTION) ,與程序中 事件語句的 次序完全不 相干。所有屬于某 一特定事件 關(guān)鍵字的語 句形成一個 處理塊。處 理塊是一個 在事件發(fā)生 時執(zhí)行的模 塊。處理塊 內(nèi)的程序流 依賴于內(nèi)部 控制。系統(tǒng) 按順序處理 語句,或按 照前面提到 的標(biāo)準(zhǔn)關(guān)鍵 字定義的順 序處理。ABAP/4 程序常規(guī)結(jié) 構(gòu)如下:假設(shè)當(dāng)用戶 選擇一行后 ,生成列表 且提供一些 細分設(shè)備的 報表程序必 須作出反應(yīng) (詳細信息 ,參見 交互列表)。需要為 該事件處理 的代碼必須 插入事件關(guān) 鍵字 AT LINE-SELECTION 之后。AT LINE-SELECTION. MOVE X TO FLAG. .無論何時用 戶通過單擊 鼠標(biāo)或按 F2 鍵在列表中 選擇一個項 目時,AT LINE-SELECTION 和下一個事 件關(guān)鍵字之 間的所有語 句將被處理關(guān)于外部控 制的詳細信 息,如事件 及其如何與 ABAP/4 程序相互作 用的信息, 參見 C通過事件控制 ABAP/4 程序流。該節(jié)說明如 何使用外部 控制控制處 理塊內(nèi)的程 序流。要控制 ABAP/4 程序中的內(nèi) 部流,請遵 循結(jié)構(gòu)化編 程原則并將 程序模塊劃 分為單個邏 輯相關(guān)語句 塊(這些組 成控制結(jié)構(gòu) )。其中的 每個語句塊 都執(zhí)行主任 務(wù)的一部分 。要使程序易 于閱讀,應(yīng) 該縮排控制 結(jié)構(gòu)中的語 句塊。出于 布局需要, 可以使用 ABAP/4 編輯器功能 “編輯 - 插入語句.” 和“程序 - 整齊打印程 序”(詳細 信息,參見 ABAP/4 程序布局 (頁 26)。可以用 IF、CASE、 DO 和 WHILE 之類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論