ABAP RFC 详细讲解

本文详细介绍了在ABAP中使用远程函数调用(RFC)的方法,涵盖了RFC的基础知识、在SAP系统中的应用、技术需求、调用流程、参数处理、事务处理、异步调用、权限检查及异常处理等内容。

RFC Programming in ABAP
目录
<1> RFC 基础
<2> RFC 界面
<3> SAP系统中的RFC
<4> 需要的技术
<5> 在ABAP中调用RFC
<6> 介绍
<7> 在远程调用时,参数处理
<8> 本地调用RFC
<9> RFC调用的返回信息
<10>在RFC中使用事务
tRFCs
<11>qRFC,传递队列
概览overview
programming serialization
using
事务队列和队列设置
工具
<12>RFC异步调用
异步调用RFC的要求
从一个异步调用RFC中接受结果
保持远程上下文
平行处理异步调用RFC
<13>检测RFC权限
<14>定义RFC异常
<15>在abap中写RFC
<16>RFC处理步骤
<17>程序方针
<18>调试RFC模块
<19>维护远程目标
<20>显示,维护,和测试远程目标
<21>输入目标参数
<22>目标类型
<23>维护目标组
<24>维护R/3系统之间的信赖关系

<1>RFC Basis,基础
这一节给出了一个纲要,来浏览在一个sap系统中的RFC,纲要如下:
RFC接口是如何工作的
RFC提供的功能
技术需求以及所支持的所有平台
(1) 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语句,来实现。
例子:
SAP System A SAP System B External Client Program
ABAP Program ABAP Function Module Routine
...
CALL FUNCTION 'ABC' FUNCTION ABC. Rfcopen(...)
DESTINATION 'DEST' ... RfcCallReceive('ABC')
EXPORTING f1 = a1 ENDFUNCTION. ...
IMPORTING f2 = a2 RfcClose(...)
CHANGING f3 = a3
TABLES t1 = tab External Server Program
EXCEPTIONS Routine
COMMUNICATION_FAILURE = 1 main()
system_failure = 2 [
... RfcAccept(..)
RfcInstallFunction{'ABC',abc ...}
RfcDispathc(...)
...
RfcClose(...)
]
RfcGetData(...)
RfcSendData(...)

这个目标参数destination 呈现一个入口,在RFCDES表中(通过sm59可以定义destination).这个入口包含了所有必要的字段,这些字段
用来连接和登陆到目标系统中。

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系统可以被定义为信赖的系统。那么信赖的系统可以进入到被访问的系统,而不需要提供密码。

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

不同的平台需要包含的库和文件。
不详述.....

<4> 在abap中调用远程函数.
这一节包含以下主题:
介绍
参数处理
本地调用
有返回
使用事务
使用异步
检测权限
预先定义异常

(1) 介绍
与普通的函数相比, 你要包含额外的destination子句,来定义这个函数是在那里运行的。(调用来,不是在本地运行的,而是在目标服务器上运行的)
CALL FUNCTION RemoteFunction
DESTINATION Dest
.....

字段Dest可以是一个字符,也可以是一个变量:它的值是一个逻辑目标(例如:hw1071_53),可以被本地的sap系统识别。Logical destinations 可以被定义
到RFCDES表中(或者是TRFCD表,在R/2系统中), 可以通过sm59事务或者根据菜单路径: TOOLS , Administration, Adminstration network RFC destinations,
来定义。你也可以通过执行Guide(IMG)进入到Logical destinations. Tools->Customizing->Enterprise img. ->Cross-application components -> ALE ->
Communication -> Define RFC destination.
RFC的概念: 例如,允许你进入一个R/2系统的函数模块,通过一个R/3系统的函数。假如你想要读客户记录从你的R/2系统的数据库中,那么在那个可以接受客户记 录的R/2系统环境中创建一个远程调用函数。从你的R/3系统中,调用这个函数。 使用RFC,并且列出到R/2系统的Logical destinations.
R/3 系统: client
CALL FUNCTION 'RFC_CUSTOMER_GET'
DESTINATION 'K50'
EXPORTING KUNNR = custno
TABLES CUSTOMER_T = ITAB
EXPORTING kunnr = custno
TABLES customer_t = ITAB
EXCEPTIONS NO_RECORD_FOUND = 1.
R/2 系统: Server
FUNCTION RFC_CUSTOMER_GET.
(Read customer record)
ENDFUNCTION.
(2) 参数处理
当你调用一个RFC,系统处理参数传递与调用本地函数进行参数传递,是有区别的。
TABLES parameters
实际的数据库表会被传递,而不是表头。假如一个表参数没有指定,那么一个空的表会在被调函数中使用。
RFC使用一个得耳塔管理机制来缩短网络下载参数和结果数据。abap内表可以被用来作为RFC的参数。在一个本地函数调用时,一个参数内表
通过指针来传递,并且没有新的本地拷贝副本被创建.RFC不支持指针机制。因此整个表不得不被传递,在RFC client和RFC server之间。
当RFC server接收到表入口,它将创建一个本地的内表拷贝。然后仅delta信息被返回到了RFC client。这个信息不是一旦有表被操作就传递到
RFC client的,然而,代替的是,当所有的delta信息都集中了,然后就一次性的传递到RFC client.
当第一次一个表被传递,就给定了一个object-ID,并且别注册是"Virtual global table"在调用系统中(RFC client所在系统)。
这个信息将一直被保留一直到函数返回。然而,假如多重call-backs产生,change-log将被传递回来,并且更新前面的本地拷贝,但是表本身仅
需要拷贝一次(第一次).
(3) Calling RFC locally
有些时候,你想要调用一个远程函数(就是,一个显示为远程的函数)从一个相同的系统中。那么这个函数即可以以远程方式运行也可以以本地调用
方式运行,这个决定于CALL FUNCTION语句。是否是以远程方式或者是本地方式,会影响到参数的处理方式(如上面所讲述)。
两种选择:
. CALL FUNCTION ...DESTINATION = 'NONE'
这是一个远程调用,即使DESTINATION = 'NONE',但是这意味着远程函数将会运行在访问者相同的系统中。 因为是远程调用,那么函数运行在
它自己的区域。
. CALL FUNCTION ... [no DESTINATION userd]
这就是本地调用了,即使这函数被显示为远程的。函数不会被运行在不同的区域,并且作为普通的函数调用。
参数传递也以普通函数模块处理的方式。特别的是,假如一些EXPORING未指明,它就会异常中断。
CALL FUNCTION 'RFC_CUSTOMER_GET'
EXPORTING kunnr = custno
TABLES customer_t = ITAB
EXCEPTIONS no_record_found = 01.
(4) Calling Remote Functions BACK
RFC client 和 RFC server 在RFC开始的时候就已经被决定了。 当一个函数正在被处理在RFC server上,那么这个 server可以在RFC client上调用一个函数。
换句话说,RFC调用它的访问者(假如访问者自身是一个函数模块),或者任何一个装载访问者的函数模块。那么call-back 函数会运行在相同的
程序上下文,作为原先的访问者。
你可以追踪这个call-back 机制,通过使用特别的desitination 名称'BACK'.假如这个名称被指定到RFC调用的系统担当RFC server,那么系统将使用相同的
RFC连接,这个连接在RFC server接收第一次调用的时候建立。一旦一个RFC连接被建立,它就可以一直维持直到它被明确的关闭或者调用函数被关闭。
在一个call-back过程中,系统将一直试图使用已经存在的RFC 连接在创建一个新的连接之前。

语法如下:
CALL FUNCTION ... DESTINATION 'BACK'
在这个程序中,在系统B中的远程函数B,调用远程函数 A在系统A中。
System A System B
CALL FUNCTION 'B' ----------------> FUNCTION B.
^ DESTINATION 'B' .....
. .......
. FUNCTION A. <----------------------- CALL FUNCTION 'A'
. DESTINATION 'BACK'
. .... .....
. ENDFUNCTION. ----------returnA------> .....
.
-----------------------return B------ENDFUNCTION.
(A,B都是远程调用函数)

(5)Using Transactional Remote Function Calls
从版本3.0

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值