cc 程序间通讯中如何利用RFC与sap通讯

SAP的RFC接口调用例子
SAP作为独立的系统,与其它系统进行交互的时候,主要是两种方式:1:底层数据库直接交互;2:通过SAP专门的RFC接口进行数据调用。SAP现在主要的数据库平台有两种关系型数据库,Oracle和DB2,第一种方式FineReport通过JDBC的方式直连SAP数据库来解决,详细请查看,但是使用这种方式,制作人员需要对SAP数据库了解比较深,并且数据库可以对其他软件开放。下面主要介绍第二种方式。
1.&设计思路
首先通过java类文件建立和SAP的连接,然后通过程序数据集接口,将RFC调出来的数据进行虚拟二维表封装,调用虚拟二维表,进行报表的制作。
2.&实现步骤
2.1&建立连接通过ConnectSAPServer类实现与SAP的连接,类文件的代码如下:package com.fr.
import java.io.F
import java.io.FileOutputS
import java.util.P
import com.sap.conn.jco.JCoD
import com.sap.conn.jco.JCoDestinationM
import com.sap.conn.jco.JCoE
import com.sap.conn.jco.ext.DestinationDataP
public class ConnectSAPServer {
static String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST,
"SAP服务器IP地址");
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "系统编号");
connectProperties
.setProperty(DestinationDataProvider.JCO_CLIENT, "客户端编号(SAP中的,和客户端没关系)");
connectProperties.setProperty(DestinationDataProvider.JCO_USER,
"用户名");
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD,
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH");
connectProperties.setProperty(
DestinationDataProvider.JCO_POOL_CAPACITY, "10");
connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,
createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
static void createDataFile(String name, String suffix, Properties properties) {
File cfg = new File(name + "." + suffix);
if (!cfg.exists()) {
FileOutputStream fos = new FileOutputStream(cfg, false);
properties.store(fos, "SAP连接配置文件");
fos.close();
} catch (Exception e) {
throw new RuntimeException(
"Unable to create the destination file "
+ cfg.getName(), e);
public static JCoDestination Connect() {
JCoDestination destination =
destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
} catch (JCoException e) {
e.getCause();
}2.2 程序数据集调用1)定义程序数据集数据库连接上之后,定义程序数据集,通过我们的程序数据源接口将数据转换成虚拟表,类文件具体代码如下:package com.fr.
import com.fr.base.FRC
import com.fr.base.P
import com.fr.data.AbstractTableD
import com.sap.conn.jco.JCoD
import com.sap.conn.jco.JCoE
import com.sap.conn.jco.JCoF
import com.sap.conn.jco.JCoT
public class ParamSAPDataTest extends AbstractTableData
private String[] columnNames =
private int columnNum = 3;
private String[][] rowD
private static JCoDestination jCoD
public ParamSAPDataTest()
this.parameters = new Parameter[] { new Parameter("LIFNR"),
new Parameter("NAME1") };
this.columnNames = new String[this.columnNum];
this.columnNames[0] = "供应商编码";
this.columnNames[1] = "供应商名称";
this.columnNames[2] = "供应商地址";
public int getColumnCount() {
return this.columnN
public String getColumnName(int columnIndex) {
return this.columnNames[columnIndex];
public int getRowCount() {
catch (JCoException e) {
FRContext.getLogger().info("失败");
return this.rowData.
public Object getValueAt(int rowIndex, int columnIndex) {
catch (JCoException e) {
FRContext.getLogger().info("失败");
if (columnIndex &= this.columnNum) {
return this.rowData[rowIndex][columnIndex];
public void init() throws JCoException {
if (this.rowData != null) {
jCoDestination = ConnectSAPServer.Connect();
}catch (Exception e) {
FRContext.getLogger().info("失败");
JCoFunction function = jCoDestination.getRepository().getFunction("Z_LFA3_QUERY");
if (function == null)
throw new RuntimeException(
"Function not found in SAP.");
function.getImportParameterList().setValue("LIFNR", "%"+this.parameters[0].getValue().toString().toUpperCase().trim()+"%");
function.getImportParameterList().setValue("NAME1", "%"+this.parameters[1].getValue().toString().toUpperCase().trim()+"%");
function.execute(jCoDestination);
JCoTable returnTable = function.getTableParameterList().getTable(
"ZLFA1S3");
rowData=new String[20][3];
if (returnTable.getNumRows() & 0) {
returnTable.firstRow();
for (int i = 0; i & 20; )
String[] objArray = new String[this.columnNum];
objArray[0] = returnTable.getString("LIFNR");
objArray[1] = returnTable.getString("NAME1");
objArray[2] = returnTable.getString("STRAS");
this.rowData[i]=objA
i++; returnTable
.nextRow();
FRContext.getLogger().info(
"Query SQL of ParamSAPDataTest: \n" + this.rowData.length +
" rows selected");
public void release() throws Exception {
super.release();
this.rowData =
}2)配置程序数据集详细配置步骤请查看:。
通过RFC接口这种方式避免了直连数据库的问题,而这些RFC参数和调用表结构网上或者SAP供应商都会提供,不过缺点在于需要写类文件来获取数据,报表多的时候比较麻烦,如果要达到一些图表联动等效果,需要在类里面写参数,修改起来不是很方便,需要技术人员进行报表制作,业务人员比较困难。
下载次数:0
如果您认为本文档还有待完善,请
文档内容仅供参考,如果你需要获取更多帮助,请咨询
关于技术问题,您还可以通过获取帮助,论坛上有非常多的大神,有些水平比帆软工程师还要高哦。
若您还有其他非技术类问题,可以联系帆软传说哥(qq:)
此页面有帮助吗?是否&>&关于如何使用rfc sdk的c++实例
关于如何使用rfc sdk的c++实例
上传大小:6.54MB
关于SAP的rfc c++ 调用建议大家不要使用rfcsdk,使用nwrfcsdk,实在是太过复杂,返回的参数是按行存储的字符串,要根据字段的长度分拆得到结果,nwrfc sdk是根据字段名来得到结果。
鉴于最近一直在百度贴吧私信我关于如何使用rfc sdk,我把我之前做的测试贴出来,但是首先说明的是,这个例子,可以成功登陆SAP,但是进入后调用rfc func一直报错,一直解决不了,鉴于前面所述的复杂原因,以及项目的紧急,我就改用nwrfcsdk.
另外附件中已含rfcsdk和nwrfcsdk我之前测试的例子。
综合评分:4
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有3条
用不了,没什么用
不知道怎么用,楼主给个教程~
请问你的是windows的vs还是别的变异环境啊?
qwerqwerwerwer
综合评分:
积分/C币:10
综合评分:
积分/C币:12
综合评分:
积分/C币:2
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
关于如何使用rfc sdk的c++实例
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
mikewolfli
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
关于如何使用rfc sdk的c++实例下次自动登录
现在的位置:
& 综合 & 正文
How to get SAP RFC-SDK for C/C++
You need your SAP Service Marketplace username and password.
Visit http://service.sap.com/ Under the "SAP Support Portal", there is a link titled "Software Download". Click on it. In the page that opens up, the left pane is a tree / hierarchical view. Follow this path: SAP Software Distribution Center --& Download --& Support Packages and Patches --& Entry by Application Group. Click on it. In the right pane, a few links will come up. Click on "Additional Components". In the right pane, a few more links are displayed. Choose "SAP RFC SDK UNICODE". (You always need the Unicode libraries, irrespective of whether your SAP Server is unicode or not). You can download either version 6.40 or 7.00 After choosing your platform, a list of files available for download will be displayed (usually just one, since you've narrowed it down to version number + platform). Add it to your download basket. A window will pop up confirming that it has been added to your basket. Close it for now. Go back to the page where the Additional components were displayed. (Step 5). A few links above "SAP RFC SDK UNICODE", you should see "SAPCAR". Click on it. Choose the latest version of SAPCAR available, and the one appropriate for your platform (32/64 bit, Windows/Linux/etc). After choosing your platform, a list of files available for download will be displayed (usually just one, since you've narrowed it down to version number + platform). Add it to your download basket. A window will pop up confirming that it has been added to your basket. In that window, there is a link that says "Download Basket". Click on it. Another page will come up with a list of all items in your basket, and a link which says "Get Download Manager". Click it. The Download Manager is a desktop application which you henceforth need to use to download stuff from the SAP Marketplace - the online interface (steps 1 to 11 above) is just a way to add things to your download basket. Once the download for the Download Manager completes, install it. Start it, you'll be prompted to enter your SAP Service Marketplace username/password. Once done, you should see a list of all files in your basket which you can download. Choose the ones you want, and download.
At this point, I'm assuming your download went smoothly, and you have 2 files downloaded - SAPCAR.exe, and &somenumber&.SAR. SAPCAR.exe is SAP's uncompressing/unarchiving tool. The .SAR file you downloaded is the RFC SDK Unicode library. To unarchive it, run this command: SAPCAR
&.SAR filename& You should now see folders named "include", "lib", "bin", etc. In the "bin" folder, there are 6 dlls present. Copy them to your System32 / SysWow64 folder as appropriate (depdending on whether you are installing the 32/64 bit Adapter Pack, you're on a 32/64 bit machine, you're using Native64/WOW64, etc). Then, read this post to verify whether the RFC SDK Unicode Libraries can be successfully loaded by a client application.
RFC SDK Unicode
RFC 14-.SAR
RFC 14-.SAR
RFC SDK NW
Linux:NWRFC 1-.SAR
WIN32:NWRFC 1-.SAR
【上篇】【下篇】与SAP集成的接口方式比较_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
与SAP集成的接口方式比较
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢当前位置: →
→ SAPRFC通信模式
SAPRFC通信模式
& 作者及来源: 小鱼儿游 - 博客园 &
&收藏到→_→:
摘要: SAP RFC通信模式
"SAPRFC通信模式"::
& & & 在网络技术中,数据通信可以大致划分为两种基本模式:同步通信和异步通信。
& & & 其本义是:异步通信时,通信双方时钟允许存在一定误差;同步通信时,双方时钟的允许误差较小。在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连接类型:
类型2: r/2连接
类型3: abap连接或r/3连接,指定主机名和通信服务
类型i:内部连接,与当前系统连接到同一abap系统中,预定义无法修改,与sm51中所显示的 名相同
类型l:逻辑目标,通常工作流系统指定过程中配置的rfc目标即为该类型的逻辑目标
类型x:指定安装了特殊的abap设备驱动程序的系统,必须制定abap设备驱动程序名
类型s:通过sna或appc启动的外部程序连接
类型m:通过cmc到abap系统的异步rfc连接
类型t:通过tcp/ip并使用rfc库或sap连接器的外部程此文来自: 马开东博客
转载请注明出处 网址:
序连接;分为启动(指定主机名、程序路径名)和注册(rfc服务器程序)两种连接模式。
类型g:定义外部系统到本地http连接
类型h: 定义abap系统到本地的http连接
远程调用rfm(通过rfm实现):
远程目标可以是文字或变量,其值为sap系统中一直的远程目标系统。
若远程系统是当前系统中的sap ,也可以直接指定 名称,则sm59中的i类型目标
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。
& & 在进行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 screen、submit、commit work、wait、rfc调用及w或i类型的消息等,则不能成功返回结果。
参考程序源代码:
data:&user_addr&type&user_addr,
&&&&&&system_id&type&sysysid,
&&&&&&user_para&like&table&of&usr05&with&header&line,
&&&&&&msg_text(128).
call&function&'zrfc_user_read'
&&destination&'gs4clnt100'
&&starting&new&task&'b1'
&&performing&return_user&on&end&of&task
&&exporting
&&&&user_name&&&&&&&&&&&&&=&'jiah'
&&exceptions
&&&&communication_failure&=&1&&message&msg_text
&&&&system_failure&&&&&&&&=&2&&message&msg_text.
if&sy-subrc&=&0.
&&write:&'wait&for&reply.'.
&&write&msg_text.
if&user_para&is&initial.
&&write:/&'destination&not&ready&yet.'.
&&write:/&'destination&is&reached.'.
at&user-command.
*&return&from&form&routine&return_user&via&set&user-command
&&if&sy-ucomm&=&'okcd'.
&&&&if&msg_text&=&space.
&&&&&&write:&/&'destination&system',&system_id.
&&&&&&loop&at&user_para.
&&&&&&&&write:/&user_para-bname,
&&&&&&&&&&&&&&&&user_para-parid,
&&&&&&&&&&&&&&&&user_para-parva.
&&&&&&endloop.
&&&&&&write&msg_text.
&&&&endif.
*&---------------------------------------------------------------------*
*&&form&&return_user
*&---------------------------------------------------------------------*
form&return_user&using&taskname.
&&receive&results&from&function&'zrfc_user_read'
&&&&importing
&&&&&&user_addr&&&&&&&=&user_addr
&&&&&&system_id&&&&&&&=&system_id
&&&&tables
&&&&&&user_para&&&&&&&=&user_para
&&&&exceptions
&&&&&&communication_failure&&=&1&message&msg_text
&&&&&&system_failure&&&&&&&&&=&2&message&msg_text.
&&set&user-command&'okcd'.
endform.&&&&&&&&&&&&&&&&&&&&"return_info
receive results from function从rfm中接收结果.
& & &程序在运行时的行为如下:主程序运行期间,rfm在其他工作过程中运行,因此系统变量sy-subrc和程序变量不会被更新,主程序将文本发送至输出列表的缓冲区中。
语句wait untill用于异步rfc调用中等待结果的返回,该项必须与performing附加项配合使用,否则没有意义:
wait until log_exp [up to sec seconds].
当满足log_exp条件后,程序继续执行,否则程序将挂起,并等待异步rfc调用的返回结果,当功能模块调用结束时,系统将自动执行回调子程序,在其中接收返回结果并设定相关的逻辑条件变量值,子程序结束后将回到wait untill语句,在多个异步rfc调用存在的情况下,等待过程将反复重复,直到等待条件被满足,或不再有其他开发的异步rfc调用
wait untill not flag1 is initial and not flag2 is initial.
&保持远程上下文:
在receive语句中,通过keeping task附加项可以使已经加载的远程上下文保持至调用程序结束,直到远程连接终止为止。
并行rfc方式的rfm调用
实际是异步rfc调用的应用之一。
异步rfc调用实现并行处理:
& & & 异步rfc调用适用于多个sap abap系统间的并行处理(不支持sap系统和其他系统间的并行过程)
& & & 在同一sap系统内部使用异步rfc调用,将部分处理负载转移到其他的 ,方法时将rfc目标指定为其他
& & & 若不显示指定异步rfc调用目标,在同一 内,可以通过本地异步rfc调用实现多个工作过程的并行处理
& & & t-code:&sm59&可将sap系统中的 分配成不同的rfc分组,异步调用时,通过destination子句中的in group附加项指定一个已定义的rfc分组。若不显示指定rfc组,还可以使 用关键字default,系统从全部可用的 中选择一个处理。
参考源代码:
types:&begin&of&task_type,
&&&&&&&&&&&&&name&type&string,
&&&&&&&&&&&&&dest&type&string,
&&&&&&&&&&&end&of&task_type.
data:&snd_jobs&&type&i,
&&&&&&rcv_jobs&&type&i,
&&&&&&exc_flag&&type&i,
&&&&&&info&&&&&&type&rfcsi,
&&&&&&mess&&&&&&type&c&length&80,
&&&&&&indx&&&&&&type&c&length&4,
&&&&&&name&&&&&&type&c&length&8,
&&&&&&task_list&type&standard&table&of&task_type,
&&&&&&task_wa&&&type&task_type.
do&10&times.
&&indx&=&sy-index.
&&concatenate&'task'&indx&into&name.
&&call&function&'rfc_system_info'
&&&&starting&new&task&name
&&&&destination&in&group&default
&&&&performing&rfc_info&on&end&of&task
&&&&exceptions
&&&&&&system_failure&&&&&&&&=&1&&message&mess
&&&&&&communication_failure&=&2&&message&mess
&&&&&&resource_failure&&&&&&=&3.
&&case&sy-subrc.
&&&&when&0.
&&&&&&snd_jobs&=&snd_jobs&+&1.
&&&&when&1&or&2.
&&&&&&message&mess&type&'i'.
&&&&when&3.
&&&&&&if&snd_jobs&&=&1&and
&&&&&&&&&exc_flag&=&0.
&&&&&&&&exc_flag&=&1.
&&&&&&&&wait&until&rcv_jobs&&=&snd_jobs
&&&&&&&&&&&&&up&to&5&seconds.
&&&&&&endif.
&&&&&&if&sy-subrc&=&0.
&&&&&&&&exc_flag&=&0.
&&&&&&else.
&&&&&&&&message&'resource&failure'&type&'i'.
&&&&&&endif.
&&&&when&others.
&&&&&&message&'other&error'&type&'i'.
&&endcase.
wait&until&rcv_jobs&&=&snd_jobs.
loop&at&task_list&into&task_wa.
&&write:&/&task_wa-name,&task_wa-dest.
*&---------------------------------------------------------------------*
*&&&&&&&form&&rfc_info
*&---------------------------------------------------------------------*
form&rfc_info&using&name.
&&task_wa-name&=&name.
&&rcv_jobs&=&rcv_jobs&+&1.
&&receive&results&from&function&'rfc_system_info'
&&&&importing
&&&&&&rfcsi_export&=&info
&&&&exceptions
&&&&&&system_failure&&&&&&&&=&1&message&mess
&&&&&&communication_failure&=&2&message&mess.
&&if&sy-subrc&=&0.
&&&&task_wa-dest&=&info-rfcdest.
&&&&task_wa-dest&=&mess.
&&append&task_wa&to&task_list.
endform.&&&&&&&&&&&&&&&&&&&&"rfc_info
wait untill log_exp up to n seconds.程序中断时间最长是n秒
事务性rfc方式的rfm调用:
& & & 同步、异步rfc过程中,每一个rfc调用在远程系统中构成一个独立的luw
& & & 事务性rfc调用,可以将多个逻辑上相关的远程调用绑定至同一个luw上,在该luw内,按顺序调用,要么执行所有 操作,要么完全回滚来取消全部 更新操作,保证rfc调用过程的完整性和
事务性rfc调用处理保证在程序到达commit work语句时执行所有计划的更新,并保证事务性rfc调用仅运行一次
该调用具有安全、可靠的特点
call function rfm_name &&
in background task &
&&[destination dest] &&
&&[exporting&&&p1 = a1 ... pn = an ... ] &
&&[tables&&&&&&t1 = itab1 ... tn = itabn ... ] &&
&&[as separate unit]. &
& call function rfm_name &&
&&in background unit oref &
&&[exporting&&&p1 = a1 ... pn = an ... ] &
&&[tables&&&&&&t1 = itab1 ... tn = itabn ... ].&&
& & &其中oref必须引用一个接口if_bgrfc_unit实现类的对象
& & &在相邻两个commit work之间出现的所有相同目标的异步调用都属于同一个luw
& & &事务性rfc不需要等待每个单独的更新过程完成,调用程序就可以立即继续进行,知道事务结束
& & &若调用发送时,远程系统不可用,调用将设为后台作业运行,不能从调用模块接收返回结果,不允许调用者进行与远程系统的交互性对话及测试
& & &调用参数
& & & 不能直接或通过receive results from
function语句接收rfm的返回结果,fm的接口不应指定任何export类型参数,在call function语句中的importing参数将导致编译错误
& & & 事务性运行的功能模块中不适合进行回调(调用远程目标back)
& & & 事务性rfc调用示例
function 'travel_book_remote'
&& in background task &
&& destination
&& exporting &
&& & flight&&&&&=
&customerid
= customer. &
&commit&&work. &
& & & 直到commit work 语句才开始于远程系统进行联系
& & & travel_book_remote是一个适合进行事务性rfc调用的rfm,只进行远程系统中的 更新,不需要返回任何数据
& & & 每一个事务性rfc调用均通过一个独特的事物id(transactional id,tid)
& & & tid存在于 表arfcsstate和arfcsdata,arfcsstate记录luw执行状态,arfcsdata包含事务性rfc调用的输入数据
& & & 作业执行过程中,从事务性rfc表中读取相关数据,与相应的事务性rfc进行通信,远程luw成功执行,则相应的条目在表中删除,因此,若luw运行成功,则无法重新执行因而保证了仅仅执行一次
  若commit work同时触发了本地更新操作,则事务性rfc调用在本地更新成功完成之后才开始运行
&设定作业开始时间
  如果希望在特定时间启动luw,可以通过功能模块start_of_backgrouptask设置作业开始的时间,必须在luw内部调用该功能模块,必须在第一个call&in backgroundtask语句之后和commit work语句之前调用该功能模块
  对于某个调用需要创建独立的事务,不参与其他目标的事务性rfc调用作何至一个luw,可以通过as separate untial附加项实现
  各个luw处理都是独立进行的,执行次序无法被保证
&出错处理机制
  发生错误,事务性rfc调用将启动重试机制或者回滚
  通过commit work执行远程调用时,不能建立到目标系统的连接,将在arfcsstate表中记录当前状态,系统通过 rsarfcse根据当前的tid重新计划后台作业,准备进行下一次调用。
  默认时间间隔15分钟,尝试至30次为止
  tools-administraion-administraion-network-rfcdestinations-destination-trfc
options进行尝试次数、时间间隔设定
  若经过最大尝试次数,系统仍然无法连接,系统将停止调用 rsarfcse,将arfcsdata状态更新为cpicerr,默认8天,将表中的响应条目删除,sm59可以手动启动该条目
  执行出错,a类型的消息或者raise语句抛出异常,则arfcsstate表将记录出错状态,整个rfc中的操作将取消, sm58查看该错误,修改错误后,通过sm58重新启动出错的rfm
  在rfm中,功能模块 art_of_backgroundtask启动重试功能
&检查事务性rfc调用状态:
  每个luw都用过唯一的tid进行标识,两种方法检查tid状态:
  abap程序:在call&
in background task之后和commit work之前调用fm&id_of_backgroundtask&,获得tid后,用fm&status_of_backgroundtask&确定事务性rfc的状态
function 'travel_book_remote'
background task &
&& destination
&& exporting &
&& & flight&&&&&=
&& & customerid = customer. &
function 'id_of_backgroundtask'
&& importing
task-id = tid. &
function 'status_of_backgroundtask'
&& exporting &
&& & tid&&&&&&= tid &
&& importing &
&& & errortab = errtab &
&& exceptions &
&& & communictation = 01 "connection
not available: will&try&again later &
&& & recorded&&&&&&&= 02 "arfc is
scheduled &
&& & rollback&&&&&&&= 03 "rollback triggered in
target system &
  联机确认:通过sm58显示并维护事务性rfc的luw状态
&  队列rfc方式的rfm调用
  确保事务性rfc调用中的luw都按照其创建次序执行,需要使用队列rfc创建luw序列。
  队列rfc是事务性rfc的增强版本,用于sap-sap及sap-非sap系统间的连接
  多个fm发送至目标系统中的三种可能情况(实际的连接过程仍然通过事务性rfc来实现,可以增加入站、出站队列),普通事务性rfc、含出站队列的队列rfc、含出入站队列的队列rfc,出站队列在队列rfc中是必须的
  出站调度器用于控制其他逻辑目标系统中的luw执行
  入站调度器控制本地系统中的队列rfc执行(目标none或in background task实现为指定目标rfc)
  事务smqs可以配置出战的队列rfc序列
  事务smqr可以配置入站的队列rfc序列
  需要在普通事务性rfc调用之前使用功能模块trfc_set_queue_name来指明后续的事务性rfc所要插入的出战队列
  通过fm
trfc_set_qin_properties来完成,入站队列
  本地rfm调用和回调
  通过destnation附加项的两个特殊目标none和back,可以进行rfm本地远程调用和回调
  调用本地系统中的远程功能模块,即调用当前系统内部的rfm
& & & call function语句格式决定以远程调用、非远程调用方式运行
& & &远程调用:
function rfm_name &
&& destination
function &rfc_customer_get& &
&& destination
&& exporting &
= custno &
&& tables &
&customer_t
&& exceptions &
&no_record_found
  本地调用:call function 语句没有destination、starting new task、in background task\unit任意出现,不在单独的内存滚动区中运行,若当调用没有指定某些必选exporting参数时,会引起系统异常终止
function &rfc_customer_get& &
&exporting &
&& &kunnr = custno &
&& &customer_t = itab &
&exceptions &
&& &no_record_found =
function rfm_name &
&destination
远程回调:
  在服务器执行远程功能时,该服务器可以调用客户中随调用程序载入内存的功能模块,称为回调
  通过特殊目标back可以触发回调机制
call function rfm_name
desti搜索此文相关文章: RFC通信模式此文来自: 马开东博客
网址: 站长QQ
SAPRFC通信模式_博客园相关文章
博客园_总排行榜
博客园_最新
博客园_月排行榜
博客园_周排行榜
博客园_日排行榜

我要回帖

更多关于 sap 通讯录 王华 的文章

 

随机推荐