小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

abap調(diào)用程序與子程序之間進(jìn)行數(shù)據(jù)傳遞的方式

 taewon 2011-06-23

一、         將數(shù)據(jù)聲明 為公共部分

 

要將數(shù)據(jù)聲 明為公共部 分,請使用 DATA 語句,用法 如下:

語法:

DATA: BEGIN OF COMMON PART [<name>],

               <data declaration>,
               ..............
      END OF COMMON PART [<name>].

 <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,
         NUM1 TYPE I,
         NUM2 TYPE I,
         SUM  TYPE I,
      END OF COMMON PART NUMBERS.

假定程序 FORMPOOL 包含 INCOMMON, 同時(shí)包含子 程序 ADDIT  OUT

PROGRAM FORMPOOL.

INCLUDE INCOMMON.

FORM ADDIT.
   SUM = NUM1 + NUM2.
   PERFORM OUT.
ENDFORM.

FORM OUT.
   WRITE: / 'Sum of', NUM1, 'and', NUM2, 'is', SUM.
ENDFORM.

假定調(diào)用程 序 SAPMZTST 時(shí)包含 INCOMMON, 并從程序 FORMPOOL 中調(diào)用 ADDIT。

PROGRAM SAPMZTST.

INCLUDE INCOMMON.

NUM1 = 2. NUM2 = 4.
PERFORM ADDIT(FORMPOOL).

NUM1 = 7. NUM2 = 11.
PERFORM ADDIT(FORMPOOL).

啟動(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>]
             [USING <formal  input list>]
          [CHANGING <formal output list>]....

 

PERFORM <subr>[(<prog>)] [TABLES <actual  table list>]
                          [USING <actual  input list>]
                       [CHANGING <actual output 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.
   ADD_SUM = ADD_NUM1 + ADD_NUM2.
   PERFORM OUT USING ADD_NUM1 ADD_NUM2 ADD_SUM.
ENDFORM.

FORM OUT USING OUT_NUM1 OUT_NUM2 OUT_SUM.
...WRITE: / 'Sum of',OUT_NUM1,'and',OUT_NUM2,'is',OUT_SUM.
ENDFORM.

假定某個(gè)調(diào) 用程序調(diào)用 ADDIT  OUT

PROGRAM SAPMZTST.

DATA: NUM1 TYPE I,
      NUM2 TYPE I,
      SUM  TYPE I.

NUM1 = 2. NUM2 = 4.
PERFORM ADDIT(FORMPOOL) USING NUM1 NUM2 CHANGING SUM.

NUM1 = 7. NUM2 = 11.       
PERFORM ADDIT(FORMPOOL) USING NUM1 NUM2 CHANGING SUM.

啟動(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_SUM = ADD_NUM1 + ADD_NUM2.
   PERFORM OUT USING ADD_NUM1 ADD_NUM2 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.


ENDFORM.

 

 

 

(二)通過值傳遞

 

要確保輸入?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.
   F_FACT = 1.
   WHILE F_NUM GE 1.
      F_FACT = F_FACT * F_NUM.
      F_NUM = F_NUM - 1.
   ENDWHILE.
ENDFORM.

假定程序 SAPMZTST 調(diào)用子程序 FACT

PROGRAM SAPMZTST.

DATA: NUM  TYPE I VALUE 5,
      FAC  TYPE I VALUE 0.

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,
      OP2  TYPE I,
      RES  TYPE I.

OP1 = 3.
OP2 = 4.

PERFORM MULTIP USING OP1 OP2 CHANGING RES.

WRITE: / 'After subroutine:',
       / 'RES=' UNDER 'RES=', RES.

FORM MULTIP USING VALUE(O1) VALUE(O2) CHANGING VALUE(R).
    R = O1 * O2.
    WRITE: / 'Inside subroutine:',
           /  'R=', R, 'RES=', RES.
ENDFORM.

在啟動(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ù)類型:

確定類型

實(shí)參數(shù)的語法檢查

無類型規(guī)范
TYPE ANY

系統(tǒng)接受任意類型的實(shí)參數(shù) 。

將實(shí)參數(shù)的所有屬性傳遞給形式參數(shù)。

TYPE TABLE

系統(tǒng)檢查實(shí)參數(shù)是否為內(nèi)表。

將表格的所有屬性和結(jié)構(gòu)從實(shí)參數(shù)傳遞給形式參數(shù)。

TYPE C N、 P  X

系統(tǒng)檢查實(shí)參數(shù)的類型是否為 C、 N P  X。

將參數(shù)的長度和其 DECIMALS 規(guī)范(對(duì)類 型 P

從實(shí)參數(shù)傳遞給形式參數(shù)。

TYPE D、F IT,
LIKE <f>,
TYPE <ud>

完全確定這些類型。

系統(tǒng)檢查實(shí)參數(shù)的數(shù)據(jù)類型是否完全與形式參數(shù)的類型相兼容 。

 

<ud> 是用戶定義 的)

REPORT SAPMZTST.

DATA:
  DATE1      TYPE D,             DATE2      TYPE T,
  STRING1(6) TYPE C,             STRING2(8) TYPE C,
  NUMBER1    TYPE P DECIMALS 2,  NUMBER2    TYPE P,
  COUNT1     TYPE I,             COUNT2     TYPE I.

PERFORM TYPETEST USING DATE1 STRING1 NUMBER1 COUNT1.
SKIP.
PERFORM TYPETEST USING DATE2 STRING2 NUMBER2 COUNT2.

FORM TYPETEST USING NOW
                    TXT TYPE C
                    VALUE(NUM) TYPE P
                    INT TYPE I.
   DATA: T.
   DESCRIBE FIELD NOW TYPE T.
   WRITE: / 'Type of NOW is', T.
   * DESCRIBE FIELD TXT LENGTH T.

DESCRIBE FIELD TXT LENGTH T IN CHARACTER MODE.
   WRITE: / 'Length of TXT is', T.
   DESCRIBE FIELD NUM DECIMALS T.
   WRITE: / 'Decimals of NUM are', T.
   DESCRIBE FIELD INT TYPE T.
   WRITE: / 'Type of INT is', T.
ENDFORM.

 SAPMZTST 后,輸出如 下:

TYPE of NOW is D
Length of TXT is 6
Decimals of NUM are 2
Type of INT is I

TYPE of NOW is T
Length of TXT is 8
Decimals of NUM are 0
Type of INT is I

采用不同的實(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,
          NAME(10)   TYPE C,
          AGE(2)     TYPE N,
          COUNTRY(3) TYPE C,
       END OF LINE.

程序 FORMPOOL 包含程序 DECLARE  COMPONENTS 子程序

PROGRAM FORMPOOL.

INCLUDE DECLARE.

FORM COMPONENTS CHANGING VALUE(PERSON) TYPE LINE.
   WRITE: / PERSON-NAME, PERSON-AGE, PERSON-COUNTRY.
   PERSON-NAME = 'Mickey'. 
   PERSON-AGE = '60'. 
   PERSON-COUNTRY = 'USA'.
ENDFORM.

程序 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,
          NAME(10)   TYPE C,
          AGE(2)     TYPE N,
          COUNTRY(3) TYPE C,
       END OF DECLA_LINE.

程序 FORMPOOL 使用 DECLA 類型組,并包含子程序 COMPONENTS 。

PROGRAM FORMPOOL.

TYPE-POOLS DECLA.

FORM COMPONENTS CHANGING VALUE(PERSON) TYPE DECLA_LINE.
   WRITE: / PERSON-NAME, PERSON-AGE, PERSON-COUNTRY.
   PERSON-NAME = 'Mickey'. 
   PERSON-AGE = '60'. 
   PERSON-COUNTRY = 'USA'.
ENDFORM.

程序 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.
   WRITE: / CITIES-CITYFROM, CITIES-CITYTO.
   CITIES-CITYFROM = 'New York'.
   CITIES-CITYTO   = 'San Francisco'.
ENDFORM.

程序 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,
         COL1 TYPE I,
         COL2 TYPE I,
      END OF LINE.

DATA ITAB LIKE LINE OCCURS 10.

PERFORM FILL CHANGING ITAB.
PERFORM OUT  USING    ITAB. 

*ITAB 無表頭行內(nèi)表】

FORM FILL CHANGING F_ITAB LIKE ITAB.
   DATA F_LINE LIKE LINE OF F_ITAB.
   DO 3 TIMES.
      F_LINE-COL1 = SY-INDEX.
      F_LINE-COL2 = SY-INDEX ** 2.
      APPEND F_LINE TO F_ITAB.
   ENDDO.
ENDFORM.

FORM OUT USING VALUE(F_ITAB) LIKE ITAB.
   DATA F_LINE LIKE LINE OF F_ITAB.
   LOOP AT F_ITAB INTO F_LINE.
      WRITE: / F_LINE-COL1, F_LINE-COL2.
   ENDLOOP.
ENDFORM.

啟動(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,
         COL1 TYPE I,
         COL2 TYPE I,
       END OF LINE.

DATA: ITAB TYPE LINE OCCURS 10 WITH HEADER LINE,
      JTAB TYPE LINE OCCURS 10.

*ITAB 有表頭行內(nèi)表】

*JTAB 無表頭行內(nèi)表】

PERFORM FILL TABLES ITAB.
MOVE ITAB[] TO JTAB.
PERFORM OUT  TABLES JTAB.

FORM FILL TABLES F_ITAB LIKE ITAB[].  必須用[]來引用
   DO 3 TIMES.
      F_ITAB-COL1 = SY-INDEX.
      F_ITAB-COL2 = SY-INDEX ** 2.
      APPEND F_ITAB.
   ENDDO.
ENDFORM.

FORM OUT TABLES F_ITAB LIKE JTAB.
   LOOP AT F_ITAB.
      WRITE: / F_ITAB-COL1, F_ITAB-COL2.
   ENDLOOP.
ENDFORM.

啟動(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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多