基于RFC通讯协议的SAP调用对于普通传参和表传参(JAVA)

介绍

网上关于java调用sap接口的相关资料少得可怜,为了大家更方便,我把开发过程中使用到的sap调用方式以文字+代码介绍出来

  1. 基本使用,首先得把sap相关环境弄好,网上挺多的,我就不去做重复工了
    private static final Logger log = LoggerFactory.getLogger(SapApi.class);
    
    	private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
    	static{
    		Properties connectProperties = new Properties();
    		connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxxx");//测试服务器
    		connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "xx");        //系统编号
    		connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx");       //客户端编号
    		connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "xxx");  		//SAP用户名
    		connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxxxxx");     //密码
    		connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "zh");        //登录语言
    		connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");  //最大连接数  
    		connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");     //最大连接线程
    		
    		createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
    	}
    	
    	/**
    	 * 创建SAP接口属性文件。
    	 * @param name	ABAP管道名称
    	 * @param suffix	属性文件后缀
    	 * @param properties	属性文件内容
    	 */
    	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 tests only !");
    			fos.close();
    		}catch (Exception e){
    			System.out.println("Create Data file fault, error msg: " + e.toString());
    			throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
    		}
    	}
    	
    	/**
    	 * 获取SAP连接
    	 * @return	SAP连接对象
    	 */
    	public static JCoDestination connect(){
    		JCoDestination destination =null;
    		try {
    			destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
    		} catch (JCoException e) {
    			log.error("Connect SAP fault, error msg: " + e.toString());
    		}
    		return destination;
    	}

     

  2. 开始调用接口(函数)相关api

        
        JCoFunction function = null;

        JCoDestination destination = SAPConn.connect();

        String type = "";//调用接口返回状态
        String message = "";//调用接口返回信息
        List<String> partNoList=new ArrayList<>();
        try {

            //调用Z_APS_STOCK_DEPTH函数(接口名)
            function = destination.getRepository().getFunction("接口名");

            JCoParameterList input = function.getImportParameterList();

            for (String partNo: partNoList) {

                //Z_APS_STOCK_DEPTH
                input.setValue("NAME", "狗蛋儿");//普通请求参数

                JCoTable it_matnr = function.getTableParameterList().getTable("T_USER");//以表作为请求参数
                it_matnr.appendRow();
                it_matnr.setValue("age",18);//设置表值

                function.execute(destination);//开始执行请求接口

                type = function.getExportParameterList().getString("ES_TYPE");//调用接口返回状态
                message = function.getExportParameterList().getString("ES_MESSAGE");//调用接口返回信息
                System.out.println("调用返回状态--->" + type + ";调用返回信息--->" + message);
                //获取数据(T_OUTPUT为返回结果表=http接口的json返回值)
                JCoTable output = function.getTableParameterList().getTable("T_OUTPUT");
                
                int numRows = output.getNumRows();//行数为0可以直接return

                for (int i = 0; i < numRows; i++) {
                    output.setRow(i);//设置索引 获取返回表里的数据
                    //Z_APS_STOCK_DEPTH
                    String NAME= output.getString("NAME");//解析表字段值
                    String AGE= output.getString("AGE");
                    System.out.println(NAME);
                    System.out.println(AGE);
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

3.调用sap接口通过数组传参暂未测试,有这样使用过的可以留个言,还是很简单的,网上看了很多然并卵的文章,所以自己直接来点干货。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
调用 SAPRFC 接口,需要使用 SAP 提供的 Java Connector(SAP JCo)库。在使用 SAP JCo 调用 RFC 接口时,需要在 SAP JCo 的配置文件中设置系统 ID(System ID),以便正确地连接到 SAP 系统。 要配置 SAP JCo 的系统 ID,需要进行以下步骤: 1. 打开 SAP JCo 的配置文件 sapjco3.properties,该文件通常位于应用程序的 classpath 下。 2. 在 sapjco3.properties 文件中添加以下配置项: ``` jco.client.sysnr=<系统编号> jco.client.client=<客户端> jco.client.user=<用户名> jco.client.passwd=<密码> jco.client.lang=<语言> jco.client.ashost=<应用服务器主机名> jco.client.saprouter=<SAP 路由器> ``` 其中,<系统编号> 是 SAP 系统的编号,<客户端> 是 SAP 客户端的编号,<用户名> 和 <密码> 是 SAP 用户的登录信息,<语言> 是登录时使用的语言代码,<应用服务器主机名> 是 SAP 应用服务器的主机名,<SAP 路由器> 是可选的 SAP 路由器配置。 3. 在 Java 代码中使用 SAP JCo 的 API 调用 RFC 接口时,可以使用以下代码获取 SAP JCo 的配置信息: ``` JCoDestination destination = JCoDestinationManager.getDestination("<destination>"); ``` 其中,<destination> 是 SAP JCo 的目标名称,可以在 sapjco3.properties 文件中配置。 4. 使用 SAP JCo 的 API 调用 RFC 接口时,需要使用 SAP JCo 的函数模块名称和函数模块的输入参数,例如: ``` JCoFunction function = destination.getRepository().getFunction("<function_module>"); if (function == null) { throw new RuntimeException("<function_module> not found in SAP system."); } function.getImportParameterList().setValue("<parameter_name>", "<parameter_value>"); function.execute(destination); ``` 其中,<function_module> 是 SAP RFC 函数模块的名称,<parameter_name> 和 <parameter_value> 是函数模块的输入参数名称和值。 以上是 Java 调用 SAP RFC 接口时配置系统 ID 的基本步骤。具体的配置和调用方法可能会因不同的 SAP 系统和 RFC 接口而有所不同,需要根据实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值