如何在 SAP BTP ABAP 编程环境里直接调用 ABAP On-Premises 系统的 RFC 函数

举报
Jerry Wang 发表于 2022/06/29 20:25:55 2022/06/29
【摘要】 首先登录 ABAP On-Premises 系统,运行事物码:aco_proxy,为 RFC 函数 RFC_SYSTEM_INFO 和 RFC_READ_TABLE, 生成代理类元数据,格式为 xml. 将 xml 文件另存到本地。使用 ABAP Development Tool 登录 SAP BTP ABAP 运行环境,新建一个 Service Consumption Model,类型选择...

首先登录 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)协议进行实际数据连接。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。