JAVA 使用JCO3调用SAP RFC函数

下载安装SAP JCO3依赖

官方下载
本站下载

解压后找到 sapjco3.jar引入JAVA项目中;sapjco3.dll放到系统目录下

实现DestinationDataProvider

此Provider用以提供连接SAP目标的属性

public class JCODestinationDataProvider implements DestinationDataProvider {
	// 目标连接属性
	Map<String, JCODestinationEntity> destMap = new HashMap<>();
	
	public JCODestinationDataProvider(Map<String, JCODestinationEntity> destMap) {
        this.destMap = destMap;
    }
    
    @Override
    public Properties getDestinationProperties(String destinationName) throws DataProviderException {
        JCODestinationEntity jcoDestinationEntity = destMap .get(destinationName);
        if (jcoDestinationEntity != null) {
            return toProperties(jcoDestinationEntity);
        }
        throw new DataProviderException(DataProviderException.Reason.INTERNAL_ERROR, "Destinantion is not avaliable: " + destinationName, null);
    }

    private Properties toProperties(JCODestinationEntity jcoDestinationEntity) {
        Properties connProps = new Properties();
        // 两种连接模式 消息服务器/应用服务器
        if (StringUtils.isNotBlank(jcoDestinationEntity.getMshost())) {
        	// 消息服务器地址
            connProps.setProperty(JCO_MSHOST, jcoDestinationEntity.getMshost());
            // 服务器组
            connProps.setProperty(JCO_GROUP, jcoDestinationEntity.getSgroup());
        } else {
        	// 应用服务器地址
            connProps.setProperty(JCO_ASHOST, jcoDestinationEntity.getAshost());

        }
        // R3名称
        connProps.setProperty(JCO_R3NAME, jcoDestinationEntity.getR3name());
        // 实例编号
        connProps.setProperty(JCO_SYSNR, jcoDestinationEntity.getSysnr());
        // 用户名
        connProps.setProperty(JCO_USER, jcoDestinationEntity.getSapUsername());
        // 密码
        connProps.setProperty(JCO_PASSWD, jcoDestinationEntity.getSapPassword());
        // 客户端
        connProps.setProperty(JCO_CLIENT, jcoDestinationEntity.getClient());
        // 语言
        connProps.setProperty(JCO_LANG, jcoDestinationEntity.getLang());
        // 最大活动连接数
        connProps.setProperty(JCO_PEAK_LIMIT, "10");
        // 最大空闲连接数
        connProps.setProperty(JCO_POOL_CAPACITY, "3");
        return connProps;
    }

    @Override
    public boolean supportsEvents() {
        return false;
    }

    @Override
    public void setDestinationDataEventListener(DestinationDataEventListener destinationDataEventListener) {
        throw new UnsupportedOperationException();
    }
}

注册DestinationDataProvider

// 注册
Environment.registerDestinationDataProvider(new JCODestinationDataProvider(
	destMap // 传入目标属性配置数据
));

调用RFC函数

// 获取JCO目标
JCoDestination jcoDestination = JCoDestinationManager.getDestination(destinationName);
// 获取RFC函数
JCoFunction jcoFunction = jcoDestination.getRepository().getFunction(functionName);
// 获取传入参数接口,具体赋值方法变化较多可以参考JCO包中提供的官方API文档
JCoParameterList pImlist= function.getImportParameterList();
JCoParameterList pTmlist= function.getTableParameterList();
JCoParameterList pCmlist= function.getChangingParameterList();
// 调用RFC函数
jcoFunction.execute(jcoDestination);
// 获取返回结果接口,具体取值方法变化较多可以参考JCO包中提供的官方API文档
JCoParameterList rEmlist= function.getExportParameterList();
JCoParameterList rTmlist= function.getTableParameterList();
JCoParameterList rCmlist= function.getChangingParameterList();
原文地址:https://www.cnblogs.com/luguojun/p/14294664.html