一、 將數(shù)據(jù)聲明 為公共部分
要將數(shù)據(jù)聲 明為公共部 分,請使用 DATA 語句,用法 如下: 語法:DATA: BEGIN OF COMMON PART [<name>], <data declaration>, 在 <data declaration> 中,按 DATA 語句所述,對(duì)要包含到公共部分中的所有數(shù)據(jù)加以聲明。 子程序和調(diào) 用程序自動(dòng)共享 TABLES 語句定義的 表格工作區(qū) 。 要在調(diào)用程序和子程序中使用公共部分,必須在所涉及的全部程序中都使用完全相同的聲明。因此,應(yīng)將公共部分聲明放到INCLUDE 程序中。 一個(gè)程序中可使用多個(gè)公共部分。但必須給每個(gè)公共部分分配一個(gè)名稱 <name>。 如果每個(gè)程序中只使用一個(gè)公共部分,則名稱 <name> 可選。 為了避免在 具有不同公共部分聲明 的程序之間 發(fā)生沖突, 公共部分的名稱應(yīng)始終 保持唯一。 假定某個(gè) INCLUDE 程序 INCOMMON 包含公共部分 NUMBERS 的聲明。公共部分由三個(gè)數(shù)字字段組成: NUM1、 NUM2 以及 SUM: ***INCLUDE INCOMMON. DATA: BEGIN OF COMMON PART NUMBERS, 假定程序 FORMPOOL 包含 INCOMMON, 同時(shí)包含子 程序 ADDIT 和 OUT: PROGRAM FORMPOOL. INCLUDE INCOMMON. FORM ADDIT. FORM OUT. 假定調(diào)用程 序 SAPMZTST 時(shí)包含 INCOMMON, 并從程序 FORMPOOL 中調(diào)用 ADDIT。 PROGRAM SAPMZTST. INCLUDE INCOMMON. NUM1 = 2. NUM2 = 4. NUM1 = 7. NUM2 = 11. 啟動(dòng) SAPMZTST 后,輸出如 下: Sum of 2 and 4 is 6 Sum of 7 and 11 is 18 該示例與 調(diào)用內(nèi)部子程序的示例功能相同。在當(dāng)前示例中 ,必須將程序所用數(shù)據(jù)對(duì)象聲明為公共部分,因?yàn)樽映绦?span lang="DE" style="line-height: 21px; "> ADDIT 和 OUT 都被外部調(diào) 用。
二、通過參數(shù)進(jìn)行數(shù)據(jù)傳遞【Important】
可以用參數(shù) 在調(diào)用程序 和子程序之 間進(jìn)行數(shù)據(jù) 傳遞。 _ 在定義子 程序期間用 FORM 語句定義的 參數(shù)叫做形式參數(shù)。 _ 在調(diào)用子 程序期間用 PERFORM 語句指定的 參數(shù)叫做實(shí)參數(shù)。 可以區(qū)分不 同種類的參 數(shù): _ 輸入?yún)?shù) 用于向子程 序傳遞參數(shù) _ 輸出參數(shù) 用于從子程 序傳遞參數(shù) _ 輸入/輸 出參數(shù)用于 與子程序進(jìn) 行參數(shù)傳遞 在 FORM 和 PERFORM 語句的 <pass> 選項(xiàng)中定義 參數(shù),方法 如下: 語法FORM <subr> [TABLES <formal table list>]
PERFORM <subr>[(<prog>)] [TABLES <actual table list>]
選項(xiàng) TABLES、 USING 和 CHANGING 必須按上述 順序編寫。 列表中 USING 和 CHANGING 后面的參數(shù) 可以是所有類型的數(shù)據(jù)對(duì)象和字段符 號(hào)。列表中 TABLES 后面的參數(shù)既可以是有表頭行的內(nèi)表,也可以是不帶表頭行的內(nèi)表??梢圆捎?span lang="EN-US" style="line-height: 19px; "> TABLES、 USING 或 CHANGING 傳送內(nèi)表。
對(duì)于 FORM 語句中 USING 和 CHANGING后 面列表中的 每個(gè)形式參 數(shù),可以指 定不同數(shù)據(jù) 傳遞方式: _ 通過參考 值調(diào)用:在子程序調(diào)用期間,僅將實(shí)參數(shù)的地址傳送給形式參數(shù)。形式參數(shù)本身沒有內(nèi)存。 在子程序中使用調(diào)用程序的字段。更改形式參數(shù)之后,調(diào)用程序中的字段內(nèi)容也會(huì)變動(dòng)。 _ 通過值調(diào) 用:在子程序調(diào)用期間 ,形式參數(shù)是作為實(shí)參數(shù)的副本創(chuàng)建的。形式參數(shù)有自己的內(nèi)存。更改形式參數(shù)并不影響實(shí)參數(shù)。 _ 通過值和 結(jié)果調(diào)用: 在子程序調(diào)用期間,形式參數(shù)是作為實(shí)參數(shù)的副本創(chuàng)建的 。形式參數(shù)有自己的內(nèi)存空間。在子程序末尾 ,將對(duì)形式參數(shù)的更改復(fù)制給實(shí)參數(shù)。
由 TABLES 傳遞的內(nèi)表 均通過參考 值調(diào)用。
指定形式參數(shù)的數(shù)據(jù)類型對(duì)于向子程序傳遞結(jié)構(gòu)化數(shù)據(jù)非常重要。有關(guān)如何傳遞結(jié)構(gòu)化數(shù)據(jù)的內(nèi)容(字段串和內(nèi)表)在以下章節(jié)中有專門解釋: (一) 通過參考傳遞
要通過參考值在調(diào)用程序和子程序之間進(jìn)行數(shù)據(jù)傳遞,請使用 FORM 和 PERFORM 語句 <pass> 選項(xiàng)的 USING 或 CHANGING, 用法如下: 語法:FORM ..... [USING <fi1> ... <fin>] [CHANGING <fo1> ... <fon>] ... PERFORM... [USING <ai1> ... <ain>] [CHANGING <ao1> ... <aon>] ... 在 USING 和 CHANGING 后面的列表 中指定形式 參數(shù)和實(shí)參數(shù),而不需附加任何內(nèi)容。 FORM 語句中形式參數(shù)的名稱 可以與PERFORM 語句中實(shí)參數(shù) <ai1> ... <ain> and <ao1> ... <aon> 的名稱不同 。PERFORM 語句列表中的第一個(gè)參數(shù)傳遞給 FORM 語句相應(yīng)列表中的第一個(gè)參數(shù),以此類推。 對(duì)于通過參考值調(diào)用, USING 和CHANGING 完全相同。對(duì)于文檔, USING 用于子程序中的固定輸入?yún)?shù),而 CHANGING 則用于子程序中變化的輸出參數(shù)。 子程序中變化的輸入?yún)?shù)在調(diào)用程序中也會(huì)變化。要避免這一點(diǎn),必須通過值傳遞參數(shù)。 假定程序 FORMPOOL 包含兩個(gè)子程序 ADDIT 和 OUT: PROGRAM FORMPOOL. FORM ADDIT USING ADD_NUM1 ADD_NUM2 CHANGING ADD_SUM. FORM OUT USING OUT_NUM1 OUT_NUM2 OUT_SUM. 假定某個(gè)調(diào) 用程序調(diào)用 ADDIT 和 OUT: PROGRAM SAPMZTST. DATA: NUM1 TYPE I, NUM1 = 2. NUM2 = 4. NUM1 = 7. NUM2 = 11. 啟動(dòng) SAPMZTST 后,輸出如 下: Sum of 2 and 4 is 6 Sum of 7 and 11 is 18 該示例與 將數(shù)據(jù)聲明 為公共部分中的示例功能相同。 當(dāng)前示例中 ,通過參考值將實(shí)參數(shù) NUM1、NUM2 和 SUM 從 SAPMZTST 傳遞給子程序 ADDIT 的形式參數(shù) 。更改 ADD_SUM 后,后面的參數(shù)就傳遞給子程序 OUT 的形式參數(shù) OUT_NUM1、 OUT_NUM2 和 OUT_SUM。 備注:不能在子程序中更改 USING 后加的實(shí)參數(shù) Eg: PROGRAM FORMPOOL. FORM ADDIT USING ADD_NUM1 ADD_NUM2 CHANGING ADD_SUM. * ADD_NUM1 = 5. * ADD_NUM2 = 5. * A USING reference parameter should not be used. * Instead, define the parameter as a USING-VALUE(...) or CHANGING parameter.
(二)通過值傳遞
要確保輸入?yún)?shù)在調(diào)用程序中保持不變(即使 子程序中已 被更改), 可以通過值 將數(shù)據(jù)傳遞 給子程序。 為此,請使 用 FORM 和 PERFORM 語句 <pass> 選項(xiàng)的 USING, 用法如下: 語法FORM ..... USING ...VALUE(<fii>) .. PERFORM... USING .......<aii> .. 通過對(duì) FORM 語句中 USING 后面列表中的形式輸入?yún)?shù)寫入 VALUE(<fii>)而 不是 <fii>,相應(yīng)參數(shù)就通過值進(jìn)行傳遞。與實(shí)字段 <ai> 屬性相同的 PERFORM 語句調(diào)用該 子程序時(shí), 就會(huì)創(chuàng)建一個(gè)新的局域字段 <fi>。系統(tǒng)處理獨(dú)立于調(diào)用程序中參考字段的該字段。 假定 FORMPOOL 程序包含子 程序 FACT: PROGRAM FORMPOOL. FORM FACT USING VALUE(F_NUM) CHANGING F_FACT. 假定程序 SAPMZTST 調(diào)用子程序 FACT: PROGRAM SAPMZTST. DATA: NUM TYPE I VALUE 5, PERFORM FACT(FORMPOOL) USING NUM CHANGING FAC. WRITE: / 'Factorial of', NUM, 'is', FAC. 在啟動(dòng) SAPMZTST 后,輸出如下: Factorial of 5 is 120 在該示例中 ,計(jì)算數(shù)字 NUM 的階乘。輸入?yún)?shù) NUM 被傳遞給子 程序的形式 參數(shù) F_NUM。 盡管 F_NUM 在子程序中 已被更改, 實(shí)參數(shù) NUM 仍然保持其 初始值。輸 出參數(shù) FAC 通過參考值 進(jìn)行傳遞。
(三)通過值和結(jié)果進(jìn)行傳遞
如果僅希望在子程序運(yùn)行成功之后 ,才將更改過的輸出參數(shù)從子程序返回給調(diào)用程序,請使 用 FORM 和 PERFORM 語句 <pass> 選項(xiàng)的 CHANGING, 用法如下: 語句FORM ..... CHANGING ...VALUE(<fii>) .. PERFORM... CHANGING .......<aii> .. 通過對(duì) FORM 語句中 CHANGING后面列表 中的形式輸 入?yún)?shù)寫入 VALUE(<fii>)而 不是 <fii>, 相應(yīng)參數(shù)通過值和結(jié)果調(diào)用進(jìn)行傳遞。與實(shí)字段 <ai> 屬性相同的 PERFORM 語句調(diào)用該子程序時(shí),就會(huì)創(chuàng)建一個(gè)新的局域字段 <fi>。系統(tǒng)處 理獨(dú)立于調(diào)用程序中參考字段的字段。 僅在運(yùn)行到 ENDFORM 語句時(shí),系 統(tǒng)才將 <fii> 的當(dāng)前值傳 遞給 <aii>。 如果子程序 因?yàn)槟硞€(gè)對(duì)話信息而中斷, 則實(shí)參數(shù) <aii> 保持不變。 僅在編寫對(duì)話程序時(shí),通過對(duì)話信息終止子程序才有意義。在報(bào)表程序中,子程序中的對(duì)話信息終止整個(gè)程序。在時(shí)間事件 AT SELECTION SCREEN 期間,或交互報(bào)表期間,該規(guī)則存在例外。交互報(bào)表的選項(xiàng)屏幕和工具使用現(xiàn)存對(duì)話程序。該對(duì)話程序是作為 ABAP/4 中的關(guān)鍵字提供的。 在用 PERFORM 調(diào)用子程序 時(shí),可以用 USING 代替 CHANGING。 但對(duì)于文檔 ,則應(yīng)使用 FORM 語句中相同 的字。 PROGRAM SAPMZTST. DATA: OP1 TYPE I, OP1 = 3. PERFORM MULTIP USING OP1 OP2 CHANGING RES. WRITE: / 'After subroutine:', FORM MULTIP USING VALUE(O1) VALUE(O2) CHANGING VALUE(R). 在啟動(dòng) SAPMZTST 后,輸出如下: Inside subroutine: R= 12 RES= 0 After subroutine: RES= 12 在該示例中 ,從調(diào)用程序調(diào)用內(nèi)部子程序 MULTIP。 參數(shù) OP1 和 OP2 通過值傳遞給形式參數(shù) O1 和 O2。輸出參數(shù) RES 通過值和結(jié)果傳遞給形式參數(shù) R。通過將 R 和 RES 從子程序內(nèi)部寫到屏幕上,證明 RES 在 ENDFORM 語句之前未被更改。從子程序中返回之后,其內(nèi)容已更改 。 三、鍵入形式參 數(shù)
要確保子程序的形式參數(shù)屬于某個(gè)類型,可在 FORM 語句中指定該類型。為此,請?jiān)?span lang="EN-US" style="line-height: 19px; "> TABLES、 USING 或 CHANGING 后面列表中的形式參數(shù) 后輸入 TYPE <t> 或 LIKE <f>。該類型規(guī)范可選。
用 PERFORM 調(diào)用子程序 時(shí),系統(tǒng)檢查 PERFORM 語句中實(shí)參數(shù)的類型是否與分配給形式參數(shù)的類型兼容。下表給出了兼容規(guī)則。 不存在類型轉(zhuǎn)換。如果類型不兼容 ,系統(tǒng)會(huì)在內(nèi)部子程序調(diào)用的語法檢查期間輸出錯(cuò)誤信息 ,或在外部 子程序調(diào)用時(shí)出現(xiàn)運(yùn)行錯(cuò)誤。 以下兼容規(guī)則應(yīng)用于確定形式參數(shù)類型:
(<ud> 是用戶定義 的) REPORT SAPMZTST. DATA: PERFORM TYPETEST USING DATE1 STRING1 NUMBER1 COUNT1. FORM TYPETEST USING NOW DESCRIBE FIELD TXT LENGTH T IN CHARACTER MODE. 在 SAPMZTST 后,輸出如 下: TYPE of NOW is D TYPE of NOW is T 采用不同的實(shí)參數(shù),兩次調(diào)用內(nèi)部子程序 TYPETEST 。所有實(shí)參數(shù)和形式參數(shù)均兼容, 在語法檢查中沒有出現(xiàn)錯(cuò)誤信息。 例如,如果在調(diào)用程序中將 COUNT2聲明為 TYPE F 而不是 TYPE I ,則在語法檢查中會(huì)報(bào)告錯(cuò)誤,因?yàn)樾问絽?shù) INT 是用TYPE I 指定的。請注意,類型規(guī)范不同, 每次調(diào)用子程序時(shí),形式參數(shù)的類型和屬性也可以有所不同。 四、向子程序傳 遞字段串
如果要向子程序傳遞字段串,并訪問子程序中字段串的組件,則必須指定相應(yīng)形式參數(shù)的類型。這里使 用的數(shù)據(jù)類型必須與字段串類型相同。 對(duì)于內(nèi)部子程序,可以使用 TYPE 或 LIKE 參考要直接傳遞的字段串的結(jié)構(gòu)。對(duì)于外部子程序,還必須在包含子程序的程序中指定結(jié)構(gòu)定義。為此,可以使用下列任何一種: _ 包含程序 _ 類型組 _ ABAP/4 詞典結(jié)構(gòu)
下例就上述 內(nèi)容加以說 明: 1. 包含程序可以在包含程序中定義結(jié)構(gòu)。該方法適用于這種結(jié)構(gòu):只用于幾個(gè)子程序中,并且僅由幾個(gè)開發(fā)者使用。 包含程序 DECLARE: ***INCLUDE DECLARE. TYPES: BEGIN OF LINE, 程序 FORMPOOL 包含程序 DECLARE 和 COMPONENTS 子程序: PROGRAM FORMPOOL. INCLUDE DECLARE. FORM COMPONENTS CHANGING VALUE(PERSON) TYPE LINE. 程序 SAPMZTST 包含程序 DECLARE, 并調(diào)用子程 序 COMPONENTS: REPORT SAPMZTST. INCLUDE DECLARE. DATA WHO TYPE LINE. WHO-NAME = 'Karl'. WHO-AGE = '10'. WHO-COUNTRY = 'D'. PERFORM COMPONENTS(FORMPOOL) CHANGING WHO. WRITE: / WHO-NAME, WHO-AGE, WHO-COUNTRY. SAPMZTST 隨后輸出: KARL 10 D MICKEY 60 USA 實(shí)參數(shù) WHO (具有用戶 定義的、結(jié)構(gòu)化數(shù)據(jù)類 型 LINE) 傳遞給形式 參數(shù) PERSON。 形式參數(shù) PERSON 的類型由 TYPE LINE 確定。因?yàn)?span lang="DE" style="line-height: 21px; "> LINE 是由用戶定 義的數(shù)據(jù)類 型,因此 PERSON 的類型就被 完全指定。 子程序訪問 并更改 PERSON 的組件。然 后返回給調(diào) 用程序中 WHO 的組件。 2. 類型組可在類型組中定義結(jié)構(gòu)。該方法 適用于幾個(gè)開發(fā)者共同工作的大型程序所用的結(jié)構(gòu)中。 DECLA 類型組: TYPE-POOL DECLA . TYPES: BEGIN OF DECLA_LINE, 程序 FORMPOOL 使用 DECLA 類型組,并包含子程序 COMPONENTS 。 PROGRAM FORMPOOL. TYPE-POOLS DECLA. FORM COMPONENTS CHANGING VALUE(PERSON) TYPE DECLA_LINE. 程序 SAPMZTST 使用 DECLA 類型組,并 調(diào)用子程序 COMPONENTS : REPORT SAPMZTST. TYPE-POOLS DECLA. DATA WHO TYPE DECLA_LINE. WHO-NAME = 'Karl'. WHO-AGE = '10'. WHO-COUNTRY = 'D'. PERFORM COMPONENTS(FORMPOOL) CHANGING WHO. WRITE: / WHO-NAME, WHO-AGE, WHO-COUNTRY. SAPMZTST 隨后輸出: KARL 10 D MICKEY 60 USA 除了類型定 義不在包含 程序中出現(xiàn) ,而在 DECLA 類型組中出 現(xiàn)之外,該 示例與上例完全一樣。
3. ABAP/4 詞典結(jié)構(gòu)可以使用 ABAP/4 詞典中的表 格結(jié)構(gòu)。該 方法始終可 選,因?yàn)榭?/span> 能訪問 ABAP/4 詞典結(jié)構(gòu)。 程序 FORMPOOL 包含子程序 COMPONENTS : PROGRAM FORMPOOL. FORM COMPONENTS CHANGING VALUE(CITIES) LIKE SPFLI. 程序 SAPMZTST 調(diào)用子程序 COMPONENTS: REPORT SAPMZTST. DATA FLIGHT LIKE SPFLI. FLIGHT-CITYFROM = 'Berlin'. FLIGHT-CITYTO = 'London'. PERFORM COMPONENTS(FORMPOOL) CHANGING FLIGHT. WRITE: / FLIGHT-CITYFROM, FLIGHT-CITYTO. SAPMZTST 隨后輸出: Berlin London New York San Francisco 在子程序 COMPONENTS 中,用 LIKE SPFLI 確定形式參 數(shù) CITIES 的類型。在 ABAP/4 詞典中,CITIES 結(jié)構(gòu)與表格 SPFLI 相同。在程 序 SAPMZTST 中,使用相 同結(jié)構(gòu)對(duì)字 段串 FLIGHT 加以說明, 然后填充和 傳遞給子程 序 COMPONENTS 的結(jié)構(gòu) CITIES 組件。該子 程序處理組 件并將其傳 遞給調(diào)用程 序。 五、向子程序傳遞內(nèi)表1. 用USING 和 CHANGING 傳遞在 FORM 和 PERFORM 語句中,可以將內(nèi)表當(dāng)作 USING 或 CHANGING 后面列表中的參數(shù)傳遞 。如果要訪問內(nèi)表組件 ,則必須指定相應(yīng)形式參數(shù)的類型。否則,只能在子程序中執(zhí)行行操作。 同時(shí)還必須 區(qū)分有表頭 行或無表頭 行的內(nèi)表。 對(duì)于有表頭行的內(nèi)表, 必須在表格名之后用方括號(hào)([]) 指定表格體 ,以便與表頭行區(qū)分開。 對(duì)于內(nèi)部子程序,可以 用 TYPE 或 LIKE 參考要直接 傳遞的內(nèi)表 。對(duì)于外部 子程序,還必須在包含 子程序的程序中定義結(jié)構(gòu)。為此,請按照定義字段串結(jié)構(gòu)的方法進(jìn)行。 PROGRAM SAPMZTST. DATA: BEGIN OF LINE, DATA ITAB LIKE LINE OCCURS 10. PERFORM FILL CHANGING ITAB. *【ITAB 無表頭行內(nèi)表】 FORM FILL CHANGING F_ITAB LIKE ITAB. FORM OUT USING VALUE(F_ITAB) LIKE ITAB. 啟動(dòng) SAPMZTST 后,輸出如 下: 1 1 2 4 3 9 在該示例中 ,定義并調(diào)用了兩個(gè)子程序: FILL 和 OUT。無表頭行的內(nèi)表 ITAB 傳遞給子程序。通過參考值傳遞給 FILL, 通過值傳遞給 OUT。請注意,在兩個(gè)子程序中都將工作域 F_LINE 創(chuàng)建為局部數(shù)據(jù)對(duì)象。如果 ITAB 為有表頭行的表格,則 在 PERFORM 和 FORM 中必須用 ITAB[] 代替 ITAB。 用 TABLES 傳遞在 FORM 和 PERFORM 語句中,可以將所有內(nèi)表當(dāng)作 TABLES 后面列表中的參數(shù)進(jìn)行傳遞。如果要在子程序中訪問表格行的組件,則必須指定形式參數(shù)的數(shù)據(jù)類型。否則, 只能執(zhí)行整行操作。由 TABLES 傳遞的內(nèi)表總是通過參考值調(diào)用。 如果傳遞有表頭行的內(nèi) 表,則將表格體和表格工作域傳遞給子程序。 如果傳遞無表頭行的內(nèi)表,則在子程序中自動(dòng)創(chuàng)建作為局部數(shù)據(jù)對(duì)象的表頭行。 PROGRAM SAPMZTST. TYPES: BEGIN OF LINE, DATA: ITAB TYPE LINE OCCURS 10 WITH HEADER LINE, *【ITAB 有表頭行內(nèi)表】 *【JTAB 無表頭行內(nèi)表】 PERFORM FILL TABLES ITAB. FORM FILL TABLES F_ITAB LIKE ITAB[]. * 必須用[]來引用 FORM OUT TABLES F_ITAB LIKE JTAB. 啟動(dòng) SAPMZTST 后,輸出如 下: 1 1 2 4 3 9 在該示例中 ,內(nèi)表 ITAB 有表頭行,而內(nèi)表 JTAB 無表頭行。 ITAB 被傳遞給子程序 FILL, 從中使用表格工作域 F_ITAB 進(jìn)行填充。 在調(diào)用程序 中,將 ITAB 的表格體復(fù) 制到 JTAB 后,JTAB 被傳遞給子程序 OUT。請 注意,在這種情況下,將無表頭行 的實(shí)表格傳遞給有表頭行的形式表格,并在子程序中使用了表格工作 域 F_ITAB。 |
|
|