天天看點

ABAP RFC遠端調用

RFC. 4

RFM限制... 4

ABAP調用RFM.. 5

遠端目标系統維護SM59. 6

Connection type. 6

Technical Settings. 7

Logon/Security. 7

Special Options. 7

RFC不同的調用模式... 7

同步調用RFC. 7

同步遠端對話處理... 7

異步調用RFC(任務方式)... 8

異步RFC調用... 8

參數限制... 8

接收傳回結果... 8

等待多個異步調用的傳回結果... 9

異步遠端對話處理... 9

并行RFC(負載均衡)... 10

并行處理的前提條件... 10

并行處理(相當于多線程)示例... 10

Transactional RFC(事務性RFC方式的RFM調用)... 11

1、調用參數... 12

2、事務ID(TID)... 13

3、設定作業開始時間... 13

4、多LUW處理... 13

5、出錯處理... 13

5、檢查事務性RFC調用狀态... 13

通過程式... 13

聯機确定... 14

隊列RFC方式的RFM調用... 14

本地RFM調用和回調... 15

在本地調用遠端功能... 15

遠端回調功能... 15

異常處理... 16

總結... 16

實用RFC函數... 16

動态通路表資料RFC_READ_TABLE

RFC

可以在SAP系統之間、SAP系統與非SAP系統之間進行遠端調用,且調用可以是雙向的(SAP系統可以調用非SAP系統、非SAP系統也可以調用SAP系統——如Java通過Jco連接配接器來通路SAP):

ABAP RFC遠端調用

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

ABAP RFC遠端調用

DESTINATION附加項後面接的是遠端目标名稱,該目标在事務SM59中設定,其中包含連接配接和登入遠端系統所需的全部參數資訊。如果調用的就是本機的RFC目标,則DESTINATION可以使用<主機名>_<系統辨別>_<執行個體編号>來指定(就是指下圖中的Server Names),可以通過SM51檢視目前SAP系統中活動的應用伺服器:

ABAP RFC遠端調用
ABAP RFC遠端調用

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 顯示。

ABAP RFC遠端調用

遠端目标系統維護SM59

ABAP RFC遠端調用

上節中調用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

ABAP RFC遠端調用

類型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.

ABAP RFC遠端調用

對于表類型參數,在本地普通功能調用中預設就是為引用傳遞(實質為傳遞字段符号),但RFC中不支援引用傳遞機制,是以也将預設進行隐式的值傳遞調用,另外,隻會傳遞表本身,不會傳遞表頭。

對于内表類型的參數,隻有扁平結構可以被傳輸,但EXPORTING、IMPORTING和CHANGING可以用于傳輸縱深類型及STRING等類型的資料。

同步遠端對話處理

對于同步RFC和異步RFC,可以存在對話過程,如 CALL SCREEN、CALL TRANSACTION或清單處理等,但要注意的是,以背景模式調用有對話程式的RFM,則将導緻程式中斷,會引發系統異常 SYSTEM_FAILURE。

如果遠端RFM處理時出現互動對話過程,将在目前調用程式的會話中先進行遠端對話處理,處理結束之後再繼續調用程式:

ABAP RFC遠端調用

異步調用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進行功能調用

ABAP RFC遠端調用
ABAP 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.

*  DESTINATION 'SAPECC6_ECC_00'

  STARTING NEW TASK 'B1'

  PERFORMING return_frm ON END OF TASK

    commandname           = 'ZDIR'

    additional_parameters = 'd:\ /w'

    communication_failure = 1  MESSAGE msg_text

    system_failure        = 2  MESSAGE msg_text.

  WRITE: 'Wait for reply.'.

ELSE.

  WRITE msg_text.

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螢幕

要想将結果輸出到螢幕上,這裡一定要在 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調用時,系統總是打開新的工作過程,因而如果被調用功能子產品中包含對話過程(即螢幕處理),則在該功能子產品執行時,在主調系統中将出現新的外部會話容器,使用者可以和遠端系統互動對話,并允許在調用程式對話和被調用對話之間來回

ABAP RFC遠端調用

并行RFC(負載均衡)

ABAP RFC遠端調用

并行RFC調用實際上是異步RFC調用的應用之一

異步RFC調用隻适用于多個SAP ABAP系統間的并行處理,不支援SAP系統和其他系統之間

通過事務SM59中的菜單項 RFC->RFC groups,可以将SAP系統的應用伺服器配置設定成不同的RFC分組。異步RFM調用時,可以通過DESTINATION子句中的IN GROUP附加項指定一個已定義的RFC分組,系統将選擇組内負載最小的應用伺服器來執行該模式,如果不指定,還可以使用關鍵字 DEFAULT,系統将從全部可用的應用伺服器中選擇一個來處理

ABAP RFC遠端調用

并行處理的前提條件

獨立的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

      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.

  APPEND task_wa TO task_list.

ABAP RFC遠端調用

Transactional RFC(事務性RFC方式的RFM調用)

事務性RFC,廣義上也屬于異步,主調程式不接收結果而繼續運作,但并不立即啟動遠端功能。相關聯的RFC可綁定到一個事務單元上LUW,等待主調程式中的COMMIT WORK語句時,一次性執行多個遠端函數調用。此種方式的調用解決了調用多個遠端RFM時事務問題

CALL FUNCTION func IN BACKGROUND TASK 

                     [AS SEPARATE UNIT]

                     [DESTINATION dest]

CALL FUNCTION func IN BACKGROUND UNIT 

                     parameter_list.

上文中的同步和異步調用RFC時,每一個RFC調用都在遠端系統中構成一個獨立的LUW,即在調用多個RFM時,不會放到一個事務裡:

ABAP RFC遠端調用

通常情況下,普通的功能子產品的調用和主程式位于相同的LUW 中,即在同一事務中,是以不會出現事務性問題;但同步RFC和異步RFC調用中的每一個功能子產品都擁有自己的LUW,即在每一次遠端調用結束時,目前程式都将進行記憶體區的釋放,是以将觸發隐式的資料庫送出,這樣,之前的所有資料庫更新将不能復原。對于事務性RFC,則将相關機制将多個遠端調用操作綁定到同一個LUW,實作整體送出或復原,調用RFM時主調程式并不會立即發送調用遠端目标上的RFM,而是等到COMMIT WORK才開始去真正去執行RFM:

ABAP RFC遠端調用
ABAP RFC遠端調用

選項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

ABAP RFC遠端調用

如果不想将相同目标的事務性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的狀态了:

ABAP RFC遠端調用
聯機确定

通過SM58顯示維護事務性RFC的LUW狀态

相相關事務碼:SM59、SM58

隊列RFC方式的RFM調用

隊列RFC是事務性RFC功能上的進一步的擴充。在事務性RFC中,如果COMMIT WORK語句送出多個LUW,那麼各LUW之間互相獨立,其處理順序并不與建立順序相同,這些LUW執行次序是無法确定的。如果要保證這種順序,需要使用隊列RFC建立LUW序列,隊列RFC是事務性RFC的增強版本,可以用于SAP與SAP及SAP與非SAP之間的連接配接。

ABAP RFC遠端調用

上圖中(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來完成。

ABAP RFC遠端調用

本地RFM調用和回調

通過DESTNATION選項支援的兩個特殊目标NONE與BACK,可以進行RFM的本地遠端調用和回調

在本地調用遠端功能

有時需要在本地系統中調用遠端功能子產品,即調用目前系統内部的RFM,功能既能以遠端調用方式運作,也能以非遠端調用方式運作,這取決于CALL FUNCTION語句的格式。以遠端方式進行的本地調用格式如下:

  DESTINATION 'NONE'

遠端目标 NONE表示,遠端功能與調用程式在相同系統中運作。作為遠端調用,功能子產品通過RFC接口被調用,在自己的記憶體區運作,有遠端上下文,參數的處理過程與其他遠端調用相同。

正常的本地調用(非遠端調用)中,CALL FUNCTION 語句沒有DESTINATION、STARTING NEW TASK或者IN BACKGROUND TASK/UNIT這三種附加項的任何之一出現,此時即使函數屬性設定成了“可遠端調用的”,函數子產品也不在獨立的記憶體中運作(與主調程式在同一會話記憶體中執行),本質上與普通的功能子產品函數相同

遠端回調功能

在伺服器(RFM所在機器、被調用者,而非主調者)上執行遠端功能時,該伺服器(被調者)也可以調用客戶(主調者)中随調用程式載入記憶體的功能子產品,這個過程稱之為回調

通過特殊的目标名BACK可觸發回調機制:

ABAP RFC遠端調用

系統在回調過程中将使用與伺服器接收第一個遠端調用時相同的RFC接連。建立RFC連接配接之後,在顯式關閉或調用程式終止之前,該連接配接将一直保持。在回調過程中,建立新的連接配接之前,系統将嘗試使用現有RFC進行連接配接。

如下圖,伺服器端的遠端功能B可以調用用戶端的原始調用程式中的功能子產品C,甚至可以是程式本身A(注意:隻有在同步調用時,才可以在伺服器被調用功能子產品中回調用戶端功能)

ABAP RFC遠端調用

異常處理

系統将自動處理标準異常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系統内部或之間調用

ABAP RFC遠端調用

實用RFC函數

動态輸入任何表名,及查詢條件,即可查詢資料

ABAP RFC遠端調用
ABAP RFC遠端調用

DELIMITER參數:由于查詢出來的資料是将查詢出來的所有字段拼接在一起一個字元串,之間用什麼分隔可以在這裡指定,比如“|”豎線,如果不指定,則需要按照字段的長度來自己劃分

如果在查詢時不傳入FIELDS參數值,則傳回輸入表的表結構資訊:每個字段起始索引(按SE11中字段定義的選擇順序來算)、長度、類型:

ABAP RFC遠端調用
ABAP RFC遠端調用
ABAP RFC遠端調用

==========================================================

ABAP RFC遠端調用

輸入查詢條件:

ABAP RFC遠端調用

還需要在TABLE參數FIELDNAME 中定義資料傳回的字段格式:

ABAP RFC遠端調用

查詢結果:

ABAP RFC遠端調用
ABAP RFC遠端調用

原文出自 江正軍 技術部落格,部落格連結:www.cnblogs.com/jiangzhengjun

下一篇: 優先隊列