RFC(Romote Function Call:远程函数调用)是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议。简单地说,RFC过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有一个必须是SAP ABAP系统。这种远程函数调用也可在同一系统内部进行(如本地SAP系统内的远程调用),但通常情况下,调用程序和被调用程序处于不同系统。
RFC既是一种接口对象,也是一种特殊的函数模块,可以用RFC去调用SAP系统里面的ABAP Function和外部系统的服务程序。但要实现这种功能必须要有一个RFC Destination。
SAP系统RFC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。外部RFC调用的模型如图3-12所示。
图3-12
1.RFC的特点
■RFC是基于CPI-C的一种SAP接口协议,它大大简化了系统之间的程序交换过程。
■RFC能自动进行数据传输,当在本地系统相互调用时,则RFC相当于一般的函数模型。
■可以自动登录到与SAP相关联的系统,通过设置RFCDES先链接外部系统,这时用户名和密码被保存在RFCDES表中(事务代码为SM59)。
■能管理数据的交换过程,参数传输和错误处理。
■可以进行远程调试。
■有RFC生成器(RFC Generator)。
■RFC函数必须为Remote-Enabled Module,同时Change Parameter不可用。
■SAP公司提供RFC library(RFC-SDK)为目前所有的外部平台,当外部平台安装完成后,RFC客户或RFC服务器程序就可以通过这个RFC函数调用外部程序了。
优点:SAP的RFC调用是其接口技术中最简单和易用的一种方式,该方式开发比较简便,特别适合用于外部报表开发。
缺点:但对于大数据量的查询效率相对较低,一般大数据量开发大多使用IDoc和BAPI接口开发技术。
2.RFC技术应用
如上所说RFC(Remote Function Call)远程函数调用,是SAP系统之间以及SAP与外部系统之间通信的基本接口技术,其过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有一个必须是SAP系统。
(1)SAP外部接口
●程序通信接口
●文件I/O接口
●数据接口
程序通信接口和文件I/O接口是与其他系统进行数据交换的通路,数据接口用来实现BDC和SAP SQL。
(2)RFC的调用过程
■在系统间通信过程中,需要区分发送系统和接受系统。
■RFC调用请求从发送系统中传至接收系统,发送请求的系统在通信过程中称为RFC客户端,通信另一方则称为RFC服务器。
■RFC客户端发起远程函数调用以执行RFC服务器提供的功能。
■调用系统和被调用系统均可以是SAP系统或非SAP系统。
(3)RFC通信方式(如图3-13所示)
图3-13
■两个独立的SAP系统之间通信。
■SAP系统作为调用系统,与外部远程系统(非SAP ABAP系统)通信。
■外部系统作为调用系统,与SAP系统通信。在SAP系统之间,两个ABAP程序通过RFC接口进行通信。
■系统A调用SAP系统B中的功能模块。
■B系统中被调用的SAP功能模块必须支持远程调用,该SAP功能模块称为远程函数模块。
在与其他语言的程序进行通信时,SAP将为各种语言及相关的操作系统提供RFC库及SAP连接器,以实现RFC接口,如:
■为C和C++提供的RFC SDK。
■为Java提供的Java连接器JCo。
■为.NET提供的.NET连接器NCo。
SAP调用远程功能的能力是通过RFC接口系统(RFC Interface System)实现的。
(4)RFC接口提供以下两种服务
■ABAP程序的调用接口。
CALL FUNCTION...DESTINATION,若远程功能来自SAP ABAP系统,则函数必须是实际的函数模块,并支持RFC远程调用。
■非SAP ABAP程序的调用接口。
SAP系统为外部程序提供RFC支持接口和GUI支持接口,这样在非SAP系统中,外部程序就能调用并执行SAP远程函数模块,反之亦然。
RFC调用时,RFC接口具体功能包括:
■登录并退出远程系统,并进行权限检查。
■调用并管理远程系统会话所需的通信进程。
■自动将实参转换成远程系统所需的格式,RFC接口支持所有ABAP数据类型。
■处理通信过程中的错误。
■负责远程调试的实现。
(5)RFC通信模式
■同步通信,双方时钟允许误差较小,一次性功能调用。
■异步通信,双方时钟允许存在一定误差。
■差异在于调用系统是否需要立即接收返回结果。
SAP系统中的RFC过程扩展有以下几种不同模式:
■同步RFC。
■异步RFC。
■事务性RFC,广义上也属于异步通信模式。
■队列RFC,对事务性RFC功能的进一步扩展。
■并行RFC,实际上是异步RFC。
(6)支持远程调用的函数模块
■在创建远程函数模块时,需要在指定属性中的Processing Type选项设定为Remote-Enabled Module。
■声明参数时,不能在运行时确定参数类型,必须在参数定义时参照数据字典类型进行声明。
■必须指定为值传(Pass Value),对于表类型参数,系统也隐式进行值传递。
■格式转换,若传入参数的长度较短,RFC将在后面补充空格。这意味着对于字符类型数据,长度可以不必完全一致,但是调用方实参不应大于被调用方形参定义的长度。
■异常处理,可在远程函数中进行异常的抛出,在程序中的异常出现之处通过raise语句实现,但是基于ABAP类的异常不能从远程函数调用过程中抛回给调用系统,因此需要避免使用。
■RFC接口预设的系统异常类型:
●SYSTEM_FAILURE,报告远程系统中的所有失败和系统问题。
●COMMUNICATION_FAILURE,若不能建立或通信中连接中断,抛出异常。
●系统将自动抛出以上2种异常,不必在程序代码中进行显示处理,调用RFC功能时必须接收,否则出现异常时可能引起系统运行时SHORT DUMP中断,所有其他不可知类型的异常指定为OTHERS类型。
调用SAP标准远程功能:
■函数模块的调用通过Call Function语句实现,远程函数调用,可通过在Call Function语句中添加Destination子句完成。
■Destination后面接的是远程目标名称,该目标在SM59中设定。
■可以在远程调用时直接指定当前系统的应用服务器作为RFC目标,格式为<hostname>_<sysid>_<sysnr>。其中<hostname>为主机名,<sysid>为SAP系统名,<sysnr>为系统编号。
■通过SM51查看当前SAP系统中活动的应用服务器。例如,调用SAP标准远程函数模块:SXPG_COMMAND_EXECUTE,通过RFC调用时可以运行本地或其他SAP系统中的外部命令。
3.RFC的类型
按照RFC的调用方式来分,有下面五种类别:
(1)sRFC:同步的RFC(synchronous RFC)
sRFC是RFC的第一个版本,它要求连接的双方是同步的工作方式,即都是在可用状态才能够实现成功调用。
(2)aRFC:异步的RFC(Asynchronous RFC)
aRFC这种RFC可以实现异步的RFC调用方式,它可以进行多个并发调用,并且不要求被调用系统为可用状态。发出调用系统会一直尝试直到获得被调用系统的应答。它通常用于需要提高系统并行调用多个RFC的效率时,相对于强制等待程序的结果,它的效率更高。
(3)tRFC:事务RFC(transaction RFC)
tRFC是对aRFC进行相关技术改进后的一个RFC版本,它与aRFC的相同点是实现异步调用,其优点是可以将多个调用进行LUW分组处理,并只执行一次运行。现在aRFC基本上已经停用。
(4)qRFC:队列RFC(quene RFC)
qRFC是tRFC的一个增强版本,它保证了所传输数据的处理次序。
(5)pRFC:队列RFC(parallel RFC)
pRFC是一种特殊的RFC,它是aRFC的一种扩展类型。因为它改善了系统在执行大量aRFC时的性能。SAP使用它在MRP里提高速度,但是它只能执行在同一个系统或同一个Client里。
举两个实际的例子:
例子1,总公司A和分公司C、D、E,某分公司找到新的客户或者客户信息更改时,分公司在本公司系统进行操作,操作完毕后数据通过RFC接口更新到总公司系统内,实现信息共享和同步。(www.daowen.com)
例子2,同样是前面的公司结构,总公司A需要对某供应商进行锁定停用或者删除,在A公司系统进行操作,操作完成后触发某个远程函数模块(Remote Function Module)将操作同样应用到分公司的系统里,这样总公司锁了的供应商,分公司不能再向它下单了。
4.RFC的原理
(1)同步RFC
若使用sRFC,程序就会被同步执行,即主程序会一直等到被sRFC调用的程序执行完毕并返回后,才继续往下执行。这样对不同系统之间的数据共享有比较高的安全性,但在程序执行的效率比较低。若sRFC是发生在两个不同的R/3系统之间,那么可以在主程序那里调试正在运行的远程的被调用程序。还有,在R/3系统间的RFC里,所有的会话(Dialogs)都会被显示在原调用程序里,如图3-14所示。
图3-14
(2)异步RFC
若使用aRFC,可以并行执行程序,程序的执行效率比较高,但是数据共享的安全性比较低。因为使用aRFC时,被调用的函数可以随时返回数据到原调用程序中,所以原调用程序必须要保持在“Active”状态,直到被调用函数返回为止。并且,当使用aRFC时,系统需要保证足够的资源为其他进程服务,如图3-15所示。
图3-15
注:同步和异步的区别
■同步:提交请求→等待服务器处理→处理完毕返回。这个期间客户端浏览器不能做任何事,如普通B/S模式。
■异步:请求通过事件触发→服务器处理(这时浏览器仍然可以做其他事情)→处理完毕,如AJAX技术。
(3)事务RFC
tRFC是sRFC和aRFC的优点和缺点的折中。tRFC可以把在同一个Destination里的几个函数模块结合在一个单一的逻辑事物单元(Logic Unite of Work)里,然后用事务代码SM58去管理tRFC-LUWs。
在tRFC中,利用自动回滚机制,远程地去处理在同一个LUW里的几个函数模块。而且,tRFC能够保证被调用的函数模块被执行,即使在该函数模块所在的系统不能被得到的时候。
实现事务RFC必须在DESTINATION'NAME'这个语句之前加入IN BACKGROUND TASK,而且最后COMMIT WORK绑定成一个LUW发送,如图3-16所示。
图3-16
tRFC与sRFC和aRFC的不同之处在于远程函数不会返回数据给程序,但可以用事务代码SM58去显示或处理(Delect and Execute)有错误或不能被执行的tRFC-LUWs。
(4)队列RFC
实际上,qRFC是把tRFC-LUWs连续成一个队列,并能够保证tRFC-LUWs按照它们生成时的队列顺序被进行处理。这个队列的属性和tRFC输入的数据被保存到队列表TRFCCOUT和tRFC tables ARFCSSTATE/ARFCSDATA里。可以用事务代码SMQ1去显示和维护这些信息。在Call Function'NAME'后加上Exporting Qname='NAME'实现队列RFC,如图3-17、3-18所示。
5.RFC的维护
为了远程调用函数模块,必须要一个进入表RFCDES的入口。因为RFC远程目的地的信息是在表FRCDES里进行维护的,如图3-19所示。
图3-17
图3-18
其事务代码是SM59,如图3-20所示。
(1)RFC Destination主要包括:
■类型2:R/2连接。
■类型3:ABAP连接或R/3连接,指定主机名和通信服务。
■类型I:内部连接,与当前系统连接到同一ABAP系统中,预定义无法修改,与SM51中所显示的应用服务器名相同。
■类型L:逻辑目标,通常工作流系统指定过程中配置的RFC目标即为该类型的逻辑目标。
■类型X:指定安装了特殊ABAP设备驱动程序的系统,必须制定ABAP设备驱动程序名。
■类型S:通过SNA或APPC启动的外部程序连接。
■类型M:通过CMC到ABAP系统的异步RFC连接。
图3-19
图3-20
■类型T:通过TCP/IP并使用RFC库或SAP连接器的外部程序连接;分为启动(指定主机名、程序路径名)和注册(RFC服务器程序)两种连接模式。
■类型G:定义外部系统到本地HTTP连接。
■类型H:定义ABAP系统到本地的HTTP连接。
(2)三种通用的有特殊意义的Destination:
■Destination'BACK':是在两个不同的R/3系统之间使用RFC,如果在被调用的系统的程序里使用了“Destination'BACK'”的话,那么程序执行到这里就会返回到原调用的系统程序中去。
■Destination'SPACE':是本地调用。
■Destination'NONE':是表示调用通过Gateway翻译后,又回到了本地,如图3-21所示。(旧的RFC使用SAP CPI-C协议,必须通过SAP Gateway进行翻译,新的Fast RFC则不需要使用CPI-C协 议。)
(3)SAP ABAP系统间的RFC实现(通过Remote Function Module实现)
■远程调用函数
远程目标可以是文字或变量,其值为与SAP系统中一致的远程目标系统。若远程系统是当前系统中的SAP应用服务器,也可以直接指定应用服务器名称,如SM59中的I类型目标。
图3-21
SM59定义的RFC目标是区分大小写的。Destination附加项中目标变量的值必须与其完全一致。
■通过CALL FUNCTION语句进行远程功能调用时,可形成不同的调用模式:
●CALL FUNCTION DESTINATION以同步RFC方式实现远程函数调用,若后面无其他附加项,则形成同步远程函数调用,调用程序等待远程调用结果以继续执行。
●CALL FUNCTION STARTING NEW TASK以异步RFC方式实现远程函数调用,调用程序不等待远程调用结果继续执行,结果将在回调子程序(CallBack SubRoutine)中接收。
●CALL FUNCTION IN BACKROUND TASK以事务性RFC方式实现远程函数模块调用,远程功能暂不开始执行,等待COMMIT WORK语句出现时,一次性执行一个或多个远程功能。
■远程函数参数处理
远程功能调用时,仅允许通过值传递参数,不能进行引用传递,因为在RFC过程中,可以传递参数,并返回结果,但不能改变调用程序的上下文。
对表类型参数,在本地普通功能调用中默认为引用传递,不需要创建内表的本地副本,但RFC不支持引用传递机制,将进行隐式的值传递调用,必须在RFC客户和RFC服务器之间交换整个表,只传输实际表格,如果没有指定表参数,则在被调用功能中使用空表。
RFC使用delta管理机制最小化参数和结果传递构成中的网络负载,delta的意思就是只传递已经变化的数据。
■RFC上下文
SAP程序本地正常情况调用功能模块是将在调用程序的工作过程内部运行(Work Process),但是系统调用远程函数模块时,系统将在独立的工作进程中运行该模块。通过RFC接口进行的所有远程功能调用都在目标系统中存在一个独立的RFC上下文,即该RFC内存滚动区(Roll Area)。
执行RFC服务器系统中的远程调用功能后,该功能模块的功能组将被加载至运行时程序上下文的会话,即功能模块的主程序(或非ABAP的RFC服务器程序)。
一旦初始化了一个功能模块,程序就将整个功能组载入至主程序的上下文,并保持至调用程序结束。
目标为非SAP系统时,该功能通过RFC库中的API实现(RFCAbort或RFCClose),或通过功能模块RFC_CONNECTION_CLOSE显示关闭RFC连接。
■远程函数调用中的LUM和隐式数据库提交
SAP存在特定的数据库提交和回滚机制,该机制就是通过LUM(逻辑工作单元)实现的。通常情况下的功能模块和主程序位于相同的LUM中,因此不会触发数据库提交或回滚的过程(该过程通常通过COMMIT/ROLLBACK语句显示触发)。但同步RFC和异步RFC调用中的每一个功能模块都拥有自己的LUM,即在每次远程调用时,当前程序都将进行内存区的释放,因此将触发隐式的数据库提交,之前的所有数据库更新将不能回滚,对于事务性RFC,则有关机制将多个远程调用操作绑定至同一个LUM,整体提交或回滚。
■远程函数调用中的对话处理
对于同步RFC和异步RFC调用,可以存在对话dialog过程,例如call screen/call transaction或列表处理等情况,RFC可以进行后台处理,但如果在后台中心处理RFC中的对话,则将导致程序中断,从而触发系统异常SYSTEM_FAILURE。
在进行ABAP-ABAP同步RFC和异步RFC调用时,可以进行调试以监控远程系统中RFC功能执行的情况,可以设置静态断点、单步执行、观察变量等功能,对于同步RFC,系统在当前会话中进入远程调式界面,对于异步RFC,系统将打开新会话进行远程调试。
■RFC与Unicode
Unicode是一种编码体系,建立在Unicode编码体系上的系统称为Unicode系统,在Unicode系统和非Unicode系统间进行RFC调用时,可能会出现与代码页(code page)转换相关的问题。
■同步RFC方式的远程函数调用
同步RFC要求远程系统在调用时可用,调用程序的处理暂停,并等待远程函数调用的返回结果再继续。
对于表类型参数,只有扁平结构内表可以被传输,其他类型参数可以用于传输纵深类型以及STRING类型的数据,将内表通过tables参数进行传输将获取较快的传输速度,因为系统内部通过的二进制格式而不是XML格式进行传输。
(4)外部程序调用RFC
■RFC-SDK(Software Development Kit)必须要安装在外部平台上。
■可以用一个外部的RFC客户端程序去调用R/3系统里的函数模块。
■可以从ABAP程序里调用C程序(这个程序里带有一个已经被声明为远程的RFC服务程序)。
■在SAP系统里,RFC生成器可以生成一个虚拟的Function Module的C程序文件集合。这些文件被外部的RFC客户端和服务器端使用,如图3-22所示。
(5)RFC的安全性问题
■用RFC去开始一个Function Module,那么在目的系统里面,RFC登录用户要为Objects_RFC认证提供一个相应的认证信息。
图3-22
■在两个SAP系统之间,因为存在一种可信关系,在资源系统里特殊的用户可以使用用户释放功能,而不用password就能登录到目标系统的RFC里,如图3-23所示。
图3-23
■在目标系统里释放一个用户,你需要给认证对象S_RFCACL一个认证。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。