SAP 远程函数调用 (RFC) 教程
什么是 RFC?
RFC 是一种机制,它允许业务应用程序与其他系统进行通信和信息交换(以预定义的格式)。RFC 代表**“远程函数调用”**。
RFC 由两个接口组成
- ABAP 程序的调用接口
- 非 SAP 程序的调用接口
任何 ABAP 程序都可以使用 **CALL FUNCTION…DESTINATION** 语句调用远程函数。**DESTINATION** 参数告诉 SAP 系统,被调用的函数运行在与调用者不同的系统中。
语法-
CALL FUNCTION 'remotefunction' DESTINATION dest EXPORTING f1 = IMPORTING f2 = TABLES t1 = EXCEPTIONS
逻辑目的地通过事务 **SM59** 定义并存储在表 **RFCDES** 中
RFC 接口的功能
- 将所有参数数据转换为远程系统所需的表示形式
- 调用与远程系统通信所需的通信例程。
- 处理通信错误,并根据需要通知调用者(使用 CALL FUNCTION 的 EXCEPTIONS 参数)。
RFC 是一种 SAP 协议,用于处理系统之间的通信,以简化相关编程。它是在与调用程序不同的机器上调用函数模块的过程。RFC 也可以用于在同一台机器上调用不同的程序,但通常在“调用”和“被调用”函数模块/程序在不同机器上运行时使用。
在 SAP 中,RFC 接口系统用于在不同的 SAP 系统之间以及 SAP 与外部(非 SAP)系统之间建立 RFC 连接。
关于 RFC 必须了解的详细信息
- SAP 使用 CPIC(通信通用编程接口)协议在系统之间传输数据。它是 SAP 特有的协议。远程函数调用 (RFC) 是一种基于 CPI-C 的通信接口,但功能更多,应用程序程序员使用起来更简单
- RFC 库函数支持 C 编程语言和 Visual Basic(在 Windows 平台上)
- RFC 连接始终可以在整个系统中使用。这意味着您在客户端 000 中定义的 RFC 连接也可以从客户端 100 使用(没有任何区别)。
- RFC 是通过网络调用特殊子例程(函数模块)的协议。函数模块可与 C 函数或 PASCAL 过程相媲美。它们具有定义的接口,通过该接口可以交换数据、表和返回代码。函数模块在 R/3 系统中由其自己的函数库(称为函数生成器)管理。
- 函数生成器(事务 SE37)为应用程序程序员提供了一个有用的环境,用于编程、文档化和测试可以本地和远程调用的函数模块。R/3 系统自动生成远程调用所需的附加代码(RFC 存根)。
- 您可以使用事务 SM59 维护 RFC 连接的参数。R/3 系统还附带了一个 RFC-SDK(软件开发工具包),它使用大量 C 库来允许外部程序连接到 R/3 系统。
- 将函数模块远程调用到另一个服务器与本地调用的唯一区别是一个特殊参数(目的地),该参数指定了要执行程序的Target服务器。
RFC 的优势
RFC 通过让程序员避免在远程系统上重复开发模块和方法,从而减少了他们的工作量。它足以做到
- 将数据转换为远程(目标)系统可理解的格式。
- 将数据转换为远程(目标)系统可理解的格式。
- 调用与远程系统开始通信所需的某些例程。
- 处理通信过程中可能发生的错误。
RFC 的类型
同步
要求两个系统(客户端和服务器)在通信或数据传输时都可用。这是最常见的类型,并且在执行 sRFC 后立即需要结果时需要。
sRFC 是一种系统间通信方式,需要确认。源系统的资源等待目标系统,并确保它们使用 ACKD 传递消息/数据。数据对于通信来说是一致且可靠的。
问题是如果目标系统不可用,源系统资源会一直等待直到目标系统可用。这可能导致源系统进程进入目标系统的休眠/RFC/CPIC 模式,从而阻塞这些资源。
用于
- 用于系统之间通信
- 用于 SAP Web Application Server 与 SAP GUI 之间的通信
异步
它是系统间的通信,不需要确认(类似于明信片投递)。它不需要两个系统在执行时都可用,并且不需要立即将结果发送回调用系统。
源系统资源不等待目标系统,因为它们在不等待任何确认的情况下传递消息/数据。它对于通信不可靠,因为如果目标系统不可用,数据可能会丢失。**用于 –**
- 用于系统之间通信
- 用于并行处理
事务性
它是 aRFC 的一种特殊形式。事务性 RFC 确保对最初独立的处理步骤进行事务性处理。
事务性 RFC 是一种异步通信方法,它只在 RFC 服务器中执行一次被调用的函数模块,即使由于网络问题数据被多次发送。当 RFC 客户端程序执行 tRFC 时,远程系统不必可用。tRFC 组件将调用的 RFC 函数及其相应数据存储在 SAP 数据库中,并使用唯一的事务 ID (TID)。tRFC 与 aRFC 类似,因为它不会在目标系统等待(类似于挂号信)。如果系统不可用,它将把数据写入带有事务 ID (SM58) 的 aRFC 表中,该事务 ID 由调度程序 RSARFCSE(每 60 秒运行一次)拾取。**用于 –**
- 异步 RFC 的扩展
- 用于系统之间的安全通信
排队
排队 RFC 是 tRFC 的扩展。它还确保按顺序处理各个步骤。为了保证多个 LUW(逻辑工作单元/事务)按照应用程序指定的顺序进行处理。tRFC 可以使用队列(入站和出站队列)进行序列化。因此得名排队 RFC (qRFC)。用途 -
- 事务性 RFC 的扩展
- 用于定义的处理顺序
- 如果您想确保多个事务以预定义的顺序进行处理,建议实施 qRFC。
RFC 连接的类型
**类型 3** – 条目指定 ABAP 系统之间的连接。在此处,我们必须指定主机名/IP 地址。但是,如果需要,您可以指定登录信息。这适用于两种类型的 RFC,即 ABAP 系统之间以及对 ABAP 系统的外部调用。
**类型 I –** 条目指定连接到与当前系统相同数据库的 ABAP 系统。这些条目是预定义的,无法修改。示例条目名称:ws0015_K18_24
- ws0015=主机名
- K18=系统名(数据库名)
- 24=TCP 服务名
**类型 T** – 目的地是连接到使用 RFC API 接收 RFC 的外部程序。激活类型可以是启动或注册。如果是启动,您必须指定主机名和要启动的程序的路径名。
如何编写 RFC 代码?
**1) ** 在函数模块属性选项卡(事务代码 SE37)中,将处理类型设置为“远程启用模块”以创建远程函数模块。
**2) ** 编写函数模块的代码。
**3) ** 在调用远程函数的 RFC 客户端系统中定义 RFC 服务器的目的地(通过 SM59 事务)。
**4) 声明参数**:远程函数模块的所有参数字段都必须定义为引用字段,即类似于 ABAP 字典字段。
**5) 异常:** 系统内部会引发 COMMUNICATION_FAILURE 和 SYSTEM_FAILURE 异常。您可以在远程函数中引发异常,就像在本地调用的函数中一样。
调试远程函数调用
- **无法调试**对另一个系统的远程函数调用。
- 但是,在测试 ABAP 到 ABAP 的 RFC 调用时,您可以使用 ABAP 调试器监视远程系统中 RFC 函数的执行。
- 对于远程调用,ABAP 调试器(包括调试接口)在本地系统上运行。远程函数的数据值和其他运行信息从远程系统传递过来。