RFC概述
RFC是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议。简单地说,RFC过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有一个必须是SAP
ABAP系统。这种远程功能调用也可在同一系统内部进行(如本地SAP系统内的远程调用);但通常情况下,调用程序和被调用程序处于不同系统。
1. RFC调用过程
在系统间通信的过程中,需区分发送系统和接受系统。RFC调用请求从发送系统(调用系统)中传至接受系统(被调用系统,也称远程系统或目标系统),如下图
所示,其中发送请求的系统在通信过程中又称为RFC客户端,通信的另一方则称为RFC服务端。RFC客户端发起远程功能调用以执行RFC服务器提供的功
能。
2. RFC通信的情况
根据通信方向和系统类型,公用以下三种RFC通信:
-
两个独立的SAP系统之间的通信;
-
SAP系统作为调用系统,与外部远程系统(非SAP
ABAP系统)通信;
-
外部系统作为调用系统,与SAP系统通信
3. RFC接口系统
SAP远程调用功能的能力是通过RFC接口系统(RFC interface
system)实现的。根据调用方向的不同(SAP系统调用其他模块或其他系统调用SAP模块),RFC接口提供以下两种服务:
(1)ABAP程序的调用接口
任何ABAP程序都能使用CALL FUNCTION ...
DESTINATION语句调用远程功能。DESTINATION参数告诉SAP系统被调用的功能将在调用者之外的系统上运行,通过RFC接口与远程系统进行通信。如果远程功能来自SAP
ABAP系统,则必须是实际的功能模块,并在功能库中注册为“支持远程调用”,通信双方都通过ABAP的RFC接口实现。
(2)非SAP ABAP程序的调用接口
在RFC的实现过程中,如果调用或被调用一方是非ABAP程序,则非ABAP程序必须以特定规格进行编程,以确保它可作为RFC通信中的伙伴。SAP系统为外部程序提供RFC支持接口(RFC-supported
interface)和GUI支持接口(GUI-supported
interface)。这样,在非SAP系统中,外部程序就能调用并执行SAP
RFM;反过来,SAP中的ABAP程序又能通过该支持接口使用外部程序提供的功能。
调用时,RFC接口的具体功能包括:
-
登录并退出远程系统(支持自动登录,用户名及密码将作为远程目标设定的一部分保存在表RFCDES中),并进行权限检查。
-
调用并管理远程系统会话所需的通信例程。
-
自动将实参转换成远程系统所需的格式,或反之。其中可能包含平台相关转换(如代码页转换)。RFC接口支持所有的ABAP数据类型。
-
处理通信过程中的错误,如果需要,则通知调用者。
-
RFC接口系统还负责远程调试的实现。
4. RFC 通信模式:
SAP 中同步通信是一次性的功能调用,
其前提条件是在调用远程功能时,接收系统必须是活动的, 可以接收请求并进行进一步的处理.
SAP
中的异步通信的特点是接收系统并不需要在远程功能调用时处于活动状态, 该系统可以滞后接收并处理该调用. 如果系统不可用,
已发送的调用请求将保存在发送系统的输出队列中, 并每隔一段时间反复进行调用尝试, 直到接收系统对调用响应为止.
SAP
系统中的RFC过程扩展为下述几种不同的模式:
-
同步RFC:
-
异步RFC:
-
事务性RFC:
-
队列RFC:
-
并行RFC:
5. 远程功能模块(RFM)
在SAP中, RFM 的创建方式与普通功能模块类似. 只是编写功能模块时, 需要在
Attributes 选项卡中, 将Processing Type 选项设定为Remote-Enabled Module,
该设定将该模块注册为支持远程调用的功能模块.
在创建RFM模块时, 还要注意以下几点:
(1) 参数声明, 普通模块的功能模块定义形参时并不一定要所参照的数据字典类型, 具体类型可在运行时根据实参类型确定.
但RFM则不能在运行时确定参数类型, 因而必须在参数定义时参照数据字典类型进行声明. 而且参数必须指定为值传递.
(2) 格式转换, 对于字符类型字段, 调用程序传递给被调用模块的实参与RFM形参的定义长度可以不一致.
如果传的参数的长度较短, RFC将在后面补空格, 但是, 调用方实参的定义长度不应大于被调用方形参的定义长度.
(3) 异常处理, 可在远程功能中进行异常的抛出, 其方法与普通功能模块一致, 在程序中的异常出现之处通过Raise
语句实现.需要注意的一点是, 基于ABAP类的异常是不能从远程功能调用过程中抛回给调用系统的,因此避免使用. 此外,
RFC接口还定义了如下两预设的系统异常类型:
-
SYSTEM_FAILURE, 该异常报告远程系统中的所有失败和系统问题.
-
COMMUNICATION_FAILURE, 该异常报告远程不能建立或通信中连接中断.
系统将自动的抛出这两种异常, 因此不必在程序代码中进行显式处理. 但在调用RFC功能模块时, 必须进行接收,
否则出现异常时可能会引起系统运行时 Short Dump中断.
维护远程目标(Destination)
远程目标的定义将保存在数据库表 RFCDES 中,
SM59
查看目标系统的参数.
SM51
新建 Destination
RFC 调用:
1). 正常调用目标系统.
CALL FUNCTION 'Z_MMW084_MRP_STOCK_2' DESTINATION w_dest_ugks
TABLES
itab_input = itab_ch2
itab_output = mrp_itab_ch2_stock.
2). 指定该远程目标意味着将运行当前程序的应用服务器作为目标系统.
但调用过程还是通过RFC接口实现.
CALL FUNCTION 'Z_MMW084_MRP_STOCK_2' DESTINATION
NONE
TABLES
itab_input = itab_ch2
itab_output = mrp_itab_ch2_stock.
3). 用于被远程调用的RFM内部的CALL
FUNCTION 语句中的目标指定, 通过已建立的RFC连接反过来调用该模块的
调用者或已载入的其他功能模块.
CALL FUNCTION 'Z_MMW084_MRP_STOCK_2' DESTINATION
BACK
TABLES
itab_input = itab_ch2
itab_output = mrp_itab_ch2_stock.