RFC
可以在SAP系統之間、SAP系統與非SAP系統之間進行遠程調用,且調用可以是雙向的(SAP系統可以調用非SAP系統、非SAP系統也可以調用SAP系統——如Java通過Jco連接器來訪問SAP):
RFM限制
RFM:支持遠程調用的功能模塊。即SAP系統中的函數可以被其他SAP或非SAP系統調用
在SAP中,RFM的創建方式與普通功能模塊類似,只是編寫功能模塊時,需要在Attributes選項卡中,將Processiong Type選項設定為Remote-Enabled Module。除了選中Remote-Enabled Module外,RFM還有如下要求:
參數聲明:普通的FM定義形參時,並不一定要為參數指明所參照的類型(即可以不指類型,為通用類型),具體類型可在運行時根據實參類型確定,但RFM不能在運行時確定參數類型,因而必須在參數定義時必須指定參數的類型。此外,RFM中的參數必須指定為值傳遞(參數設定中的Pass Value選項)。(注:Table類型參數沒有PassValue可選擇,系統會默認隱式進行值傳遞)
參數格式轉換:對於字符類型參數,傳遞過來的實參與RFM形參數定義的長度並不需要完全一致。如果傳遞進來的參數較短,RFC將在后面補充空格。但是調用方實參的定義長度不應大於被調用方形式的定義長度
異常處理:基於ABAP類異常是不能從RFM中拋回給調用系統的,因此避免使用。但可以通過老式的異常處理方式RAISE語句來拋出。此外,RFC接口還定義了兩種預設的系統異常類型:
l SYSTEM_FAILURE,該異常報告遠程系統中的所有失敗和系統問題。
l COMMUNICATION_FAILUES,如果連接不能建立或通信中連接中斷,將出現此異常。
在調用遠程FRM時,調用方會可以使用這兩種異常,因此不必在被調用者實現的程序代碼中進行顯示拋出。但在調用RFC功能模塊時,必須進行捕獲(其他不可預知的異常也要一並使用Others選項來捕獲),否則出現異常時會使系統Dump掉。
ABAP調用RFM
DESTINATION附加項后面接的是遠程目標名稱,該目標在事務SM59中設定,其中包含連接和登錄遠程系統所需的全部參數信息。如果調用的就是本機的RFC目標,則DESTINATION可以使用<主機名>_<系統標識>_<實例編號>來指定(就是指下圖中的Server Names),可以通過SM51查看當前SAP系統中活動的應用服務器:
DATA: gt_protocol TYPE btcxpm OCCURS 0 WITH HEADER LINE,
l_reason TYPE string.
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
DESTINATION 'SAPECC6_ECC_00'
EXPORTING
commandname = 'ZDIR'"寬屏顯示服務器上D:盤目錄的內容
additional_parameters = 'd:\ /w'"額外參數
* OPERATINGSYSTEM = SY-OPSYS
* TARGETSYSTEM = SY-HOST
* DESTINATION =
* STDOUT = 'X'
* STDERR = 'X'
* TERMINATIONWAIT = 'X'
* TRACE =
TABLES
exec_protocol = gt_protocol
EXCEPTIONS
no_permission = 1
command_not_found = 2
parameters_too_long = 3
security_risk = 4
wrong_check_call_interface = 5
program_start_error = 6
program_termination_error = 7
x_error = 8
parameter_expected = 9
too_many_parameters = 10
illegal_command = 11
wrong_asynchronous_parameters = 12
cant_enq_tbtco_entry = 13
jobcount_generation_error = 14
OTHERS = 15.
IF sy-subrc = 0.
LOOP AT gt_protocol.
WRITE: / gt_protocol.
ENDLOOP.
ENDIF.
程序說明:
SXPG_COMMAND_EXECUTE為SAP系統提供的標准預定義RFM,用來執行服務器上的操作系統命令。
本例中的DESTINATION 參數指定的是服務器名,並沒有通過SM59進行定義,因為遠程目標是同一SAP系統中的其他應用服務器,因此可以直接指定。如果遠程目標是其他SAP系統,則必須在SM59中進行定義。
程序所執行的命令ZDIR是帖SM69中設定的,其命令的含義時,先運行操作系統的CMD命令,才緊接着執行DIR命令,並且在程序指定額外的參數,如顯示指定的D:盤,並且以寬屏試 /w 顯示。
遠程目標系統維護SM59
上節中調用RFM示例中,直接指定了當前SAP系統內部的應用服務器作為遠程目標。標准的作法是,先在RFC客戶端(SAP主調方)系統中定義作為遠程目標的RFC服務器,然后在ABAP調用時指定該遠程系統,此時的遠程系統可以是系統內部的應用服務器、其他SAP系統、及非SAP系統等。
這些配置信息都保存在RFCDES表中。除去SM59中定義的遠程目標之外,SAP還提供兩個預定義的目標,可以直接在CALL FUNCTION語句的DESTINATION附加項中使用。具體包括:
l 目標NONE:指定該遠程目標意味着將運行當前程序的應用服務器作為目標系統,但是調用過程將通過RFC接口實現,並擁有自己的RFC上下文。該目標可以應用於任意調用類型。
l 目標BACK:用於被遠程調用的RFM程序內部的CALL FUNCTION語句中的目標指定,通過已建立的RFC連接反過來調用該函數的主調者系統中的其他功能模塊(即主調程序—>遠程系統中的RFM—>又回調主調程序所在系統中的其他函數)
l 目標SPACE: DESTINATION選項將會被忽略,被調功能函數將作為普通函數在本機調用
Connection type
類型2(R/2連接),只需給出主機名,所有通信信息都已在存儲在SAP網關的sideinfo表中,如果需要,也可以指定登錄信息。
類型3(ABAP連接或稱R/3連接),創建時必須給出主機名和通信服務。如果需要,也可以指定登錄信息。還可以選擇負載平衡選項。
類型I(內部連接),與當前系統連接到同一數據庫的ABAP系統。這種類型的條目都是預定義的且無法修改。條目名稱與事務SM51中所顯示的應用服務器名相同。
類型L(邏輯目標),該條目不指定連接,而是參照物理目標生成。也可以參照其他邏輯目標生成。這類條目通常除包含所參照的條目中的信息外,還添加額外信息。一般情況下,所參照的條目會給出主機信息,類型L的條目本身給出登錄數據。(通常工作流系統定制過程中需配置的RFC目標即為該類型的邏輯目標)
類型X,指定安裝了特殊ABAP設備驅動程序的系統。在創建類型X條目時,必須給出ABAP設備驅動程序名。
類型S,定義通過SNA或APPC啟動的外部程序連接。
類型M,定義通過CMC(即協議X.400)到ABAP系統中異步RFC連接。
類型T,定義通過TCP/IP並使用RFC庫或SAP連接器的外部程序連接。該類型分為啟動和注冊兩種連接模式。如果設為啟動模式,必須指定要啟動的主機名和程序路徑名;如果設為注冊模式,則需要指定一個RFC服務器程序。
類型G,定義外部系統到本地的HTTP連接
類型H,定義ABAP系統到本地的HTTP連接
Technical Settings
在Technical Settings(技術設定)選項卡,可以選擇負載平衡選項,如果負載平衡選項選擇YES后,則是還要指定下列內容:
l Target System(目標系統名稱),即SM51中服務器名稱中間的大寫字母部分。
l Message server(目標系統的消息服務器),在目標系統的SAP中使用RZ03,應用服務器列表的Service欄中有“M”字符的條目即為消息服務器。
l Group(服務器組),在目標系統的SAP中使用SMLG,可查看服務器組。
否則,則需要指定下列內容:
l Target host(目標系統的主機名或IP地址),即事務SM51中的Host name字段,也可直接使用IP地址。
l System number(目標系統的系統編號),即事務SM51中服務器名稱中最后兩們數字編號。
此外,該選項卡中還可以指定網關信息,對於其他類型連接,還可以指定該系統所用的通信服務,如TCP、SNA等。
Logon/Security
該選項卡中,可以設定登錄語言、集團、用於遠程登錄的用戶名以及密碼。在該選項卡中,還可以設定與系統安全相關的選項:
l Trusted system ,對於類型3的遠程目標,可以將服務器系統設定為可信任系統(SMT2設定可信任系統),則RFC用戶無需再設定登錄密碼。
l SNC(secure network communication),對於類型3或T的遠程目標,如果服務器為支持SNC的安全系統,可以通過Destinations->SNC菜單啟動相關的安全選項。
Special Options
該選項卡中,可以設定系統跟蹤(Trace)、緩慢RFC連接(Slow RFC Connection)選項、目標系統的字符寬度以及和Unicode連接時特定的字符轉換相關選項。
RFC不同的調用模式
CALL FUNCTION中的DESTINATION可以是文字或變量,其值為SAP系統中已知的遠程目標系統,除去SM59中手工定義的目標外,如果遠程系統就是當前系統的SAP應用服務器,也可以直接指定應用服務器名稱,即SM59中的I類型目標。
注意:SM59中定義的RFC目標是區分大小寫的,DESTINATION附加項中目標變量的值必須與其完全一致,包括大小寫。但如果直接指定SAP應用服務器名稱,則無此限制
同步調用RFC
遠程調用時,通信雙方的系統必須均可用,主調程序等待遠程功能處理結束並返回結果:
CALL FUNCTION func DESTINATION dest
parameter_list.
對於表類型參數,在本地普通功能調用中默認就是為引用傳遞(實質為傳遞字段符號),但RFC中不支持引用傳遞機制,所以也將默認進行隱式的值傳遞調用,另外,只會傳遞表本身,不會傳遞表頭。
對於內表類型的參數,只有扁平結構可以被傳輸,但EXPORTING、IMPORTING和CHANGING可以用於傳輸縱深類型及STRING等類型的數據。
同步遠程對話處理
對於同步RFC和異步RFC,可以存在對話過程,如 CALL SCREEN、CALL TRANSACTION或列表處理等,但要注意的是,以后台模式調用有對話程序的RFM,則將導致程序中斷,會引發系統異常 SYSTEM_FAILURE。
如果遠程RFM處理時出現交互對話過程,將在當前調用程序的會話中先進行遠程對話處理,處理結束之后再繼續調用程序:
異步調用RFC(任務方式)
主調程序的執行並不依賴於RFC服務器系統的可用性,被調用的遠程功能啟動后,調用程序繼續運行,遠程功能和調用程序處理相互分離,遠程功能的結果可以稍后接收:
CALL FUNCTION func STARTING NEW TASK task
[DESTINATION {dest|{IN GROUP {group|DEFAULT}}}]
[{PERFORMING subr}|{CALLING meth} ON END OF TASK]
parameter_list.
STARTING NEW TASK表示異步調用模式,task為任務的名稱,可以任意,通常對於不同的異步調用,應該指定不同的任務名
在異步RFC調用中,DESTINATION並不是必須的,即遠程系統的指定並不是實現異步RFC調用過程的前提條件(但函數一定要是RFC函數才能采用異步調用),只要出現STARTING NEW TASK附加項,系統就將以異步RFC進行功能調用
異步RFC調用
參數限制
異步RFC調用過程只能使用 TABLES、EXPORTING(對應功能模塊設定中的Import參數)和EXCEPIONS參數。調用程序並不等待該模塊返回結果,因而不能指定IMPORTING參數(其返回結果需要在回調子程序中進行處理)。而且,調用的同時只能接收系統標准異常COMMUNICATION_FAILURE和SYSTEM_FAILURE,對於功能模塊中拋出的其他特定異常則不能直接接收,也需要在回調子程序中處理。
接收返回結果
如果需要在異步RFC模式下接收遠程模塊的返回結果或特定異常,可以通過調用語句中的附加項PERFORMING return_form ON END OF TASK實現:
CALL FUNCTION rfm_name
STARTING NEW TASK taskname
PERFORMING return_form ON END OF TASK
...
其中指定的子程序必須存在於調用程序中,並包含RECEIVE語句:
FORM return_form USING taskname.
...
RECEIVE RESULTS FROM FUNCTION rfm_name
...
ENDFORM.
當被調用RFM功能模塊執行結束后,系統將自動執行回調子程序return_form,return_form子程序必須包含一個任意的名稱、類型的形式參數,以接收對應異步RFC調用的任務名稱。
注:回調子程序return_form中不能包含任何使當前程序執行中斷的語句,例如:CALL SCREEN、SUBMIT、COMMIT WORK、WAIT、RFC調用及W或I類型的消息等,否則是不能成功將結果輸出到屏幕上,此外,子程序中的WRITE語句也將失效。
DATA: msg_text(128).
DATA: gt_protocol TYPE btcxpm OCCURS 0 WITH HEADER LINE.
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
* DESTINATION 'SAPECC6_ECC_00'
STARTING NEW TASK 'B1'
PERFORMING return_frm ON END OF TASK
EXPORTING
commandname = 'ZDIR'
additional_parameters = 'd:\ /w'
EXCEPTIONS
communication_failure = 1 MESSAGE msg_text
system_failure = 2 MESSAGE msg_text.
IF sy-subrc = 0.
WRITE: 'Wait for reply.'.
ELSE.
WRITE msg_text.
ENDIF.
AT USER-COMMAND.
IF sy-ucomm = 'OK'."此處的FunctionCode為 return_frm 函數所觸發
IF msg_text = space.
LOOP AT gt_protocol.
WRITE: / gt_protocol-message.
ENDLOOP.
ELSE.
WRITE : '--' , msg_text.
ENDIF.
ENDIF.
FORM return_frm USING taskname.
RECEIVE RESULTS FROM FUNCTION 'SXPG_COMMAND_EXECUTE'
TABLES
exec_protocol = gt_protocol
EXCEPTIONS
communication_failure = 1 message msg_text
system_failure = 2 message msg_text.
" WAIT UP TO 1 SECONDS."在接收Form中不能出現中斷語句,否則拋異常
SET USER-COMMAND 'OK'."接收到異步返回結果后,自動觸發一個列表事件,如果有輸出,將會顯示下一級別的List屏幕
ENDFORM.
要想將結果輸出到屏幕上,這里一定要在 AT USER-COMMAND事件中輸出
等待多個異步調用的返回結果
語句WAIT UNTIL用於異步RFC調用中等待結果的返回,該項必須與PERFORMING附加項配合使用,否則沒有意義,也無任何效果:
WAIT UNTIL log_exp [UP TO sec SECONDS].
注:WAIT UP TO 1 SECONDS.不需要與PERFORMING選項配合使用,也就是說可以使用在普通的ABAP程序中,用來暫停當前會話線程
該語句執行時,log_exp中的條件將被檢查(或者到達指定的等待時間sec),僅當條件滿足時,主調程序繼續執行;否則程序將掛起,並等待異步RFC調用的返回結果。
使用WAIT UNTIL語句等待多個RFM返回結果的異步RFC調用示例代碼段可參考這里
異步遠程對話處理
異步RFC調用過程也支持遠程對話處理,在異步RFC調用時,系統總是打開新的工作過程,因而如果被調用功能模塊中包含對話過程(即屏幕處理),則在該功能模塊執行時,在主調系統中將出現新的外部會話容器,用戶可以和遠程系統交互對話,並允許在調用程序對話和被調用對話之間來回
並行RFC(負載均衡)
並行RFC調用實際上是異步RFC調用的應用之一
異步RFC調用只適用於多個SAP ABAP系統間的並行處理,不支持SAP系統和其他系統之間
通過事務SM59中的菜單項 RFC->RFC groups,可以將SAP系統的應用服務器分配成不同的RFC分組。異步RFM調用時,可以通過DESTINATION子句中的IN GROUP附加項指定一個已定義的RFC分組,系統將選擇組內負載最小的應用服務器來執行該模式,如果不指定,還可以使用關鍵字 DEFAULT,系統將從全部可用的應用服務器中選擇一個來處理
並行處理的前提條件
獨立的LUW:並行處理不適合需順序進行的數據處理,並行的數據處理任務必須邏輯上獨立於其他任務,各個數據處理過程不能具有依賴關系
被調用的功能模塊程序中不能再包含使用目標BACK的遠程功能調用(即不能再進行回調)
調用程序不能在異步調用之后生成新的內部會話,即不能在CALL FUNCTION STARTING NEW TASK語句后使用SUBMIT或CALL TRANSACTION語句
不能通過CALL FUNCTION STARTING NEW TASK DESTINATION IN GROUP語句啟動外部程序
並行處理(相當於多線程)示例
TYPES: BEGIN OF task_type,
name TYPE string,
dest TYPE string,
END OF task_type.
DATA:snd_jobs TYPE i,
rcv_jobs TYPE i,
exc_flag TYPE i,
info TYPE rfcsi,
mess(80),
indx(4),
name(8),
task_list TYPE STANDARD TABLE OF task_type,
task_wa TYPE task_type.
DO 9 TIMES.
indx = sy-index.
CONCATENATE 'Task' indx INTO name.
CALL FUNCTION 'RFC_SYSTEM_INFO'
STARTING NEW TASK name
DESTINATION IN GROUP DEFAULT
PERFORMING rfc_info ON END OF TASK
EXCEPTIONS
system_failure = 1 MESSAGE mess
communication_failure = 2 MESSAGE mess
resource_failure = 3 .
CASE sy-subrc.
WHEN 1 OR 2.
MESSAGE mess TYPE 'I'.
WHEN 3.
MESSAGE 'Resource failure ' TYPE 'I'.
ENDCASE.
ENDDO.
WAIT UNTIL rcv_jobs = 9 UP TO 10 SECONDS.
LOOP AT task_list INTO task_wa.
WRITE: / task_wa-name,task_wa-dest.
ENDLOOP.
FORM rfc_info USING name.
task_wa-name = name.
rcv_jobs = rcv_jobs + 1.
RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'
IMPORTING
rfcsi_export = info
EXCEPTIONS
system_failure = 1 MESSAGE mess
communication_failure = 2 MESSAGE mess.
IF sy-subrc = 0.
task_wa-dest = info-rfcdest.
ELSE.
task_wa-dest = mess.
ENDIF.
APPEND task_wa TO task_list.
ENDFORM.
Transactional RFC(事務性RFC方式的RFM調用)
事務性RFC,廣義上也屬於異步,主調程序不接收結果而繼續運行,但並不立即啟動遠程功能。相關聯的RFC可綁定到一個事務單元上LUW,等待主調程序中的COMMIT WORK語句時,一次性執行多個遠程函數調用。此種方式的調用解決了調用多個遠程RFM時事務問題
CALL FUNCTION func IN BACKGROUND TASK
[AS SEPARATE UNIT]
[DESTINATION dest]
parameter_list.
CALL FUNCTION func IN BACKGROUND UNIT
parameter_list.
上文中的同步和異步調用RFC時,每一個RFC調用都在遠程系統中構成一個獨立的LUW,即在調用多個RFM時,不會放到一個事務里:
通常情況下,普通的功能模塊的調用和主程序位於相同的LUW 中,即在同一事務中,所以不會出現事務性問題;但同步RFC和異步RFC調用中的每一個功能模塊都擁有自己的LUW,即在每一次遠程調用結束時,當前程序都將進行內存區的釋放,因此將觸發隱式的數據庫提交,這樣,之前的所有數據庫更新將不能回滾。對於事務性RFC,則將相關機制將多個遠程調用操作綁定到同一個LUW,實現整體提交或回滾,調用RFM時主調程序並不會立即發送調用遠程目標上的RFM,而是等到COMMIT WORK才開始去真正去執行RFM:
選項IN BACKGROUND TASK/UNIT指明該調用為事務性RFC,后者為ABAP7.0版之后針對對象引用的新格式,其中oref必須引用一個接口IF_BGRFC_UNIT實現類的對象。在相鄰兩個COMMIT WORK語句之間出現的所有相同目標的異步調用都屬於同一個LUW。
與異步RFC調用類似,事務性RFC調用也不需要等待每個RFM執行完,主調程序就可以立即繼續進行;但不同之外在於事務性RFC調用時,不要求遠程RFC服務器可用;事務性RFC不能從調用模塊RFM中接收返回結果,且不允許調用者與遠程系統的交互性對話及調試
1、調用參數
事務性RFC調用不能直接接收或通過RECEIVE RESULTS FROM FUNCTION語句接收FRM的返回結果。因此,RFM功能模塊的接口不應指定任何Export類型參數,否則該功能就不能通過事務性機制調用。此外,事務性的功能模塊RFM中不適合進行回調(此時遠程目標參數DESTINATION為BACK,即在遠程RFM程序中返過來調用主調程序所在系統中的其他函數模塊),因為在將回調返回原始系統時,調用程序上下文不一定仍然存在。
2、事務ID(TID)
每個事務性RFC調用均通過一個獨特的事務ID存儲於本地數據表ARFCSSTATE和ARFCSDATA中,其中ARFCSSTATE記錄LUW的執行狀態,ARFCSDATA則包含事務性RFC調用的輸入數據。當主調程序執行到COMMIT WORK語句時,將為遠程LUW計划一個立即或延遲的后台作業,並將遠程調用轉發給目標系統進行執行。在作業執行過程中,從事務性RFC表中讀取相關數據,與相應的事務性RFC進行通信,如果遠程的LUW被成功執行,則相應的條目在表中將被刪除。因此,如果LUW運行成功,則無法重新執行,因而保證了僅僅執行一次。
注:如果在主調程序COMMIT WORK 語句觸發時,需要執行本地數據表更新操作,則事務性RFC調用則會放在本地更新操作成功完成之后才開始執行遠程的
3、設定作業開始時間
默認情況下,在運行到COMMIT WORK 語句后指定的目標系統中將立即執行LUW,但如果希望在指定的時間啟動LUW,可以通過函數START_OF_BACKGROUNDTASK設置作業開始時間,注:必須在CALL…IN BACKGROUND TASK語句之后或COMMIT WORK語句之前調用該函數
4、多LUW處理
在事務性RFC調用過程中,如果在COMMIT WORK語句之前出現的事務性RFC調用分別針對多個不同的目標,則系統將根據其目標分組為多個不同的LUW,相同目標的調用組合到同一個LUW中,在COMMIT WORK語句執行時,處理所有的LUW
如果不想將相同目標的事務性RFC調用組合到一個LUW,可以調用AS SEPARATE UNIT附加選項實現
5、出錯處理
如果有錯誤發生,事務性RFC調用將啟動重試機制或者回滾,具體處理:
l 通過COMMIT WORK執行遠程調用時,如果不能建立到目標系統的連接,將在ARFCSSTATE表中記錄當前狀態,系統將通過系統報表RSARFCSE根據當前的TID(事務ID)重新計划后台作用,進行下一次調用。這可以通過事務RFC調用選項為特定目標系統設定嘗試次數和時間間隔,默認為時間間隔為15分鍾,嘗試30次(這些默認值可以通過 SAP右側初始菜單 TOOLS->ADMINISTRATION->ADMINISTRATION->NETWORK-RFC DESTINATIONS來修改)。如果經過最大嘗試次數后系統仍無法連接,系統將停止調用報表RSARFCSE,並將ARFCSDATA中狀態更新為CPICERR。特定時間后(默認8天)將表中的相應條目刪除(但仍然可通過事務SM59手工啟動)
l 如果在RFM的執行過程出錯,如A類型的消息或才RAISE語句拋出異常,則ARFCSSTATE表中將記錄出錯狀態,整個RFC中的操作將取消,出錯之后不再將后台作業重啟,ARFCSSTATE表中的信息也不會被刪除。在主調用系統中可以通過事務SM58查看該錯誤,並在遠程系統中修改錯誤之后,通過SM58重新啟動出錯的RFM
5、檢查事務性RFC調用狀態
可通過以下兩種方式來檢查TID(事務ID)的狀態
通過程序
首先,TID可以通過調用功能模塊 ID_OF_BACKGROUNDTASK,在CALL…IN BACKGROUND TASK與COMMIT WORK 之間調用一獲取LUW的TID。獲得LUW 的TID之后,就可以繼續使用功能函數STATUS_OF_BACKGROUNDTASK確定事務性RFC的狀態了:
聯機確定
通過SM58顯示維護事務性RFC的LUW狀態
相相關事務碼:SM59、SM58
隊列RFC方式的RFM調用
隊列RFC是事務性RFC功能上的進一步的擴展。在事務性RFC中,如果COMMIT WORK語句提交多個LUW,那么各LUW之間相互獨立,其處理順序並不與創建順序相同,這些LUW執行次序是無法確定的。如果要保證這種順序,需要使用隊列RFC創建LUW序列,隊列RFC是事務性RFC的增強版本,可以用於SAP與SAP及SAP與非SAP之間的連接。
上圖中(1)是普通事務性RFC調用過程,各功能模塊RFM是相互獨立的,執行順序不確定;圖中(2)是含出站隊列的RFC,在發送前,先按預期的處理順序入隊,再由主調系統發送處理,此種解決了各獨立的RFM在處理上的先后問題;圖中(3)是含入站隊列及出站隊列RFC,此種情況下與(2)不同的只是在被調系統中增加了隊列,緩解了服務器壓力,有效地利用雙方系統的資源,避免了大量事務RFC調用而造成的服務器端阻塞,但其作用還是與(2)一樣,解決了相互獨立的RFM按順序處理的問題
通過事務SMQS可以配置出站的隊列RFC序列;通過事務SMQR,可以配置入站的隊列RFC序列
在編程時,需要在普通事務性RFC調用之前使用功能模塊TRFC_SET_QUEUE_NAME來指明后續的事務性RFC所要插入的出站隊列;入站隊列的指定則通過調用功能模塊TRFC_SET_QIN_PROPERTIES來完成。
本地RFM調用和回調
通過DESTNATION選項支持的兩個特殊目標NONE與BACK,可以進行RFM的本地遠程調用和回調
在本地調用遠程功能
有時需要在本地系統中調用遠程功能模塊,即調用當前系統內部的RFM,功能既能以遠程調用方式運行,也能以非遠程調用方式運行,這取決於CALL FUNCTION語句的格式。以遠程方式進行的本地調用格式如下:
CALL FUNCTION rfm_name
DESTINATION 'NONE'
...
遠程目標 NONE表示,遠程功能與調用程序在相同系統中運行。作為遠程調用,功能模塊通過RFC接口被調用,在自己的內存區運行,有遠程上下文,參數的處理過程與其他遠程調用相同。
正常的本地調用(非遠程調用)中,CALL FUNCTION 語句沒有DESTINATION、STARTING NEW TASK或者IN BACKGROUND TASK/UNIT這三種附加項的任何之一出現,此時即使函數屬性設置成了“可遠程調用的”,函數模塊也不在獨立的內存中運行(與主調程序在同一會話內存中執行),本質上與普通的功能模塊函數相同
遠程回調功能
在服務器(RFM所在機器、被調用者,而非主調者)上執行遠程功能時,該服務器(被調者)也可以調用客戶(主調者)中隨調用程序載入內存的功能模塊,這個過程稱之為回調
通過特殊的目標名BACK可觸發回調機制:
系統在回調過程中將使用與服務器接收第一個遠程調用時相同的RFC接連。建立RFC連接之后,在顯式關閉或調用程序終止之前,該連接將一直保持。在回調過程中,建立新的連接之前,系統將嘗試使用現有RFC進行連接。
如下圖,服務器端的遠程功能B可以調用客戶端的原始調用程序中的功能模塊C,甚至可以是程序本身A(注意:只有在同步調用時,才可以在服務器被調用功能模塊中回調客戶端功能)
異常處理
系統將自動處理標准異常COMMUNICATION_FAILURE和SYSTEM_FAILURE。如果在系統中沒有正確維護遠程目標,或到遠程系統的連接不能建立,系統將觸發COMMUNICATION_FAILURE異常;如果遠程連接成功,但所指定的遠程功能不存在於目標系統中,系統將觸發SYSTEM_FAILURE異常,必須在功能模塊調用部分的代碼中顯式捕獲上述異常,此外,還應在遠程功能中定義其他可能拋出的異常。
DATA: message_txt(128).
CALL FUNCTION 'ZRFC_USER_READ'
DESTINATION 'GS4CLNT100'
...
EXCEPTIONS
communication_failure = 1 MESSAGE message_txt
system_failure = 2 MESSAGE message_txt.
如果上述程序發生異常,並不會引起Short Dump中斷,異常信息將被存儲到MESSAGE附加項指定的變量message_txt中(注:其他異常不能使用 MESSAGE選項)
總結
l 同步RFM調用需要等待RFM返回結果之后,主調程序才能繼續執行,而異步RFM調用則不需要等待返回結果;但需要通過RECEIVE語句在回調子程序中來接收結果;事務性RFM的調用則不能接收RFM返回值
l 對於同步、異步RFM,服務器系統必須在調用時可用,而事務性RFM調用則無些限制
l 同步RFM調用和異步RFM調用過程中,允許用戶與遠程系統進行交互對話(其方式有差異),事務性RFM調用則不支持
l 同步和異步RFM調用時,參數值將直接傳輸至遠程功能模塊函數,但在事務性RFM中,參數將暫時存儲於數據庫中,待執行時才傳入給遠程函數
l 同步RFC和事務性RFC可以在SAP與非SAP系統之間進行調用,而對於異步RFC,只適用於SAP系統內部或之間調用
實用RFC函數
動態訪問表數據RFC_READ_TABLE
動態輸入任何表名,及查詢條件,即可查詢數據
DELIMITER參數:由於查詢出來的數據是將查詢出來的所有字段拼接在一起一個字符串,之間用什么分隔可以在這里指定,比如“|”豎線,如果不指定,則需要按照字段的長度來自己划分
如果在查詢時不傳入FIELDS參數值,則返回輸入表的表結構信息:每個字段起始索引(按SE11中字段定義的選擇順序來算)、長度、類型:
==========================================================
輸入查詢條件:
還需要在TABLE參數FIELDNAME 中定義數據返回的字段格式:
查詢結果:



































