提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
有时候需要外部系统使用SAP的数据或功能时,就需要创建一个RFC函数,被外部调用
一、RFC函数是什么?
RFC 代表远程函数调用,是 SAP 开发的一项技术,可以实现不同 SAP 系统之间的通信。
二、创建RFC
1.事务代码SE37,创建函数
选择remote-enabled module,代表这是一个远程调用函数
然后在根据 具体需求
improt介面输入参数
export介面输出参数
changing介面 输入输出参数
表格介面 输入输出内表
exceptions 异常
source code 书写代码
2.测试RFC
给定入参之后 点击执行,看看是否符合自己的预期
三、Java 外部调用 RFC
1.引入maven
<!-- SAP -->
<!-- sapjco3-->
<dependency>
<groupId>com.github.easonjim</groupId>
<artifactId>com.sap.conn.jco.sapjco3</artifactId>
<version>3.0.11</version>
<type>jar</type>
</dependency>
2.SAP连接工具类
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.ext.DestinationDataProvider;
import org.jeecg.modules.dahata.entity.SysSAP;
public class SapConnection {
private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
//创建SAP接口属性
private static void createDataFile(String name, String suffix, Properties properties) {
File cfg = new File(name + "." + suffix);
if(cfg.exists()) {
cfg.deleteOnExit();
}
try {
FileOutputStream fos = new FileOutputStream(cfg,false);
properties.store(fos, "for test only!");
fos.close();
} catch (Exception e) {
throw new RuntimeException("无法创建目标文件" + cfg.getName());
}
}
//初始化连接
private static void initProperties(SysSAP sap) {
Properties connectProperties = new Properties();
// SAP服务器
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, sap.getIp());
// SAP系统编号
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, sap.getSysnr());
// SAP集团
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, sap.getClient());
// SAP用户名
connectProperties.setProperty(DestinationDataProvider.JCO_USER, sap.getUsername());
// SAP密码
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, sap.getPassword());
// SAP登录语言
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, sap.getLanguage());
// 空闲连接数
//connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "0");
// 最大连接线程
//connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");
// SAP ROUTER
//connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, sap.getRoute());
// 最大等待时间
//connectProperties.setProperty(DestinationDataProvider.JCO_MAX_GET_TIME, "8000");
// 连接池保持连接时间
//connectProperties.setProperty(DestinationDataProvider.JCO_EXPIRATION_TIME, "8000");
createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
}
//获取SAP连接
public static JCoDestination connect(SysSAP sap){
JCoDestination destination = null;
initProperties(sap);
try {
destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
destination.ping();
System.out.println("已成功建立sap的连接");
} catch (JCoException e) {
System.out.println("Connect SAP fault, error msg: " + e.toString());
}
return destination;
}
}
3.调用RFC函数
/**
* 报工接口并 检验批自动判定
* @throws JCoException
*/
@Test
public void mesTest1() throws JCoException {
//获取SAP的连接
SysSAP sapConfig = sysSapService.getByIsActive();
if(sapConfig != null) {
// 连接sap
JCoDestination sapConnection = SapConnection.connect(sapConfig);
// 获取rfc函数
JCoFunction rfcFunction = sapConnection.getRepository().getFunction("ZRFC_MES_COMMIT_AUFNR_AND_QM");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
// 导入参数
JCoParameterList importParameterList = rfcFunction.getImportParameterList();
importParameterList.setValue("AUFNR","*******");
importParameterList.setValue("VORNR","****");
importParameterList.setValue("LMNGA",10);
importParameterList.setValue("RMNGA",0);
importParameterList.setValue("XMNGA",0);
importParameterList.setValue("BUDAT",simpleDateFormat.format(new Date()));
JCoContext.begin(sapConnection);
rfcFunction.execute(sapConnection);
JCoContext.end(sapConnection);
//传出数据
JCoParameterList exportParameterList = rfcFunction.getExportParameterList();
JCoStructure aReturn2 = exportParameterList.getStructure("RETURN2");
JCoStructure aReturn1 = exportParameterList.getStructure("RETURN1");
System.out.println(aReturn2.getString("TYPE"));
System.out.println(aReturn2.getString("MESSAGE"));
System.out.println(aReturn1.getString("TYPE"));
System.out.println(aReturn1.getString("MESSAGE"));
}
}
总结
简单记录一下,java 调用 RFC函数,帮助自己记忆一下。