JAVA外部调用SAP--RFC函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、RFC函数是什么?

二、创建RFC

1.事务代码SE37,创建函数

2.测试RFC

三、Java 外部调用 RFC

1.引入maven

2.SAP连接工具类

3.调用RFC函数

总结


前言

有时候需要外部系统使用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函数,帮助自己记忆一下。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值