RFC是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议。简单地说,RFC过程就是系统调用当前系统外的程序模块!
RFC 是英文缩写,全称:Remote Function Call ,远程功能调用 !
配置:
1、依赖包:把一下两个依赖包放到lib文件夹下,相应的添加到路径中去。
2. 配置文件:用来配置 sap 地址等信息
文件里的内容如下:
3.复制工具类,这两个非常重要,有这两个就可以直接在代码里面调用SAP了
以上都配置好之后,基本就可以在代码中使用了! 接下来看看如何调用RFC , 两种情况:
1. 简单的RFC调用 ,这种情况参数比较简单,入参传入几个,出参是一个表,只要根据表结构就可以取值 :
JCoFunction function = RfcManager.getFunction("
ZRFC_ISR_GET_CCAPP
");
//RFC 名称
// 设置import 参数
JCoParameterList importParam = function.getImportParameterList();
//获得入参
//以下这些是调用该RFC所需要的参数
importParam.setValue("I_ZAREA","ALL"); //区域 ALL 代表全部的公司
importParam.setValue("I_ZTMON",""); //月份
//importParam.setValue("I_ZWEEKS","");//周数
importParam.setValue("I_DATUM","");//日期
// 执行RFC
RfcManager.execute(function);
// 获取RFC返回的字段值
JCoParameterList exportParam = function.getExportParameterList();
JCoParameterList exportTable= function.getTableParameterList();
JCoTable getTable1 = exportTable.getTable("
ET_ZDIELG
");
// 这是调用后 RFC 返回的表名
boolean loopFlag1 = !getTable1.isEmpty();
//判断 这张表中有木有数据
while(loopFlag1){ //循环获取数据
getAreaNum = getTable1.getString("ZAREA"); //根据表字段来获取值
getAreaName = getTable1.getString("ZQYMS");
//areaSize = getTable1.getString("ZCCMJ");
//areaPeoNum = getTable1.getString("ZCCRY");
HashMap<String,String> hm= new HashMap<String,String>();
hm.put("areanum", getAreaNum);
hm.put("areaname", getAreaName);
list.add(hm);
loopFlag1 = getTable1.nextRow(); // 移动到下一行
}
就是这么简单粗暴,入参的值设置一下就好了,返回一张表,根据字段取数就好了! 接下来说一下难的 !
2. 参数比较复杂:
JCoFunction function = RfcManager.getFunction("ZRFC_HR_READ_TABLE"); //人力资源报表
// 设置import 参数
JCoParameterList importParam = function.getImportParameterList();
importParam.setValue("QUERY_TABLE","ZTHR_R004"); //区域 ALL 代表全部的公司
importParam.setValue("ROWSKIPS","0"); //
importParam.setValue("ROWCOUNT","0"); //
importParam.setValue("USERNAME","00002359"); //
importParam.setValue("ORDER_BY",""); //
//以上和第一种情况一样,只是普通的设置入参
// importParam.setValue("SELECTION","BUKRS 3100"); //
JCoParameterList inTableParam = function.getTableParameterList();
// 这里又需要数据一张表作为参数
//以下是入参的表
JCoTable tableInD = inTableParam.getTable("DATA");
JCoTable tableInF = inTableParam.getTable("FIELDS");
JCoTable tableInO = inTableParam.getTable("OPTIONS");
JCoTable tableInS = inTableParam.getTable("SELECTION");
// JCoTable tableInop = inTableParam.getTable("SELECTION");//得到SAP函数中的条件参数
tableInS.appendRow();
//添加一行,要给这个表设置参数的时候,需要先添加一行,然后才设置参数,而且参数如下
tableInS.setValue("FIELDNAME","BUKRS");
//前面是 这个表的字段名,后面是值
tableInS.setValue("OPTION","EQ");
tableInS.setValue("ANDOR","AND");
tableInS.setValue("LOW",burkNum);
if(!areaNum.equals("") || areaNum != null){
//如果有两个参数,还要再添加一行,和上面一样
log.info("有两个参数");
tableInS.appendRow();//添加一行
tableInS.setValue("FIELDNAME","SOBJID");
tableInS.setValue("OPTION","EQ");
tableInS.setValue("ANDOR","AND");
tableInS.setValue("LOW",areaNum);
}
// 执行RFC
RfcManager.execute(function);
// 获取RFC返回的字段值
JCoParameterList exportParam = function.getExportParameterList();
JCoParameterList exportTable= function.getTableParameterList();
//获取返回的表,然而不能像上面一样根据表结构取值,因为表结构和值他又是分开放的,所以十分奇葩 ,
JCoTable getTable1 = exportTable.getTable("DATA");
boolean loopFlag1 = !getTable1.isEmpty();
while(loopFlag1){ //
HashMap<String,String> dataMap = new HashMap<String,String>(); //新数据里面的 Map
String WA=getTable1.getString("WA");
//返回的只有一个字段 ,所有的值都放在这个里面,所以要去截取
dataMap.put("店铺类型",WA.substring(248, 258).trim());//店铺类型
用截取的办法,获取对应字段的值
dataMap.put("核定编制",WA.substring(258, 266).trim());//核定编制
newlist.add(dataMap);
loopFlag1 = getTable1.nextRow();
//移动到下一行
}
以上就是两种调用SAP-RFC的方法,第二个方法就是多了输入参数的表。