1. 程式人生 > 其它 >如何在 SAP BTP ABAP 程式設計環境裡直接呼叫 ABAP On-Premises 系統的 RFC 函式

如何在 SAP BTP ABAP 程式設計環境裡直接呼叫 ABAP On-Premises 系統的 RFC 函式

首先登入 ABAP On-Premises 系統,執行事物碼:aco_proxy,為 RFC 函式 RFC_SYSTEM_INFO 和 RFC_READ_TABLE, 生成代理類元資料,格式為 xml. 將 xml 檔案另存到本地。

使用 ABAP Development Tool 登入 SAP BTP ABAP 執行環境,新建一個 Service Consumption Model,型別選擇 RFC:

生成一個 Proxy Class,我們稍後會在 ABAP 程式碼裡,通過這個 Proxy Class 來呼叫 On-Premises 系統上的 RFC 函式。將前一步驟在 On-Premises 系統裡生成的 metadata.xml, 匯入到 Proxy 類生成嚮導裡。

啟用這個 Service Consumption Model,在自動生成的代理類裡,我們能找到 ABAP 程式碼模板,這個程式碼模板,可以直接拷貝到我們的 ABAP 程式碼裡,稍作修改,就能呼叫 ABAP On-Premises 系統的 RFC 函數了。

新建一個 ABAP 類,將上圖代理類裡的程式碼拷貝到這個 ABAP 類的 Main 方法裡:

完整程式碼如下:

CLASS zcl_consume_rfc DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

PUBLIC SECTION.

  INTERFACES if_oo_adt_classrun .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.

CLASS zcl_consume_rfc IMPLEMENTATION.

  METHOD if_oo_adt_classrun~main.
    DATA dest TYPE REF TO IF_RFC_DEST.
    DATA myobj  TYPE REF TO ZCL_JERRY_RFC_PROXY.

    DATA CURRENT_RESOURCES TYPE ZCL_JERRY_RFC_PROXY=>SYST_INDEX.
    DATA FAST_SER_VERS TYPE INT4.
    DATA MAXIMAL_RESOURCES TYPE ZCL_JERRY_RFC_PROXY=>SYST_INDEX.
    DATA RECOMMENDED_DELAY TYPE ZCL_JERRY_RFC_PROXY=>SYST_INDEX.
    DATA RFCSI_EXPORT TYPE ZCL_JERRY_RFC_PROXY=>RFCSI.
    DATA S4_HANA TYPE ZCL_JERRY_RFC_PROXY=>CHAR1.

    TRY.
      dest = CL_RFC_DESTINATION_PROVIDER=>create_by_cloud_destination( 'AG3' ).

      CREATE OBJECT myobj
        EXPORTING
          destination = dest.
    catch CX_RFC_DEST_PROVIDER_ERROR.
     " handle CX_RFC_DEST_PROVIDER_ERROR
    ENDTRY.

    TRY.
      myobj->RFC_SYSTEM_INFO(
         IMPORTING
           CURRENT_RESOURCES = CURRENT_RESOURCES
           FAST_SER_VERS = FAST_SER_VERS
           MAXIMAL_RESOURCES = MAXIMAL_RESOURCES
           RECOMMENDED_DELAY = RECOMMENDED_DELAY
           RFCSI_EXPORT = RFCSI_EXPORT
           S4_HANA = S4_HANA
       ).
     CATCH  CX_ACO_COMMUNICATION_FAILURE INTO DATA(lcx_comm).
      " handle CX_ACO_COMMUNICATION_FAILURE (sy-msg* in lcx_comm->IF_T100_MESSAGE~T100KEY)
     CATCH CX_ACO_SYSTEM_FAILURE INTO DATA(lcx_sys).
      " handle CX_ACO_SYSTEM_FAILURE (sy-msg* in lcx_sys->IF_T100_MESSAGE~T100KEY)
     CATCH CX_ACO_APPLICATION_EXCEPTION INTO DATA(lcx_appl).
      " handle APPLICATION_EXCEPTIONS (sy-msg* in lcx_appl->IF_T100_MESSAGE~T100KEY)
    ENDTRY.

  ENDMETHOD.
ENDCLASS.

注意,需要按照這篇文章提到的步驟,藉助 SAP Cloud Connector ,在 SAP BTP Cockpit 上,完成指向 ABAP On-Premises 系統 AG3 的 Destination 配置。

原因是,在 SAP BTP、ABAP 環境和內部部署之間設定連線時存在兩個問題:

  • ABAP 環境“存在”於 Internet 中,但客戶內部部署系統位於防火牆之後
  • RFC 不支援 Internet

因此,需要建立從內部部署系統到 SAP BTP、ABAP 環境的安全隧道連線。

  • ABAP 環境租戶從 Destination 服務例項中獲取目的地。
  • ABAP 環境租戶通過 Connectivity 服務請求開啟隧道連線。
  • 連線服務告訴雲聯結器使用管理連線開啟與此特定 ABAP 環境租戶的連線。
  • 雲聯結器使用其公共租戶 URL 開啟到 ABAP 環境租戶的隧道連線。
  • 隧道建立後,可用於使用 RFC 或 HTTP(S)協議進行實際資料連線。

更多Jerry的原創文章,盡在:"汪子熙":