RFC 接口
RFC是对一个函数模块的调用,但是调用者的系统与被调函数所在的系统是不一样的。
RFC也可以在系统内被调用,但是通常调用和被调用是在不同的系统中的。

在sap系统中,远程调用的能力是有RFC接口系统提供的。 RFC允许在两个sap系统(R/3或者R/2)之间进行调用。或者
是在一个sap系统和非sap系统之间调用。

RFC由以下的接口组成
. 在abap程序的调用接口
任何一个abap程序都可以调用一个远程调用函数,使用语句:CALL FUNCTION ....DESTINATION.
这个DESTINATION参数告诉SAP系统,被调函数运行的系统不同于访问者的系统。
RFC与远程系统的通讯作为CALL FUNCTION语句的一部分。

运行在一个sap系统上的RFC函数,必须是真实存在的函数模块,并且必须在sap系统中显示为"remote".
当访问和被访问的都是abap程序,那么RFC接口提供两者到通讯中。访问者可能是任何abap程序,但是
被调用的程序必须是一个RFC函数。
主题:在abap程序中调用RFC函数, 提供了详细的信息。
主题:在abap程序中写RFC函数, 提供了写你想要调用的远程函数的信息。
. 在非sap程序中调用接口
当访问者或者被访问者是一个非sap程序,那么那个非sap程序就被规划为运行另一个程序,在RFC通讯中。
为了帮助运行RFC程序,在一个非sap系统中,sap提供了
-- 外部接口(Ext)
基于RFC和基于GUI的接口可以被外部程序使用,来调用在sap R/2或者 R/3系统中的函数模块,并且在
R/2 R/3系统中运行。
在R/2 或者 R/3系统中,abap程序,可以使用由外部程序提供的函数,通过这些接口。
假如你想要看在一个程序例子中的相关情节信息,请看相对应的单元,在教程:通讯接口(Ext).
<2>RFC in sap systems
在任何一个R/3系统中,CALL FUNCTION 是abap语言中的一部分(在R/2 Release 5.0 以上开始).它被用来执行一个函数。
RFC 是一个CALL FUNCTION 的分类上的扩展,Existing function module 可以在R/2或者R/3系统中,通过一个RFC调用,
来执行。这个过程通过添加一个DESTINATION 子句到CALL FUNCTION语句,来实现。

RFC 可以在R/2 R/3系统之间使用。 在一个IBM环境中的R/2系统,RFC通常为CICS作为一个DC系统,在版本5.0D以上。
在IMS环境中,RFC在IMS 4.1之前,是不可用的。 完全支持LU6.2协议(通过MVS/APPC).
在 OS/2,Windows,windows NT 和所有基于R/3的unix平台上的RFC API,使应用RFC功能,在SAP系统(R/3从版本2.1,R/2从版本5.0D以上)
和C程序之间成为可能。对于访问者,无论远程调用函数是由SAP系统还是C程序提供都已不重要了。
abaper可以非常自由的写自己的通讯程序。
当你调用一个RFC函数,RFC接口关注于:
. 转变所有的参数数据为远程系统所需要的形式。这里包含字符串转换,和任何依赖硬件专换要求(如,整数,浮点数)。
所有的abap数据类型都被支持。
注意: 对于字典结构,没有支持。
. 调用通讯程序,需要告诉远程系统
. 处理通讯程序错误,并通告访问者。

RFC接口对于abaper是不可见的。 处理远程程序调用是建立在CALL FUNCTION语句中的。处理被调用是自动的(以一个RFC stub 形式),对于每一个显示为remote
的函数来说。这个stub 作为调用RFC的程序和RFC函数的接口。

RFC client 和 RFC server 之间的区别。RFC client 是召唤RFC来执行函数的,而被执行的函数由RFC server提供。
以下将,被远程执行的函数叫RFC functions, 将通过RFC API提供函数的叫RFC calls.

所有RFC functions 都是可用的,在一个远程RFC服务系统中。这就意味着在执行完第一个RFC function,那么完成的上下文信息(所有的在RFC服务程序中
定义的全局变量或者在一个函数模块的主程序中) 可以被用来接下来的RFC functions 中。RFC连接仅在以下情况关闭:
. 当上下文信息在程序中中断掉,或者 在外部程序中通过RfcAbort或者RfcClose明确的关闭。
在一个R/3系统,其它的R/3系统可以被定义为信赖的系统。那么信赖的系统可以进入到被访问的系统,而不需要提供密码。

所需要的技术
外部系统
. OS/2 TCP/IP
. Windows 3.1/ 3.11 所有TCP/IP 产品,支持socket 接口
. Window NT/95 微软标准
. UNIX 平台 行业标准

 

SAP RFC通信模式

 

 

      在网络技术中,数据通信可以大致划分为两种基本模式:同步通信异步通信

 

      其本义是:异步通信时,通信双方时钟允许存在一定误差;同步通信时,双方时钟的允许误差较小。在SAP的系统间的通信过程中,也借用术语同步通信和异步通 信,但其主要差异在于调用系统是否需要立即接受返回结果。这两种通信模式各有局限性,不同的应用适用于不同的通信模式。

 

      SAP中的同步通信是一次性的功能调用,其前提条件是在调用远程功能时(或发送请求时),接受系统(服务器)必须是活动的,可以接受请求并进行进一步的处理(图一)。同步调用的优点是可以即时将数据返还给发送系统;其缺点为 在系统对话时必须确保两个系统都处于活动的状态,否则对话会出现严重中断,影响业务应用的处理过程。例如,在本地系统中创建一个采购订单,但是在保存该采 购订单之前,需要远程访问中心财会系统,以进行预算检查。这个过程要求即时的检查结果,因而需要通过同步调用实现。如果中心财会系统暂时不可用,那么采购 订单也将无法创建。

 


图一 SAP中的同步通信

 

      SAP中的异步通信的特点是接收系统并不需要在远程功能调用时处于激活状态,该系统可以滞后接收并处理该调用(图二)。如果系统部可用,已发送的请求将保存在发送系统的输出队列中,并每隔一段时间反复进行调用尝试,直到接收系统对调用响应为止。异步通信的优点是 不需要接收系统随时可用,如系统维护、升级等情况均不影响请求发送系统的业务处理;但该模式不适用于要求即时响应的处理过程。例如,在系统中向外部供应商 发出一个采购订单,如果该供应商的系统暂时不可用,则该订单暂时置于发送的请求队列,每隔一段时间重新发送,直到供应商收到该订单为止。这一过程可以以后 台作业形式完成。

 

                                                                                             

 

图二 SAP中的异步通信

 

以上述两种基本通信模式为基础,SAP系统中的RFC过程扩展为以下几种不同的模式。

 

1. 同步RFC

 

同步RFC(sRFC,synchronous RFC)是RFC的最原始版本,其执行基于同步通信模式,远程调用时,通信双方的系统必须均可用,调用程序等待远程功能处理结束并返回结果。

 

     可以使用命令 CALL FUNCTION 函数的名字DESCTINATION 目的地。调用远程的ABAP 函数模块。当以这种方式调用一个函数时,总是应该包括对标准异常OMMUNICATION_FAILURE 和 SYSTEM_FAILURE 的处理。

 

2. 异步RFC

 

在异步RFC(aRFC,asynchronous RFC)中,执行并不依赖于RFC服务器系统的可用性。被调用的远程功能启动之后,调用程序继续运行,远程功能和调用程序处理相互分离。远程功能的结果可以稍后接收。

 

       使用 STARTING NEW TASK <task name>附加关键字,可以异步的调用一个远程函数模块。任务名称可以任意选择。被调用的函数模块在它自己的工作进程中执行。只能处理两个系统异常(COMMUNICATION_FAILURE 和 SYSTEM_FAILURE)

 

3. 事务性RFC

 

事务性RFC(tRFC,taansactional RFC)广义上也属于异步通信模式, 调用程序不接收调用结果而继续运行,但并不立即启动远程功能。相关联的RFC可捆绑至一个事务(即逻辑工作单元LUW,logical unit of work)中,然后通过事务性处理,将LUW内部各个调用中的更新操作作为整体提交或全部取消,且保证所有操作只执行一次,以确保RFC功能的可靠和安 全。

 

       在同步和异步RFC中,每个调用都在远程系统里创建·一个独立的工作逻辑单元(LUW),可以用事务RFC把多个远程函数分组到一个LUW中,如果发生错误则具有自动回滚机制。用IN BACKGROUND TASK附加关键字来使用tRFC,必须放在DESTINATION条目之前。

 

4. 队列RFC

 

队列RFC(qRFC,queued RFC)是事务性RFC功能上的进一步扩展。在事务性RFC中,存在多个LUW时,这些LUW的执行次序是无法确定的。如果要确保每个LUW都按照指定的顺序执行,可以通过队列RFC对事务性RFC进行序列化。

 

     要确保事务性RFC调用中的LUW都按照其创建次序执行,需要使用队列RFC创建LUW序列。队列RFC(qRFC)是事务性RFC(qRFC)的增强版,可用于SAP-SAP及SAP-非SAP之间的连接。tRFC调用前通过函数模块TRFC_SET_QUEUE_NAME指定想要使用的队列。

 

5. 并行RFC

 

并行RFC(pRFC,parallel RFC)实质上为异步RFC,在功能上实现多个SAP系统或同一SAP系统内部不同应用服务器间,以及应用服务器内部各个工作过程的并行处理。

 

      特殊的RFC,它是aRFC的一种扩展类型。因为它改善了系统的性能,在执行大量的aRFC时。SAP使用它在MRP(Material Requirement Planning 物料需求计划)里面提高速度。

 

上述模式中的前三种是RFC的基本模式,而队列RFC和并行RFC可以视为是基本模式的扩展或衍生。

 

RFC  Remote function Call 远程功能调用, 是SAP系统之间以及非SAP系统之间程序通信的基本接口技术. 例如BAPI , ALE都是基于RFC实现的。

 

RFC连接类型:

 

1.
类型2: R/2连接

 

2.
类型3: ABAP连接或R/3连接,指定主机名和通信服务

 

3.
类型I:内部连接,与当前系统连接到同一ABAP系统中,预定义无法修改,与SM51中所显示的应用服务器名相同

 

4.
类型L:逻辑目标,通常工作流系统指定过程中配置的RFC目标即为该类型的逻辑目标

 

5.
类型X:指定安装了特殊的ABAP设备驱动程序的系统,必须制定ABAP设备驱动程序名

 

6.
类型S:通过SNA或APPC启动的外部程序连接

 

7.
类型M:通过CMC到ABAP系统的异步RFC连接

 

8.
类型T:通过TCP/IP并使用RFC库或SAP连接器的外部程序连接;分为启动(指定主机名、程序路径名)和注册(RFC服务器程序)两种连接模式。

 

9.
类型G:定义外部系统到本地HTTP连接

 

10.
类型H: 定义ABAP系统到本地的HTTP连接

 

远程调用RFM(通过RFM实现):

 

1.
远程目标可以是文字或变量,其值为SAP系统中一直的远程目标系统。

 

2.
若远程系统是当前系统中的SAP应用服务器,也可以直接指定应用服务器名称,则SM59中的I类型目标

 

3.
SM59定义的RFC目标是区分大小写的。DESTINATION附加项中目标变量的值必须与其完全一致。

 

具体说明:

 

      通过CALL FUNCTION语句进行远程功能调用时,可形成不同的调用模式:

 

1.      CALL FUNCTION DESTINATION 以同步RFC方式实现RFM调用,若后面无其他附加项,则形成同步RFC调用,调用程序等待远程调用结果以继续执行

 

2.      CALL FUNCTION STARTING NEW TASK 以异步RFC方式实现RFM调用,调用程序不等待远程调用结果继续执行,结果将在回调子程序(callback subroutine)中接收

 

3.      CALL FUNCTION IN BACKROUND TASK 以事务性RFC方式实现RFM调用,远程功能暂不开始执行,等待COMMIT WORK 语句出现时,一次性执行一个或多个远程功能

 

      远程功能调用时,仅允许通过值传递参数,不能进行引用传递,因为在RFC过程中,可以传递参数,并返回结果,但不能改变调用程序的上下文

 

      对表类型参数,在本地普通功能调用中默认为引用传递,不需要创建内表的本地副本,RFC不支持引用传递机制,将进行隐式的值传递调用,必须在RFC客户和RFC服务器之间交换整个表,只传输实际表格,如果没有指定表参数,则在被调用功能中使用空表。

 

      RFC使用delta管理机制最小化参数和结果传递构成中的网络负载,delta的意思就是只传递已经变化的数据。

 

RFC上下文:

 

      SAP程序本地正常情况调用功能模块是,模块将在调用程序的工作过程内部运行(work process),但是系统调用功能模块RFM时,系统将在独立的工作进程中运行该模块。通过RFC接口进行的所有远程功能调用都在目标系统中存在一个独 立的RFC上下文,即该RFC内存滚动区roll area。

 

      执行RFC服务器系统中的远程调用功能后,该功能模块的功能组将被加载至运行时程序上下文的会话,即功能模块的主程序(或非ABAP得RFC服务器程序)。

 

      一旦初始化了一个功能模块,程序就将整个功能组载入至主程序的上下文,并保持至调用程序结束。

 

      目标为非SAP系统时,该功能通过RFC库中的API实现(RfcAbort或RfcClose),或通过功能模块RFC_CONNECTION_CLOSE显示关闭RFC连接

 

 RFM调用中的LUM和隐式数据库提交

 

      SAP存在特定的数据库提交和回滚机制,该机制就是通过LUW(逻辑工作单元)实现的。通常情况下的功能模块和柱程序位于相同的LUM中,因此不会触发数据库提交或回滚的过程(该过程通常通过COMMIT/ROLLBACK语句显示触发)。但 同步RFC和异步RFC调用中的每一个功能模块都拥有自己的LUM,即在每次远程调用时,当前程序都将进行内存区的释放,因此将触发隐式的数据库提交,之 前的所有数据库更新将不能回滚,对于事务性RFC,则有管机制将多个远程调用操作绑定至同一个LUM,整体提交或回滚。

 

RFM调用中的对话处理

 

对于同步RFC和异步RFC调用,可以存在对话dialog过程,例如call screen \ call transaction或列表处理等情况,RFC可以进行后台处理,但如果在后台中心处理RFC中的对话,则将导致程序中断,从而触发系统异常SYSTEM_FAILURE。

 

RFM调用

 

    在进行ABAP-ABAP同步RFC和异步RFC调用时,可以进行调试以监控远程系统中RFC功能执行的情况,可以设置静态断点、单步执行、观察变量等功能,对于同步RFC,系统在当前会话中进入远程调式界面,对于异步RFC,系统将打开新会话进行远程调试。

 

RFC与Unicode

 

Unicode是一种编码体系,建立在Unicode编码体系上的系统称为Unicode系统,在Unicode系统和非Unicode系统间进行RFC调用时,可能会出现与代码页(code page)转换相关的问题

 

 同步RFC方式的RFM调用

 

       同步RFC要求远程系统在调用时可用,调用程序的处理暂停,并等待远程功能调用的返回结果再继续。

 

对于表类型参数,只有扁平结构内表可以被传输,其他类型参数可以用于传输纵深类型以及STRING类型的数据,将内表通过tables参数进行传输将获取较快的传输速度,因为系统内部通过的二进制格式而不是XML格式进行传输。

 

      如果远程RFM处理时出现交互对话过程,将在当前调用程序的会话中先进行远程对话处理,处理结束后再继续调用程序

 

在远程系统为SAP ABAP系统的情况下,可以对功能模块进行正常的调试,即step in远程模块,系统在当前会话中进行远程调试,完成后再回到调用程序的调试界面。

 

同步调用的异常处理:

 

      同步调用RFC时,系统自动处理标准异常communication_failure和system_failure

 

      若在系统中没有正确维护远程目标,或到远程系统的连接不能建立,系统将触发communication_failure异常

 

      若连接成功,但指定的远程功能不存在于目标系统中,系统将触发system_failure

 

在上程序加错误处理:

 

  • Exceptions: 
  • Communication_failure = 1 message meg_text.  
  • System_failure = 2 message meg_text.  

 

      若发生异常,不会引起Short Dumpt中断,与该异常相关的中断的首行说明内容被传递到message附加项指定的变量msg_text中,变量类型为扁平的字符结构。

 

    • 确保远程目标在SM59种被维护
    • 确保功能模块存在于该目标系统中

 

异步RFC方式RFM调用:

 

  • CALL FUNCTION rfm_name   
  •   STARTING NEW TASK taskname  
  •   [DESTINATION dest]   
  •   [EXPORTING   p1 = a1 ... pn = an ... ]  
  •   [TABLES      t1 = itab1 ... tn = itabn ... ]   
  •   [EXCEPTIONS  exc1 = e1 ... [MESSAGE mess] ...  
  •   excn = en ... [MESSAGE mess] ...   
  •   [OTHERS = n_others].  

 

STARTING NEW TASK 指明异步调用模式,功能模块在新的工作过程中执行,也可以再后台模式处理异步RFC调用过程,在后台处理时,每个异步RFC调用也将占据一个对话工作过程。

 

      异步RFC调用过程只能使用TABLES、EXPORTING(对应功能模块设定中的Import参数)、EXCEPTIONS参数。调用程序并不等待该模块的返回结果,因而不能指定IMPORTING 参数,即不能直接接收从被调用功能中的返回信息。调用的同时只能接收系统标准异常,对于功能模块中抛出的其他特点异常则不能直接接收

 

 异步远程对话处理和调试

 

  • 异步RFC调用过程也支持远程对话处理,在异步RFC调用时,系统总是打开新的工作进程,因而如果被调用功能模块包含对话程序(屏幕调用处理),则在该功能模块执行时,调用系统中将出现新的外部会话窗口,若调用功能时打开的会话数自己达到6个,则试图打开新窗口时触发system_failure.

 

  • 异步RFC调用时,对RFM进行step in的调试过程,调用程序本身的调试会话不会进入RFM内部,系统也打开新的会话,单独增加一个窗口,进行目标系统中RFM的调试,将断点放在RFM的CALL FUNCTION语句处,在异步RFC模式下进行调试

 

 异步RFC调用时接收结果

 

通过语句中的附加项PERFORMING return_form on end of task 实现

 

  • CALL FUNCTION rfm_name  
  •  
  •   STARTING NEW TASK taskname  
  •  
  •   PERFORMING return_form ON END OF TASK  
  •   ...  
  • FORM return_form USING taskname.  
  • RECEIVE RESULTS FROM FUNCTION rfm_name  
  • ENDFORM.  

 

      子程序必须存在于调用程序中,如果回调子程序中包含任何使当前程序执行中断的语句,call screensubmitcommit workwaitRFC调用及WI类型的消息等,则不能成功返回结果。