轉載:ABAP RFC 詳細講解


RFC Programming in ABAP
目錄
< 1 > RFC 基礎
< 2 > RFC 界面
< 3 > SAP系統中的RFC
< 4 > 需要的技術
< 5 > 在ABAP中調用RFC
< 6 > 介紹
< 7 > 在遠程調用時,參數處理
< 8 > 本地調用RFC
< 9 > RFC調用的返回信息
< 10 >在RFC中使用事務
tRFCs
< 11 >qRFC,傳遞隊列
概覽overview
programming serialization
using
事務隊列和隊列設置
工具
< 12 >RFC異步調用
異步調用RFC的要求
從一個異步調用RFC中接受結果
保持遠程上下文
平行處理異步調用RFC
< 13 >檢測RFC權限
< 14 >定義RFC異常
< 15 >在abap中寫RFC
< 16 >RFC處理步驟
< 17 >程序方針
< 18 >調試RFC模塊
< 19 >維護遠程目標
< 20 >顯示,維護,和測試遠程目標
< 21 >輸入目標參數
< 22 >目標類型
< 23 >維護目標組
< 24 >維護R/3系統之間的信賴關系

< 1 >RFC Basis,基礎
這一節給出了一個綱要,來瀏覽在一個sap系統中的RFC,綱要如下 :
RFC接口是如何工作的
RFC提供的功能
技術需求以及所支持的所有平台
( 1 ) RFC 接口
RFC是對一個函數模塊的調用,但是調用者的系統與被調函數所在的系統是不一樣的。
RFC也可以在系統內被調用,但是通常調用和被調用是在不同的系統中的。

在sap系統中,遠程調用的能力是有RFC接口系統提供的。 RFC允許在兩個sap系統 (R/3或者R/2 )之間進行調用。或者
是在一個sap系統和非sap系統之間調用。

RFC由以下的接口組成
. 在abap程序的調用接口
任何一個abap程序都可以調用一個遠程調用函數,使用語句 : CALL FUNCTION ....DESTINATION.
這個DESTINATION參數告訴SAP系統,被調函數運行的系統不同於訪問者的系統。
RFC與遠程系統的通訊作為CALL FUNCTION語句的一部分。

運行在一個sap系統上的RFC函數,必須是真實存在的函數模塊,並且必須在sap系統中顯示為 "remote".
當訪問和被訪問的都是abap程序,那么RFC接口提供兩者到通訊中。訪問者可能是任何abap程序,但是
被調用的程序必須是一個RFC函數。
主題:在abap程序中調用RFC函數, 提供了詳細的信息。
主題:在abap程序中寫RFC函數, 提供了寫你想要調用的遠程函數的信息。
. 在非sap程序中調用接口
當訪問者或者被訪問者是一個非sap程序,那么那個非sap程序就被規划為運行另一個程序,在RFC通訊中。
為了幫助運行RFC程序,在一個非sap系統中,sap提供了
-- 外部接口 (Ext )
基於RFC和基於GUI的接口可以被外部程序使用,來調用在sap R/2或者 R/3系統中的函數模塊,並且在
R/2 R/3系統中運行。
在R/2 或者 R/3系統中,abap程序,可以使用由外部程序提供的函數,通過這些接口。
假如你想要看在一個程序例子中的相關情節信息,請看相對應的單元,在教程 :通訊接口 (Ext ).
< 2 >RFC in sap systems
在任何一個R/3系統中, CALL FUNCTION 是abap語言中的一部分 (在R/2 Release 5. 0 以上開始 ).它被用來執行一個函數。
RFC 是一個CALL FUNCTION 的分類上的擴展,Existing function module 可以在R/2或者R/3系統中,通過一個RFC調用,
來執行。這個過程通過添加一個DESTINATION 子句到CALL FUNCTION語句,來實現。
例子:
SAP System A SAP System B External Client Program
ABAP Program ABAP Function Module Routine
...
CALL FUNCTION 'ABC' FUNCTION ABC. Rfcopen (... )
DESTINATION 'DEST' ... RfcCallReceive ( 'ABC' )
EXPORTING f1 = a1 ENDFUNCTION. ...
IMPORTING f2 = a2 RfcClose (... )
CHANGING f3 = a3
TABLES t1 = tab External Server Program
EXCEPTIONS Routine
COMMUNICATION_FAILURE = 1 main ()
system_failure = 2 [
... RfcAccept (.. )
RfcInstallFunction { 'ABC',abc ... }
RfcDispathc (... )
...
RfcClose (... )
]
RfcGetData (... )
RfcSendData (... )

這個目標參數destination 呈現一個入口,在RFCDES表中 (通過sm59可以定義destination ).這個入口包含了所有必要的字段,這些字段
用來連接和登陸到目標系統中。

RFC 可以在R/2 R/3系統之間使用。 在一個IBM環境中的R/2系統,RFC通常為CICS作為一個DC系統,在版本5.0D以上。
在IMS環境中,RFC在IMS 4.1之前,是不可用的。 完全支持LU6.2協議 (通過MVS/APPC ).
在 OS/2,Windows,windows NT 和所有基於R/3的unix平台上的RFC API,使應用RFC功能,在SAP系統 (R/3從版本2. 1,R/2從版本5.0D以上 )
和C程序之間成為可能。對於訪問者,無論遠程調用函數是由SAP系統還是C程序提供都已不重要了。
abaper可以非常自由的寫自己的通訊程序。
當你調用一個RFC函數,RFC接口關注於 :
. 轉變所有的參數數據為遠程系統所需要的形式。這里包含字符串轉換,和任何依賴硬件專換要求 (如,整數,浮點數 )
所有的abap數據類型都被支持。
注意 : 對於字典結構,沒有支持。
. 調用通訊程序,需要告訴遠程系統
. 處理通訊程序錯誤,並通告訪問者。

RFC接口對於abaper是不可見的。 處理遠程程序調用是建立在CALL FUNCTION語句中的。處理被調用是自動的 (以一個RFC stub 形式 ),對於每一個顯示為remote
的函數來說。這個stub 作為調用RFC的程序和RFC函數的接口。

RFC client 和 RFC server 之間的區別。RFC client 是召喚RFC來執行函數的,而被執行的函數由RFC server提供。
以下將,被遠程執行的函數叫RFC functions, 將通過RFC API提供函數的叫RFC calls.

所有RFC functions 都是可用的,在一個遠程RFC服務系統中。這就意味着在執行完第一個RFC function,那么完成的上下文信息 (所有的在RFC服務程序中
定義的全局變量或者在一個函數模塊的主程序中 ) 可以被用來接下來的RFC functions 中。RFC連接僅在以下情況關閉 :
. 當上下文信息在程序中中斷掉,或者 在外部程序中通過RfcAbort或者RfcClose明確的關閉。
在一個R/3系統,其它的R/3系統可以被定義為信賴的系統。那么信賴的系統可以進入到被訪問的系統,而不需要提供密碼。

< 3 > 所需要的技術
外部系統
. OS/2 TCP/IP
. Windows 3 .1/ 3. 11 所有TCP/IP 產品,支持socket 接口
. Window NT/95 微軟標准
. UNIX 平台 行業標准

不同的平台需要包含的庫和文件。
不詳述.....

< 4 > 在abap中調用遠程函數.
這一節包含以下主題 :
介紹
參數處理
本地調用
有返回
使用事務
使用異步
檢測權限
預先定義異常

( 1 ) 介紹
與普通的函數相比, 你要包含額外的destination子句,來定義這個函數是在那里運行的。 (調用來,不是在本地運行的,而是在目標服務器上運行的 )
CALL FUNCTION RemoteFunction
DESTINATION Dest
.....

字段Dest可以是一個字符,也可以是一個變量 :它的值是一個邏輯目標 ( 例如:hw1071_53 ),可以被本地的sap系統識別。Logical destinations 可以被定義
到RFCDES表中 (或者是TRFCD表,在R/2系統中 ), 可以通過sm59事務或者根據菜單路徑 : TOOLS , Administration, Adminstration network RFC destinations,
來定義。你也可以通過執行Guide (IMG )進入到Logical destinations. Tools- >Customizing- >Enterprise img. - >Cross-application components - > ALE - >
Communication - > Define RFC destination.
RFC的概念 : 例如,允許你進入一個R/2系統的函數模塊,通過一個R/3系統的函數。假如你想要讀客戶記錄從你的R/2系統的數據庫中,那么在那個可以接受客戶記 錄的R/2系統環境中創建一個遠程調用函數。從你的R/3系統中,調用這個函數。 使用RFC,並且列出到R/2系統的Logical destinations.
R/3 系統 : client
CALL FUNCTION 'RFC_CUSTOMER_GET'
DESTINATION 'K50'
EXPORTING KUNNR = custno
TABLES CUSTOMER_T = ITAB
EXPORTING kunnr = custno
TABLES customer_t = ITAB
EXCEPTIONS NO_RECORD_FOUND = 1.
R/2 系統 : Server
FUNCTION RFC_CUSTOMER_GET.
( Read customer record )
ENDFUNCTION.
( 2 ) 參數處理
當你調用一個RFC,系統處理參數傳遞與調用本地函數進行參數傳遞,是有區別的。
TABLES parameters
實際的數據庫表會被傳遞,而不是表頭。假如一個表參數沒有指定,那么一個空的表會在被調函數中使用。
RFC使用一個得耳塔管理機制來縮短網絡下載參數和結果數據。abap內表可以被用來作為RFC的參數。在一個本地函數調用時,一個參數內表
通過指針來傳遞,並且沒有新的本地拷貝副本被創建.RFC不支持指針機制。因此整個表不得不被傳遞,在RFC client和RFC server之間。
當RFC server接收到表入口,它將創建一個本地的內表拷貝。然后僅delta信息被返回到了RFC client。這個信息不是一旦有表被操作就傳遞到
RFC client的,然而,代替的是,當所有的delta信息都集中了,然后就一次性的傳遞到RFC client.
當第一次一個表被傳遞,就給定了一個object-ID,並且別注冊是 "Virtual global table"在調用系統中(RFC client所在系統)。
這個信息將一直被保留一直到函數返回。然而,假如多重call-backs產生,change-log將被傳遞回來,並且更新前面的本地拷貝,但是表本身僅
需要拷貝一次 (第一次 ).
( 3 ) Calling RFC locally
有些時候,你想要調用一個遠程函數 (就是,一個顯示為遠程的函數 )從一個相同的系統中。那么這個函數即可以以遠程方式運行也可以以本地調用
方式運行,這個決定於CALL FUNCTION語句。是否是以遠程方式或者是本地方式,會影響到參數的處理方式 (如上面所講述 )
兩種選擇 :
. CALL FUNCTION ...DESTINATION = 'NONE'
這是一個遠程調用,即使DESTINATION = 'NONE',但是這意味着遠程函數將會運行在訪問者相同的系統中。 因為是遠程調用,那么函數運行在
它自己的區域。
. CALL FUNCTION ... [ no DESTINATION userd ]
這就是本地調用了,即使這函數被顯示為遠程的。函數不會被運行在不同的區域,並且作為普通的函數調用。
參數傳遞也以普通函數模塊處理的方式。特別的是,假如一些EXPORING未指明,它就會異常中斷。
CALL FUNCTION 'RFC_CUSTOMER_GET'
EXPORTING kunnr = custno
TABLES customer_t = ITAB
EXCEPTIONS no_record_found = 01.
( 4 ) Calling Remote Functions BACK
RFC client 和 RFC server 在RFC開始的時候就已經被決定了。 當一個函數正在被處理在RFC server上,那么這個 server可以在RFC client上調用一個函數。
換句話說,RFC調用它的訪問者 (假如訪問者自身是一個函數模塊 ),或者任何一個裝載訪問者的函數模塊。那么call-back 函數會運行在相同的
程序上下文,作為原先的訪問者。
你可以追蹤這個call-back 機制,通過使用特別的desitination 名稱 'BACK'.假如這個名稱被指定到RFC調用的系統擔當RFC server,那么系統將使用相同的
RFC連接,這個連接在RFC server接收第一次調用的時候建立。一旦一個RFC連接被建立,它就可以一直維持直到它被明確的關閉或者調用函數被關閉。
在一個call-back過程中,系統將一直試圖使用已經存在的RFC 連接在創建一個新的連接之前。

語法如下 :
CALL FUNCTION ... DESTINATION 'BACK'
在這個程序中,在系統B中的遠程函數B,調用遠程函數 A在系統A中。
System A System B
CALL FUNCTION 'B' ---------------- > FUNCTION B.
^ DESTINATION 'B' .....
. .......
. FUNCTION A. <----------------------- CALL FUNCTION 'A'
. DESTINATION 'BACK'
. .... .....
. ENDFUNCTION. ----------returnA------ > .....
.
-----------------------return B------ENDFUNCTION.
(A,B都是遠程調用函數 )

( 5 ) Using Transactional Remote Function Calls
從版本3.0以后,數據可以在兩個R/3系統中,可靠安全的進行訪問,通過tRFC.
這個類型的RFC是由異步transactional RFC重新命名來,因為異步RFC在R/3系統中有其它名字。
被調函數模塊被准確的執行一次在RFC server系統中。遠程系統並不需要可用,當RFC client程序正在執行一個tRFC的時候。
tRFC組件保存了被調RFC函數連同相關的在R/3數據庫表中的數據,包含一個唯一的事務識別ID (TID ).

假如一個調用被傳遞,但是接收系統崩潰,那么這個調用仍然存在本地的隊列中,直到later time.
調用的對話程序,可以執行不需要等待遠程調用是否成功。假如接收系統沒有活動在某段時候內,那么調用將會被計划到隊列。
tRFCs 使用后綴在后台任務中。

因為是異步調用,destination參數定義了一個程序上下文在遠程系統中。結果,假如你重復調用了一個函數 (或者一個其他的函數 )在相同的destination中,
那么被調函數的全局數據將會進入到相同的上下文信息中。

系統記錄遠程調用請求在數據庫表ARFCSSTATE和ARFCSDATA中,包含它所有的參數值。你可以顯示這個日志文件使用事務SM58.當調用程序完成了工作,那么
遠程調用就進入到系統請求並進行執行。
所有的tRFCs帶有一個destination.這個destination,只在一個commit work中有效,而下一個destination,則歸屬於另一個LUW單元。對於更多的關於LUWS
TIDS和檢測tRFC狀態的信息,請看Transactional integrity of tRFCs.
tRFC 請求被傳遞,其參數數據以byte-stream 的形式傳送,使用TCP/IP 或者X400.
CALL FUNCTION ....
IN BACKGROUND TASK
DESTINATION
EXPORTING ....
TABLES ....
COMMIT WORK.
其中,函數名進入 ARFCSSTATE, 參數數據進入ARFSCDATE.
舉個例子,你可以使用tRFCs,作為特殊的更新程序。
一些復雜的對話,需要幾個關聯的數據庫表被更新,在同一個事務下的不同階段。假如更新函數需要放在遠程的機器上,並且假如表的修改操作並不需要在進入下
一個對話之前馬上進行。你可以使用tRFC.不需要等待每一個分開的更新程序都被執行。用戶可以使用tRFC,在事務的最后進行更新。
tRFC處理,確保了所有的更新計划都被執行了,當程序運行到commit work的時候。

因為是異步調用,exporting和tables參數並不需要被指定給tRFC.
注意 :
你不可以使用tRFC 機制,如果Exporting 參數被指定在函數接口中。你的CALL FUNCTION 存在一個IMPORTING參數,那么會導致編譯器出錯。
注意 :
你不能使用異步調用來執行call-back.

WHEN the Remote System is Unavalibale.
如果遠程系統不可用,那么sap系統就運行安排執行報表RSARFCSE進行后台處理。這個報表會一直執行,直到連接到想要的系統為止。
< 6 > Transactional Integrity tRFCs.完整性
你可以執行函數模塊,以后台作業的方式,在另一個R/3系統中或者一個外部的程序中。當你以這種方式進行調用,函數模塊不會馬上被執行,而是
等待,直到一個COMMIT WORK被觸發。
tRFCs接收后台作業的名稱,從語句IN BACKGROUND TASK的后綴中。因為需要更新數據庫,LUW (邏輯工作單元 ) 被創建用來調用后台作業。
所有的tRFC包含單個destination,這個destination發生在一個COMMIT WORK和下一個單獨的LUW之間。在一個給定的LUW之內,所有的都調用 :
. 執行被調用的命令
. 運行在相同的程序上下文中,在目標系統下。
. 以單獨的事務運行 :他們不是commit work就是roll back.
LUW以事務ID來識別,此ID是唯一的。這個ID可以確認一個ABAP程序,通過調用函數模塊ID_OF_BACKGROUNDTASK, (你必須調用這個函數在第一次異步調用之后
,和相關的COMMIT WORK發生之前 )

因為RFC象一個事務,所以數據庫操作要不都被執行,或者假如一個函數模塊被中斷,所有的都返回。如果一個LUW進行成功,你就不能再次執行它了。
在某些時候,從一個LUW中返回是必要的, (例如,一個表被鎖定了 ) 。如果要這樣做,你可以調用函數模塊RESTART_OF_BACKGROUNDTASK. 這個函數模塊執行一個返回
操作,並且確保LUW被在次執行,在稍后的時間里面。

一般的,LUW被馬上執行在COMMIT WORK之后,在一個指定的目標系統中。然而,假如你想要它在某個特定的時間開始執行,你可以設置一個開始時間,通過函數
START_OF_BACKGROUNDTASK,這個函數也必須在這個LUW之內被調用。同樣是,在第一次調用后台作業開始, 到COMMIT WORK發生之前。

Checking the status of Transactional Calls
所有的tRFC被保存在表ARFCSSTATE和ARFCSDATA,並且每一個LUW通過一個唯一的ID來識別。當一個COMMIT WORK發生,於這個ID相關的調用在相關的目標系統中
被執行。系統函數模塊ARFC_DEST_SHIP 傳遞數據到目標系統並且函數模塊ARFC_EXECUTE執行被存儲的函數調用。假如一個錯誤或者一個異常在某一個調用中
發生,所有的由前面的調用產生的數據庫操作都被重置,並且一個適當的錯誤信息被寫到了文件ARFCSSTATE中.
這里有兩種方式來檢測傳輸ID的狀態 :
. 從一個ABAP程序
函數模塊ID_OF_BACKGROUNDTASK 返回LUW的ID,你調用這個模塊在第一次調用后台作業的時候,和COMMIT WORK發生之前。
CALL FUNCTION 'ID_OF_BACKGROUNDTASK' IMPORTING TASK-ID = TID.

一旦你有LUW的識別ID,你可以使用函數模塊STATUS_OF_BACKGROUNDTASK 來決定tRFC的狀態。
CALL FUNCTION 'STATUS_OF_BACKGROUNDTASK'
EXPORTING TID = TASK-ID
IMPORTING ERRORTAB = ERTAB
EXCEPTIONS
COMMUNICTATION = 01
(如果連接不上,將會繼續連接 )
RECORDED = 02
ROLLBACK = 03
( Rollback 觸發在目標系統中 )

. online
調用事務SM58 (Tools - > Adminstration - > Monitoring - > Transactional RFC ).
這個工具僅列寫了處理,那些tRFCs執行不成功或者不得不被計划為批處理job的功能。這個列表包含了LUW ID和一個錯誤消息。
、 錯誤信息顯示在SM58中,這些錯誤信息來自於目標系統。 要顯示信息內容,雙擊信息。
事務SM58也可以讓你在不同的情況下控制你的tRFC.假如調用tRFC,在傳遞過程中,發生錯誤,你可能需要使用ROLLBACK LUW函數來手動的
重置LUW在試圖重新傳輸的時候。假如目標系統不可用,你可以使用后台作業函數來顯示根據你的調用而創建的批處理作業。執行函數模塊讓你
重新開始這個函數調用,在產生臨時的錯誤之后 (例如:一個語法錯誤 )
假如一個LUW在目標系統中,成功的運行了,函數模塊ARFC_DEST_CONFIRM 將被觸發並且在目標系統中確認RFC成功執行。最后表ARFCSSTATE着
ARFCSDATA的入口將被刪除。
RFC API
你可以異步執行程序,在 'C'-implemented function modules (連接類型TCP/IP,使用事務SM59,詳見Destinations類型 ).
函數模塊的執行一般要連接到RFC API.RFC API包含函數模塊ARFC_DEST_SHIP和ARFC_DEST_CONFIRM,
詳見The RFC API.

< 7 > qRFC With Send Queue
為了保證一個LUW的次序,這個次序由應用程序所決定 , tRFC通過隊列來進行序列化。這就是為什么被叫作qRFC.由於序列化,在R/3中,一個
傳遞隊列被創建給了tRFC.

另外,應用程序想要決定他們自己在那個准確的時刻在目標系統中處理LUW。一般的,外部 (非sap )系統不存在這種傳遞隊列。qRFC連同隊列
容器,包含了一個適當的RFC library的增強,目前正在開發中 (計划在下一個版本中應用 )
Motivation
目前tRFC運行的狀況如何 ?
. tRFC保證了,一個被調用的函數模塊在目標系統中准確的執行一次。
. 所有的tRFC調用都以屬於一個LUW的COMMIT WORK語句結束。每一個LUW自動的接收一個TID.
. 在一個LUW內,所有的函數模塊都在目標系統在一個隊列在他們被調用的傳遞系統中被執行。 (RFC server RFC client )
. 另外,tRFC調用單獨的單元匹配到一個單獨的LUW中。 這樣一個sub LUW包含了僅一個tRFC調用並且不依靠目前的LUW.這種sub LUW接收
他們自己的TID.
. 假如在一個LUW中,幾個destination被使用了,所有屬於某一個destination的tRFC調用,也形成一個sub LUW.然而,因為這種集成僅發生在
內部,就沒有單獨的TID分配給sub LUW了。

Disadvatages of tRFC.tRFC的不足之處。
tRFC分別處理LUW.由於有相當數量的活動的tRFC處理,這個程序在運行效率上將會下降非常明顯,在傳遞和目標系統上。
另外,在應用程序中定義的luws隊列不能夠被保留。因此,就沒法保證在通過應用程序規定的隊列中,執行事務。僅可以保證所有的LUW遲早會被傳遞。

User and Availability
應用序列tRFC,在不同環境的典型應用。
. ALE (Application Link Enabling ) 應用程序連接
. APO (Advanced Planner and Optimizer )先進計划和優化
. SFA (Sales Force Automation )
qRFC 在版本4.5B可用。
( 1 ) qRFC With Send Queue : Overviw 概覽
這個主題內容是,處理事務隊列在應用程序中的定義和可以超過一個隊列被用在一個事務中。
特性:
qRFC的特性 :
. qRFC加強了一個序列在傳遞系統方。目標系統沒有關於在傳遞系統中的序列的信息。這就允許與任何r/3,版本3.0以上的目標系統進行通信。
. qRFC是對tRFC的增強。它傳遞一個LUW,僅在它沒有原來的隊列 ( 關於定義在不同的應用程序中的隊列 )。另外,在執行一個qRFC之后,系統就
努力開始所有的在等待中的qRFC。
. 為了管理隊列,系統需要一個隊列名稱和隊列計數器對於每一個qRFC.每一個tRFC調用被分配到一個隊列名稱,這可以通過應用程序來決定。
應用程序傳遞隊列名稱,通過調用函數模塊 'TRFC_SET_QUEUE_NAME'.這個函數在每一個tRFC被序列化之前,立即被調用。詳見 : Programming
serialization. 一個隊列名稱是一個長度為24字節的文本。你可以使用任何文本,但是你不可以用 *.
. 不存在隊列的配置,因為這是一個邏輯隊列。不存在單獨的表來保存單獨的隊列。在一個R/3系統中,只有一個表用來傳遞隊列。所有的
隊列入口都被保存到了隊列表TRFCQOUT.
. 假如被序列化的tRFC 被分配到幾個destionations,系統將根據每一個destionation集合他們,並且獨立的處理他們每一個。這就在一個
LUW中產生了sub luw. 我們從老的tRFC中可以知道。 既然這樣,就不能保證sub LUW的隊列會保持,僅可以保證的是所有的sub luw遲早會被
處理。與老的tRFC對比,每一個sub LUW接收他們自己的TID來,進而可以容易的進行隊列處理。
. 當傳遞COMMIT WORK,系統決定了一個計數器來作為隊列處理次序的標准.
. 'Mixed mode' 被支持 : 一個LUW可以包含普通的tRFC調用,也包含tRFC的序列化. 不管是包含,還是不包含額外的AS SEPARATE UNIT.tRFC的調用次序
就被保證了。
< 8 > Programming Serialization.
以下程序描述了如何寫qRFC,在基本模式下 (就是,沒有額外的AS SEPARATE UNIT'mixed mode' ).
Prerequisites
. 版本在4.5B
. 所有需要的destinations都被維護在表RFCDEST中,在RFC clicent系統中
. 為了有一個好的運行效率,確定一個編號,並小心的分配這些隊列名稱.
Procedure
為了執行qRFC,步驟如下 :
1. 分配隊列名稱給並發程序調用
2 . 為了傳遞隊列名稱,調用函數TRFC_SET_QUEUE_NAME,在調用其他函數之前
3. 調用函數,使用CALL FUNCTION ... IN BACKGROUND TASK.
4. 重復第2,第3步 (如果需要的話,也包括第1步 )對所有的RFC調用.
5. 關閉LUW使用COMMIT WORK.
6. 重復第1 到第5步驟給應用程序的其他LUW調用。
例子 :
REPORT ....
....
DATA q_name LIKE TRFCQOUT-QNAME.

q_name = 'BASIS_TEST_Q1'.
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
qname = q_name.
CALL FUNCTION 'RFC_FUNCTION_1'
IN BACKGROUND TASK
DESTINATION 'DEST'
EXPROTING ...
TABLES ...
...
q_name = 'BASIS_TEST_QM'
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
qname = q_name.
CALL FUNCTION 'RFC_FUNCTION_N'
IN BACKGROUND TASK
DESTINATION 'DEST'
EXPORTING...
TABLES....
COMMIT WORK.
* 下一個LUW時間.
...

RESULT 結果
系統保存隊列信息到表TRFCQOUT.
對於每一個COMMIT WORK,系統決定了一個計數器,這個計數器保證了事務處理的次序.

系統中有個demo program : RSTRFCT0.
< 9 >使用 "Mixed Mode"
特別的類型 'Mixed Mode'是指qRFC和普通的tRFC調用處理在同一個LUW中。
程序 :
當執行 "Mixed Mode"在一個LUW期間內的時候,注意以下的問題:
假如在一個LUW期間內,最先調用普通的tRFC,首先你必須調用函數模塊TRFC_QUEUE_INITIALIZE.這個確保當前的LUW通過qRFC進行處理.
假如在一個LUW期間內,最先調用的是qRFC,那么這個初始化就有函數TRFC_SET_QUEUE_NAME來完成了。
以下程序是說明在 "mixed mode"模式下,一個LUW是如何執行的。
REPORT ....
....
DATA q_name LIKE TRFCQOUT-QNAME.
CALL FUNCTION 'TRFC_QUEUE_INITIALIZE'.
CALL FUNCTION 'RFC_FUNCTION_1' "tRFC call -> NO QUEUE沒有隊列
IN BACKGROUND TASK
DESTINATION 'DEST'
EXPORTING ...
TABLES ....
....
q_name = 'BASIS_TEST_Q1'.
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
QNAME = q_name.
CALL FUNCTION 'RFC_FUNCTION_2' "qRFC call -> Q1
IN BACKGROUND TASK
DESTINATION 'DEST'
EXPORTING ...
TABLES ...

CALL FUNCTION 'RFC_FUNCTION_N-1' "tRFC call -> NO QUEUE
IN BACKGROUND TASK
DESTINATION 'DEST'
EXPORTING ...
TABLES ...
q_name = 'BASIS_TEST_QM'.
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
qname = q_name.
CALL FUNCTION 'RFC_FUNCTION_N' " qRFC call -> QM
IN BACKGROUND TASK
DESTINATION 'DEST'
EXPORTING ...
TABLES ...
...
COMMIT WORK.

RESULT : 結果
因為事務的特性,普通的tRFC調用和qRFC調用,是相同的destination,則形成一個單元. 然而,假如在當前的LUW之內,沒有qRFC調用,系統將會
集合普通的tRFC調用到一個sub LUW中。
普通的tRFC調用包含額外的語句AS SEPARATE UNIT, 就會與分離開的LUW進行匹配,在目標系統中.
qRFC調用,包含語句AS SEPARATE UNIT. 它的處理依賴於隊列,而不是原先的 LUW.
"mixed mode"的例子,關聯到演示程序 RSTRFCT1.
< 10 > Transaction Sequence and Queue Assignment
以下例子是設計來顯示,LUW的傳輸次序和單獨的函數調用的隊列分配之間的依賴關系.這個例子演示了,在某一個事務被傳輸之后,哪個隊列被分配了。
試驗演示程序RSTRFCT3.

Sample Scenario 例子設定
隊列的使用方法
這個圖表顯示了由應用程序規定的事務次序,也顯示了各自的隊列應用在單獨的函數調用上.
例如 : 事務T3 包含了2 個 qRFC調用,並分配給了隊列Q1和另兩個qRFC調用分配給了Q3.
相反,事務T6僅包含了qRFC調用,使用語句AS SEPARATE UNIT,分配給了隊列Q6.
T1 - > Q1 Q1 Q2 Q2 Q3 Q3 Q4 Q4
T2 - > Q5 Q5 Q6 Q6 Q7 Q7 Q8
T3 - > Q1 Q1 Q3 Q3
T4 - > Q2 Q2 Q4 Q4
T5 - > Q6 Q7S Q8S Q7 Q7
T6 - > Q6S
T7 - > Q7S

隊列的分配
在傳輸之前
從隊列的使用上看,上面的例子中,隊列的最初的分配結果如下 :
Q1 T1Q1N1 T1Q1N2 T3Q1N1 T3Q1N2
Q2 T1Q2N1 T1Q2N2 T4Q2N1 T4Q2N2
Q3 T1Q3N1 T1Q3N2 T3Q3N1 T3Q3N2
Q4 T1Q4N1 T1Q4N2 T4Q4N1 T4Q4N2
Q5 T2Q5N1 T2Q5N2
Q6 T2Q6N1 T2Q6N2 T5Q6N1 T6Q6S1
Q7 T2Q7N1 T2Q7N2 T5Q7S1 T5Q7N1 T5Q7N2 T7Q7S1
Q8 T2Q8N1 T5Q8S1
在傳遞T1之后.
在事務T1被成功傳遞之后,事務T3和T4准備進行傳遞了。
這就導致了下面的隊列的分配 :
Q1
Q2
Q3
Q4
Q5 T2Q5N1 T2Q5N2
Q6 T2Q6N1 T2Q6N2 T5Q6N1 T6Q6S1
Q7 T2Q7N1 T2Q7N2 T5Q7S1 T5Q7N1 T5Q7N2 T7Q7S1
Q8 T2Q8N1 T5Q8S1

首先,T1的調用被傳遞在所有的包含T1的隊列中 (Q1,Q2,Q3和Q4 ).
所有其他獨立的事務,與T1共享部分隊列的也准備傳遞,在這之后.
既然這樣,就有事務T3和T4,被處理.
事務T2,T5,T6和T7仍然處於等待狀態,直到T3和T4被成功的傳遞為止.
在這之后,等待的事務就開始自動的處理,一個接一個.

< 11 >工具
Passing Queue Names :傳遞隊列名稱
TRFC_SET_QUEUE_NAME
這個函數模塊傳遞一個隊列的名稱,在tRFC調用之前.並且規定了當前的LUW必須被處理,通過qRFC.
隊列名稱傳遞,僅在並發的tRFC調用時有效.

Reading Queue Entries : 讀取隊列的入口
TRFC_GET_QUEUE_INFO 和 TRFC_GET_QUEUE_INFO_DETAILS
使用這些函數模塊,來讀取當前的一個或者全部隊列的信息從表TRFCQUOT中,以復雜或稍微簡單的方式.

RSTRFCQR. (是程序 )
這是abap程序使用的兩個上面提到的函數模塊,來顯示當前的傳遞的隊列表TRFCQUOT的內容.

RSTRFCQD. (是程序 )
這個是abap程序,刪除所有的單個或者全部事務對應的入口.使用這個程序來進行測試目的或者顯示緊急情況.假如你刪除掉一個事務的
入口,那么這個事務就不在序列化.你就不得不手動來啟動,如果要再次啟動.
Initializing In 'Mixed Mode'
TRFC_QUEUE_INITIALIZE
調用這個不需要參數的的函數模塊,在qRFC LUW的開始的時候,在 "mixed mode"模式中(即使用tRFC也使用qRFC). 調用這個函數,規定了,當前的
LUW必須通過qRFC傳遞.然而,這個僅在最先調用普通的tRFC的時候有必要.假如最先調用一個qRFC,初始化就由函數模塊TRFC_SET_QUEUE_NAME,來處理.
看演示程序RSTRFCT1.
SM58
事務SM58,你可以使用tRFC的監控器來顯示和編輯tRFC的事務,現同樣允許處理qRFC事務.

Stopping Queues, Continuing Them, and Querying Their Status
你可以停止並且繼續處理一個或者更多的隊列 (使用普通的規范 ).另外,你看查詢一個隊列的狀態.使用下面的函數模塊 :

TRFC_QOUT_STOP.
指定一個隊列名稱 (單個或者一般的,例如 :BASIS_TEST_ *)和一個destination,來停止處理一個或者更多的隊列.依靠FORCE參數,你可以馬上停止處理
(參數FORCE = 'X)或者處理在這個時刻存在於隊列中的所有的請求,然后在停止。你也可以停止一個空的隊。在這種情況下,
所有分配到這個隊列的事務不會馬上被傳遞。看演示程序RSTRFCQ1.
TRFC_QOUT_STATE
指定一個隊列的名稱和一個目標地址 (destination ),目的是為了查詢這個隊列的狀態。看演示程序RSTRFCQ2.
一個隊列可以是以下狀態中的一個 :
. RUNNING 運行
. CPICERR
. SYSFAIL 系統錯誤
. STOPPING 正在停止
. STOP 停止
. WAITSTOP 等待停止

狀態SYSFAIL,是由一系列錯誤產生的,並且由目標系統的R/3內核或者被調函數模塊的一個異常觸發。 在這個狀態中,隊列仍然保留。但不會自動的重新運行。
你可以使用SM58來重新傳遞LUW或者刪除它。假如你刪除了它。系統自動的刪除相關的入口,在隊列表TRFCQOUT中。
在狀態CPICERR,存在一個自動的循環依靠在SM59中的destination配置. (默認設置為 "Yes")。
TRFC_QOUT_RESTART
指定一個隊列的名稱 (單個或者普通的,例如BASIS_TEST_ *)和一個destination,目的是為了可以繼續處理一個或者更多的隊列,不管這些隊列是否在之前被一個隊列
停止函數模塊 (參數FORCE )或者被狀態CPICERR或者狀態SYSFAIL停止.看演示程序RSTRFCQ3.
TRFC_QOUT_RESTART_COND
指定一個隊列名稱 (單個或者普通的,例如BASIS_TEST_ *) 和一個destination,目的是為了,當出現處理一個或更多的其他隊列被中斷的時候,繼續處理一個或更多
的隊列。調用這個函數,將自動的停止在此刻正在進行中或准備進行的的隊列,假如之前沒有其他停止調用 ( STOP CALL )發生 (依賴於參數FORCE的設置 )
看演示程序RSTRFCQ4。

Sample Programs
. RSTRFCT0, RSTRFCT1, RSTRFCT2, 和 RSTRFCT3是qRFC的例子或者測試程序,
. 通過RSTRFCQ1, RSTRFCQ2, RSTRFCQ3, 和 RSTRFCQ4,你可以停止處理一個或者更多的隊列,繼續其他處理,通過有條件或者無條件調用。或者查詢隊列的狀態。
< 12 > Using Asynchronous Remote Function Calls
異步遠程調用 ( aRFCs )與tRFCs類似,在異步遠程調用時,使用者不需要等待這些他們的完成,在繼續調用對話的時候。他們有三個特性,來區別於tRFCs :
. 當調用者開始一個異步調用,被調函數所在的服務器必須可以接受請求。aRFCs的參數不是登陸到數據庫,而是直接傳遞到了服務器上。
. aRFCs 允許用戶與遠程系統,持續一個交互式的對話。
. 調用函數所在程序可以接收到aRFCs處理的結果。
你可以使用aRFC,無論何時,你需要建立與一個遠程系統的通訊,但是不需要等待函數的處理結果,在繼續其他處理的時候。
aRFCs 也可以傳遞到相同的系統中。在這種情況下,系統開啟一個新的對話 (或者窗口 ),並且允許你來回的傳遞數據在調用會話和被調會話之間。

要開始一個aRFC,使用下列的語法 :
CALL FUNCTION RemoteFunction STARTING NEW TASK taskname
Destination ...
EXPORTING ...
TABLES ...
EXCEPTIONS ...

下面可用的調用參數 :
. TABLES
傳遞內表的引用。所有的函數模塊,tables參數,必須包含數據。
. EXPORTING
傳遞字段參數和字段字符,從調用程序到函數中。在函數模塊中,先前相對應的參數被定義為import參數。
. EXCEPTIONS
請看 使用預先定義的異常
RECEIVE RESULTS FROM FUNCTION func被使用在一個子程序中,來接收aRFC的結果。下面的接收參數可用 :
. IMPORTING
. TABLES
. EXCEPTIONS
額外的KEEPING TASK 避免了一個異步連接在接收完處理結果數據后,被關閉。相關的遠程上下文 (roll area )被保持,以用來重復使用,
直到調用者關閉連接。
異步調用一個事務並且將它顯示在一個形式對話框中 :
DATA : MSG_TEXT ( 80 ) TYPE c. "Message text
...
* Asynchronous call to transaction SM59 - >
* Create a new session
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'TEST'
DESTINATION 'NONE'
EXPROTING
TCODE = 'SM59'
EXCEPTIONS
COMMUNICATION_FAILURE = 1 MESSAGE MSG_TEXT
SYSTEM_FAILURE = 2 MESSAGE MSG_TEXT

IF SY-SUBRC NE 0.
WRITE : MSG_TEXT.
ELSE.
WRITE : 'O.K.'.
ENDIF.

< 13 > Calling Requirements for Asynchronous RFCs
當你調用一個遠程函數,使用可選擇后綴STARTING NEW TASK, 系統在一個新的會話中開始這個函數。相對於等待遠程調用的結束,在aRFC中,用戶在目標系統中
一完成函數模塊的調用就可以繼續其他處理。
列如:遠程被調用函數模塊可以顯示一個新的屏幕,通過使用CALL SCREEN, 允許用戶進入一個對話,這個對話直接連接他或者她到一個遠程系統中。
Client System
CALL FUNCTION 'TRAVEL_CREATE_FLIGHT'
STARTING NEW TASK 'FLIGHT'
DESTINATION 'S11'.
Server System
FUNCTION TRVEL_CREATE_FLIGHT.
CALL SCREEN 100.
ENDFUNCTION.
假如你不指定一個destination,aRFC機制在調用系統中開始一個新的會話。

Warning :
你不允許使用IMPORTING,當調用一個aRFCs的時候。 (因為返回的結果,並不由原先的函數接收,而是通過其他來接受,下面將講述異步接受 )
Receiving Results from an Asynchronous RFC
為了從一個異步調用函數中,接收結果,使用下面的語法 :
CALL FUNCTION remoteFuntion
STARTING NEW TASK Task
PERFORMING RETURN_FROM ON END OF TASK.
一旦被調用函數完成,在調用程序的下一個對話步驟 (例如 : AT USER-COMMAND ),將引導系統進入到子程序中,這個子程序將用來檢測結果。這個子程序
包含一個特殊的餓語法,並且在使用時,必須使用的一個參數,是上面的task 名稱。
Client System
CALL FUNCTION 'TRAVEL_CREATE_FLIGHT'
STARTING NEW TASK 'FLIGHT'
DESTINATION 'S11'
PERFORMING RETURN_FLIGHT ON END OF TASK.
...
FORM RETURN_FLIGHT USING TASKNAME.
RECEIVE RESULTS FROM FUNCTION 'TRAVEL_CREATE_FLIGHT'
IMPORTING FLIGHTID = SFLIGHT-ID
EXCEPTIONS SYSTEM_FAILURE MESSAGE SYSTEM_MSG.
SET USER-COMMAND 'OKCD' .
ENDFORM.

. 假如一個函數模塊沒有返回結果,那么額外的PERFORMING RETURN_FORM ON END OF TASK可以被省略。
. 假如一個異步調用,調用了幾個連續的函數模塊,使用相同的destination, 你必須分配一個不同的task name給每一個函數。
. 一個調用程序開始一個aRFC,使用了PERFORMING, 但是不能夠轉換roll areas或者轉變為一個內部模式。這是因為異步函數模塊調用的返回,不能
被傳遞到相關的程序中。你可以執行一個roll area,使用SUBMIT 或者 CALL TRANSACTION.
. 假如執行異步調用的調用程序被停止,不管它正在接受返回信息,這些來自異步調用的返回信息不允許被傳遞。
. 你可以使用WAIT語句,連同PERFORMING form ON END OF TASK,來等待先前開始的異步調用的返回。在這種情況下,WAIT語句必須在相同的程序上下文。

Receiving Results from an Asynchronous RFC
. 在WAIT之后,程序繼續進行下面處理。 想要獲取更多的WAIT語句信息,查看ABAP編輯器中的在線幫助。
關鍵子RECEIVE的觸發,僅在使用函數模塊調用CALL FUNCTION func STARTING NEW TASK taskname.
如果函數模塊沒有返回值,那么這個部分就不需要被定義了。

注意 :關鍵子RECEIVE在R/3版本3. 0 以上可用。因此,server,client系統,必須都是在版本3.0以上。
如果需要更多的信息,請看ABAP編輯器中的在線幫助。
語句SET USER-COMMAND 'OKCD'的效果是, 就象用戶按了按鈕一樣。這意味着當前的列表位置以及關閉位置將會被考慮。
注意 : 回調不被支持。 No call-backs are supported.
警告 : SET USER-COMMAND 'OKCD' 語句代替了REFRESH SCREEN 命令。 REFRESH SCREEN 不在被維持,因此不要用。

例子 :
DATA : INFO LIKE RFCSI,
* Result of RFC_SYSTEM_INFO function
MSG ( 80 ) VALUE SPACE.
* Exception handling
CALL FUNCTION 'RFC_SYSTEM_INFO'
STARTING NEW TASK 'INFO'
PERFORMING RETURN_INFO ON END OF TASk
EXCEPTIONS
COMMUNICATION_FAILURE = 1 MESSAGE MSG
COMMUNICATION_FAILURE = 2 MESSAGE MSG.

IF SY-SUBRC = 0.
WRITE : 'Wait for reply'.
ELSE.
WRITE MSG.
ENDIF.
...
AT USER-COMMAND.
* Return from Form routine RETURN_INFO via SET USER-COMMAND
IF SY-UCOMM = 'OKCD'.
IF MSG = SPACE.
WRITE : 'Destination = ', INFO-RFCDEST.
ELSE.
WRITE MSG.
ENDIF.
ENDIF.
...
FORM RETURN_INFO USING TASKNAME.
RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'
IMPORTING RFCSI_EXPORT = INFO
EXCEPTIONS
COMMUNICATION_FAILURE = 1 MESSAGE MSG
SYSTEM_FAILURE = 2 MESSAGE MSG.
SET USER-COMMAND 'OKCD'.
ENDFORM.

Keeping the Remote Context
在獲取異步調用的結果的子程序中,額外語句KEEPING TASK,避免了在接收完數據后,關閉異步連接。
FROM RETURN_INFO USING TASKNAME.
RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'.
KEEPING TASK
...
ENDFORM.
相關遠程上下文 (roll area )被保持,一直到調用者關閉這個連接。假如你指定了相同的作業名稱,你可以重新使用遠程上下文和roll area.

假如遠程調用函數執行的是交互式的任務,如處理列表或者屏幕,屏幕會一直顯示直到調用程序中斷為止。假如遠程調用處於調試模式下,這種模式
是可見的,直到調用對話被關閉。
注意: 僅在你想要重復使用當前的遠程上下文為后續的異步調用服務時,你可以使用額外的KEEPING TASK.
保持一個遠程上下文會增加內存的使用,以及降低程序執行效率,因為,在系統中,要進行額外的roll area,管理。

Parallel Processing with Asynchronous RFC
為了完成系統的負載平衡,你可以使用destination additions,在parallel task中,執行函數模塊,在任何應用服務器,或者一個預先定義的應用服務器組。
警告 :
平衡處理被執行,使用一個特殊的異步RFC變量。這在你使用僅正確的變量給你自己的平衡處理程序的時候,非常重要 :
CALL FUNCTION STARTING NEW TASK DESTINATION IN GROUP keyword.
使用其他的aRFC變量,圍繞內置的安全裝置在正確的關鍵字下。

更加詳細的討論在以下子分部中 :
. 平衡處理的先決條件
. 進行平衡處理的函數模塊和abap關鍵字
. 在平衡處理中的資源管理
Prerequisites for Parallel Processing : 平衡處理的先決條件
在你執行平衡處理之前,確認你的應用程序和你的R/3系統滿足以下要求 :
. 邏輯獨立工作單元
在parallel 處理中,被執行的數據處理作業必須是作業的其他實例的獨立邏輯。 更確切的說,可以被執行的作業,不包含關聯到其他記錄的相同的數據集,
(就是,數據是單享的 ),並且作業是不依靠其他parallel操作的結果的。例如: parallel處理就不合適處理這樣的數據,這些數據必須被持續處理的,或者
是在某個處理中的數據條目,依賴於處理中的其他數據條目。
通過定義,無法保證,數據將被處理在一個特定的順序中,在parallel處理中,或者一個特定的結果將被可用,在處理時候的一個給定的時刻上。
. ABAP 需求
- 你所調用的函數模塊必須被設置為可以外部調用。這個屬性是指定為Remote function call supported, 在函數模塊定義的時候。
- 被調用的函數模塊不允許包含一個函數調用,作為destination 的返回 "BACK".
- 調用程序不應該轉變為一個新的內部session,在做一個異步RFC調用的時候。更確切的說,你不應該使用SUBMIT或者CALL TRANSACTION,在使用
CALL FUNCTION STARTING NEW TASK 之后的報表中。
- 你不可以使用CALL FUNCTION STARTING NEW TASK DESTINATION IN GROUP keyword 來開始一個外部程序。


Parallel Processing with Asynchronous RFC
為了處理來自parallel jobs的作業,在你R/3系統中的服務必須有至少3個對話工作處理。

Function Modules and ABAP Keywords for Parallel Processing
你可以執行parallel處理, 在你的應用程序中,通過使用以下的函數模塊而ABAP關鍵字 :
. SPBT_INITIALIZE : 可選函數模塊。
用來決定進行parallel處理的資源是否可用。
你可以完成以下 :
- 檢測你已指定的parallel 處理group是否正確
- 找出多少工作處理可用,這樣,你可以更有效的設置數據包的大小。
. CALL FUNCTION < function > STARTING NEW TASK <taskname > DESTINATION IN GROUP :
使用這個abap關鍵字,使R/3系統,執行函數調用在parallel模式下。 具有代表性的,你將可以放置這個關鍵字在一個循環中,在這個循環你可以把
數據分離開, 放入一個包中。你可以傳遞要進行處理的數據,以一個內表的形式 ( EXPORT,TABLE參數 )

注意:你的RFC調用,使用CALL FUNCTION進行處理,工作進程類型是DIALOG.這個DIALOG只有一個對話步驟的時間 (大約300秒,系統參數 rdisp/max_wprun_time )
應用到RFC調用中。記住這個限定,當你想要划分數據到parallel處理的時候。
. SPBT_GET_PP_DESTINATION : 可選擇函數模塊
在CALL FUNCTION keyword之間馬上被調用,用作獲取服務的名稱。 parallel處理作業將運行在這個服務上。

. SPBT_DO_NOT_USE_SERVER : 可選函數模塊
不包含一個特定的服務,進行使用。

. WAIT : ABAP 關鍵字
WAIT UNTIL <邏輯表達式 >
鍵入你想要等所有的異步parallel作業被創建,通過使用CALL FUNCTION來返回的時候,就需要了。
或許僅在CALL FUNCTION包含PERFORMING ON RETURN 的情況下被使用。
. RECEIVE : abap關鍵字
RECEIVE RESULT FROM FUNCTION function
假如你希望接收來自aRFC的處理。 RECEIVE 重新獲取 IMPROT和TABLE參數,連同信息和返回代碼。 ( MESSAGE SY-SUBRC )

Managing Resources in Parallel Processing
你可以使用以下的目標,增加運行parallel執行函數模塊。
在一個預先定義的應用服務組 :
CALL FUNCTION RemoteFunction STARTING NEW TASK taskname
Destination IN GROUP groupname
匯總當前所有可用和活動的服務 :
CALL FUNCTION RemoteFunction STARTING NEW TASK Task
Destination IN GROUP DEFAULT.
增加的語句,首先決定了當前可用的資源的數量。在每一個應用服務器上的,可用於執行異步調用的資源,依靠當前系統的負載。
應用程序開發者,在生產機上,對可用的RFCs groups負有責任。更詳細的請看,如何維護RFC groups.

在確定可用資源后,異步調用被執行在一個可用的應用服務上。 假如沒有資源可用,在一個特定的時間上,系統會執行異常程序RESOURCE_FAILURE (請看Exceptions異常 )
在這種情況下,一個異步函數模塊的調用,這個異常必須被應用程序所處理。
確定一個RFC group的可用資源的過程如下 :
首先,系統確定發送隊列的長度。假如它比全部的長度大10%,服務就沒有可用資源。假如它稍微小點,系統創建可用的的當前自由對話的進程數量減去2 (作為其他目的的
貯備,例如:登陸到系統或者管理程序 )
因而,一個應用服務必須有至少3個對話進程,假如RFC parallel 處理要被考慮的話。
注意:
. 在當前,一個程序中僅一個RFC group被支持paralle執行異步調用。使用兩者 (DESTIANTION IN GROUP <groupname > 和 DESTINATION IN GROUP DEFAULT )
在一個程序中是不被允許的。
. 異常程序 RESOURCE_FAILURE 僅被觸發在連接aRFCs的時候,使用語句DESTIANTION IN GROUP groupname 和 DESTINATION IN GROUP DEFAULT.
. 推薦使用一個RFC group,當有足夠的資源進行parallel處理,異步調用。

< 14 > Checking Authorizations for RFC. RFC權限檢測
假如系統參數auth/rfc_authority_check 被設置為 (值1 ),那么系統自動的檢測,在CALL FUNCTION關鍵字,用戶是否有調用RFC的權限。

RFC權限對象是S_RFC,檢測使用RFC權限。一個用戶是否有權力運行屬於某個組的函數模塊,
你可以測試一個用戶的RFC權限使用函數模塊 AUTHORITY_CHECK_RFC.這個函數模塊返回RC = 0,假如用戶被授權。函數模塊不能檢測,一個權限檢測是否發生。

< 15 > Using Pre-Defined Exceptions for RFC : 使用預先定義的RFC異常
當任何異常發生,在被叫函數模塊中,通過語句 PERFORMING form ON END OF TASK 處理, RFC接口定義了兩中類型的異常,他們是 :
. SYSTEM_FAILURE :
這個異常報告所有的故障和系統的問題,在遠程系統上。
. COMMUNICATION_FAILURE
這個異常在,當一個連接或者通信失敗時發生。它不報告系統的問題, (例如:不正常的中斷 )
Requesting Error Messages : 所需要的error信息
在你調用的函數模塊中,你應該使用異常處理任何錯誤報告,而不是MESSAGE 關鍵字。
CALL FUNCTION RemoteFunction
DESTINATION 'hw1071_53'
EXCEPTION ...
IMPORTING ...
TABLES ...
EXCEPTIONS
SYSTEM_FAILURE = 1 MESSAGE msg
COMMUNICATION_FAILURE = 2 MESSAGE msg
系統設置了msg變量來獲取系統信息。你可以顯示這個信息或者寫入到一個文件中。不要試圖解釋信息文本,在你的程序中。
< 16 > Writing Remote Function Modules In ABAP
這部分提供了寫RFC的詳細說明。
Steps for Implementing Remote Function Modules
步驟:
1. 注冊RFC到服務系統中。
SE37, 設置為REMOTE CALL.
2. 寫函數代碼
3. 在RFC client system上定義RFC server的 destination.
保存在表RFCDES上,使用事務SM59.如何維護,請看主題:維護遠程目標地址。

Programming Guidelines : 程序指導
聲明參數 :
下面的部分描述了一些當你寫一個遠程調用函數需要記住的地方。
Declaring Parameters
對於普通的函數 (非遠程 ),假如一個參數沒有被定義為一個ABAP數據字典字段,那么它將使用實際的參數的數據類型在運行時。
但是,一個遠程函數模塊,這些信息是不可用的。那么就產生了一個結果,所有的參數字段必須被定義為相關的字段。也就是說,abap的數據字典字段。 (這里包括
IMPORTING, EXPORTING,和TABLES參數。 )

對於字符結構或者字段,調用者的參數不需要如被調用函數期望的那么長。當輸入參數長度短,RFC簡單的就以零墊補。這就意味着ABAP字典定義的字符參數不需要
嚴格的相同在調用方和被調用方。 (然而,調用者參數不會比在被調用方期望的那樣長 )
Writing for Transaction Execution
警告 : 這里有兩個嚴格要求,在寫遠程函數的時候,
. 事務方式的調用不能返回參數的值。結果,這些函數的接口不允許指定任何EXPORT 參數。
. 以事務方式調用的函數,不可以執行call-backs : 調用者的上下文仍然存在,就不是很必要,當call-back被接替轉播到原先的系統。

Reporting on Exceptions
你可以喚起異常在一個遠程函數中,就象你在本地函數中喚起異常那樣。
自從系統以內部方式喚起COMMUNICATION_FAILURE和SYSTEM_FAILURE,那就沒有理由在你的程序中喚起它們。MESSAGE關鍵字僅為相關聯系統異常的描述。
因此你需要將他們編入你的函數中。
Calling Other Remote Functions
一個遠程調用函數可以調用其他的函數,就象一個普通的函數一樣。
特別的是,它可以使用call-back特性來調用原先系統中的調用者。
< 17 > Debugging Remote Function Modules
當測試一個ABAP 到abap的RFC調用,你可以使用abap調試器來監控,在遠程系統中,RFC函數的執行。靜態的斷點,單步執行,變量查看和源代碼顯示都可用。
進行遠程調用的時候,ABAP編輯器 (包括調試器接口 )運行在原先系統中的,數據值和其他運行遠程調用需要的信息從遠程系統中傳遞進來。
Maintaining Remote Destinations
選擇Tools - > Administration - > Administration - > Newwork - > RFC destinations.
具體的解釋在以下主題:
Types of Destinations 目標地址的類型
Displaying,Maintaining 和 Testing Destinations 顯示,維護和測試目標地址
Entering Destination Parameters 輸入目標地址參數
Maintaining Group Destinations 維護目標地址組

Displaying,Maintaining and Testing Destinations
為了顯示,創建或者修改目標地址,選擇Tools - > Administration - > Administration - > Newwork - > RFC目標地址 或者 輸入事務代碼SM59.
遠程目標地址被保存在表RFCDES中。RFCDES表描述了遠程函數調用的邏輯目標地址。
直接維護表RFCDES是不可能的.

注意 :
你可以進入邏輯目標地址通過執行IMG,選擇Tools - > AcceleratedSAP - > Customizing - > Execute Project - > SAP Reference IMG.
在執行指南,張開層次結構。
Basis
Application Link Enabling (ALE )
Sending and Receiving Systems
Systems in Network
Define Target System for RFC Calls

顯示目標地址
創建目標地址
在目標地址的查看屏幕中 (事務代碼SM59 ),連接類型和所有存在的目標地址都顯示在一個樹形結構。
所有可用的連接類型都在Types of Destinations有注釋。
為了新建RFC目標地址,按創建按鈕。一個新的屏幕會顯示出來,包含空的字段,需要你填入。
假如你想要創建一個新的目標地址
當你創建一個遠程目標地址,你可以指定一個特別的應用服務或者一組服務來進行負載平衡。
修改已存在的目標地址
事務代碼SM59進入。雙擊進入修改。
測試目標地址
為了測試目標地址,選擇適當的函數從測試菜單中。
. 連接 (通過測試連接按扭也可用 )
. 授權 (檢測登陸數據 )
. 本地網絡 (提供一列應用服務 )
輸入目標地址的參數
除了RFC的目標地址,你可以輸入以下信息 :
Technical settings
. Connection type :連接類型
輸入一個已經存在的連接類型或者選擇一個, 通過字段輸入幫助。
. Trace : 追蹤
標注一個追蹤選項,記錄RFC通訊日志並保存到一個文件中。你可以顯示這個文件,即可以在調用系統也可以在接受系統,使用報表RSRFCTRC.
. Load balance:負載平衡
假如你選擇負載平衡,你必須指定以下的信息 :
- Target system :目標系統
- Message server (登陸到目標系統,然后選擇Control- > control Panel從CCMS主菜單上。提供信息服務的服務 )
- Group ( of servers )
另外,你還需要指定以下信息 :
- Target host 目標系統
目標系統的服務器名稱,你需要用它來作為端口.
- System number 系統編號
通訊服務被應用到目標系統,為了獲取它,選擇Tools - > Administration - > Monitor - > System Monitor - > Servers.

Security Options : 安全選項
下面的選項僅可用於一些連接類型 :
. Trusted system ( for type 3 only )
假如目標系統是一個可信賴的系統,選擇yes。
. SNC (安全網絡通訊,近用於類型3和T )
假如你有一個活動的SNC-supported安全系統,你可以激活額外的安全選項,通過Destinaions - > SNC 選項可以設置。

登陸 :
. 語言
系統被使用的語言
. Client
Client 代碼
. User
被用來遠程登陸的用戶名,假如與當前的用戶名不同。
. Password
用戶密碼
. Current user
當前用戶名被使用來進行遠程登陸。
. Unencrypted password ( 2. 0 )
假如目標系統在R/3系統的版本是2. 0,密碼就不需要被加密了。

Types of Destinations
每一個目標地址都有一個連接類型字段,這個連接類型,告訴系統,這是何種系統連接 :
. R/2 連接 ( Type 2 )
Type 2 入口指定到R/2系統。不需要其他詳細的說明了。例如: 當你創建一個類型2的入口,你僅僅需要給出服務器的名稱;所有的通訊信息
已經被保存到了表中。然而,假如需要,你可以指出登陸信息。
. R/3連接 ( Type 3 )
Type3入口指定給R/3系統。 當你創建了一個類型3的入口,你必須給出服務器名稱和通訊服務。你也可以指定登陸信息,假如需要的話。從R/3系統,版本
3.0以上,你也可以負載平衡選項,假如需要的話。
從R/3系統,版本3.0以上,指定一個應用服務從R/3信息系統。然后,應用服務通過負載平衡處理來決定。這可以應用到R/3系統也可以應用到r/3 系統
的外部調用。
. 內部連接 ( Type I )
Type I 入口指定到R/3系統,連接相同的資料庫,作為當前系統。這些入口是預先定義的, 並且不能被修改。這些入口名稱與SAP Message服務上的一直
(事務SM51 )
例如:入口名稱 : hs0010_k11_23
- hs0010 = host name
- k11 = system name ( data base name )
- 24 = TCP-server name
. 邏輯目標地址Logical destinations ( Type L )
代替指定一個系統的連接,類型L 入口關聯到一個物理目標。類型L目標地址也可以關聯到其他的類型L入口。一個類型L入口使用信息在 "referred-to"
入口,並且添加它自己的更多的信息。特別的, "referred-to"入口給出了服務器信息,並且類型-L入口給出了登陸數據。你也可以設置用戶名稱,一個
清楚的密碼,一個登陸語言或者一個清楚客戶端。
一個類型L入口可以連接到其他的L類型入口。
例如 入口名稱 : k11_sd 或者 k11_01
- k11 = 目標地址的名稱,
- SD 或者 01 :
. 通過ABAP驅動連接 ( Type X )
Type X入口指定了系統中,已經臨時安裝的設備驅動在那里。當你創建一個類型X 的入口,你必須給出ABAP設備的驅動。

. TCP/IP連接 (類型T )
類型T的目標地址連接到外部程序,這些外部程序使用RFC API來接收RFCs. 激活類型可以為Start或Registration.

假如是Start,你必須指定程序中的服務器名稱和路徑名稱。
Activation Type Start
通信方法依賴於你如何選擇程序的定位:
- Explicit host. 外在的主機
在這種情況下,程序被啟動,不是通過默認的系統的網關就是通過明確地被指定的網關 (gwrd ),選擇remote shell.
保證有網關處理的電腦可以進入到指定的電腦上,通過輸入/etc/ping <host name >.
為了能夠運行另外台電腦中的程序,通過使用remote shell, 目標系統不惜滿足某些條件。
. 網關處理的用戶的ID必須存在並且一個文件叫.rhosts的必須顯示在用戶的根目錄中。
. 文件.rhosts必須包含調用電腦的名稱。
為了檢測這個,登陸包含網關處理的電腦,使用合適的用戶ID並且輸入命令remsh <host name > < program name > . <host name >< program name >必須相同在
SM59中。 (假如你調用一個RFC服務程序,不包含任何的參數,RfcAccept call 總是會返回一個錯誤代碼 (RFC_HANDLE_NULL ) 並且程序立即被中斷了。 )
- Application server
在選擇應用服務和指定到你的程序,你可以從SAP應用服務中開始程序。
首先,確保可以從SAP應用服務中進入到程序,並且SAP應用服務有開始程序的權限。
為了檢測這些,使用SAP應用服務的用戶進行登陸。假如可能,改變SAP應用服務的工作文件夾 (/user/sap/.../D.../work )並且努力從這里手動開始SAP應用服務。
( 在是上面的情況下,假如你調用一個RFC server 程序,沒有帶任何參數,RfcAccept call總是會返回一個錯誤代碼 (RFC_HANDLE_NULL )並且程序立即被終止 )

- Front-end workstation
在選擇Front-end workstation 並且指定到你的程序中,你可以從SAPGUI中啟動程序。
確保你可以通過SAPGUI進入到程序中。
Types of Destinations
確保SAPGUI有權限啟動程序。
為檢測這個,簡單的調用RFC server 程序在你的環境下。
函數模塊的調用也可以用事務處理 ( CALL FUNCTION ... IN BACKGROUND TASK DESTINATION... ) .

Activation Type Registration
假如激活的類型是Registration,你必須識別一個已經注冊的RFC程序。通過一個SAP網關,一個RFC server 程序,可以被注冊到這個ID下,然后等待來自不同SAP
系統的RFC 調用。
例子 : SERVER_EXEC.
. Type M
類型M的入口,是異步RFC連接到R/3系統,通過CMC (protocol x. 400 ).

. Type S
類型s與類型2相對應,除了目標地址是SNA或者APPC.

Maintaining Group Destinations : 維護目標地址組
為了實現目標系統的負載平衡,你必須定義一個應用服務組作為RFC的destination.當處理平衡作業的時候,你可以使用這個group destionation來連接異步RFC.
每個應用服務的可用資源依賴於當前系統的負載。

為了顯示和維護RFC組,處理如下 :
1. 在RFC destionation 瀏覽屏幕中,選擇RFC - >RFC groups.
你將看到 :
- 任何一個RFC組的名稱已經被定義了。
- 一個實例的列表 (主機,系統,實例編號 ) 在你的R/3系統中。
- 每台服務器的當前狀態 (活動或否 )
2. 為了定義一個RFC組,選擇Edit- > create.輸入一個服務器組的名稱和一個實例對象在對話框窗口。
為了添加實例到一個已經存在的組中,雙擊組名並輸入新的實例對象到對話框窗口中。
通過創建重復的入口,你可以分配一個服務器到多個組中。既然這樣,使用組的作業將由空閑的進程完成,在共享的服務器上。
使用例子 :
你可以使用組來允許不同的平衡處理作業運行,在相同的時候,不通過相同的服務器完成。既然這樣,不同的組被使用來操作作業,被指定到不同的服務器上。
你也可以使用組來分開處理作業,在用戶對話活動的服務器上。既然這樣, 被用來處理的組可以命名為servers而不同於那些提供給用戶的登陸組。
< 18 > Maintaining Trust Relationships Between R/3 Systems
R/3系統可以在彼此之間建立信賴關系。
假如一個調用的R/3系統被被調系統認作值得信賴的系統,那就不需要提供任何密碼。
進行調用的系統必須被注冊到被調系統中,作為一個值得信賴的系統。
維護創建 :SMT1.
不詳述.

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com