SAP的RFC接口的发布与JAVA调用

17 篇文章 4 订阅

1、RFC介绍

SAP R/3的接口方式主要有RFC、IDOC、BAPI三种。
RFC分二种:1 正常的本地RFC。2 远程RFC(外部系统调用)。
RFC可以理解成一个函数,它有输入、输出,改变,排除 参数,表(既可以输入也输出)。

这里我们着重介绍一下RFC。

RFC(Remote Function Call,远程功能调用)是SAP系统之间以及SAP与外部系统之间程序通信的基本接口技术,诸多其他更高层的SAP接口和通信技术,如BAPI、ALE等,都是基于RFC实现的。在SAP中,可以提供给其他系统进行远程调用的程序模块是支持RFC的功能模块,即RFM(remote-enabled function module,支持远程调用的功能模块)。

RFC是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议。简单地说,RFC过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有一个必须是SAP ABAP系统。这种远程功能调用也可在同一系统内部进行(如本地SAP系统内的远程调用);但通常情况下,调用程序和被调用程序处于不同系统。

RFC参数的介绍:

Attributes(属性), Import(输入参数),Export(输出参数),Changing(更改参数),Tables(输入,输出内表),Exceptions(排除参数),Source code(编写代码)。

Attributes(属性):
Normal Function Module: 在SAP内部调用RFC
Remote-Enabled Module:远程函数调用,即使用外部系统(.NET,VB,JAVA....)调用SAP RFC。
Update Module:一般使用 Start immed(立刻执行).

Import(输入参数):
就是要传入来的条件参数,不能为内表。最常用。

Export(输出参数):
就是返回值,也不能为内表。最常用。

Changing(更改参数):
返回值,与export差不多,这个很少用。

Tables(输入,输出内表):
可以把多个内表的值传进来,同时也可以把多个内表返回。

Exceptions(排除参数):
不常用。

Source code(编写代码):
就是编写代码了,如果不写代码,那这个RFC就没有用处了。

2、创建函数组

这一步可以不需要,这里的目的主要是怕影响别的函数组。

进入SE37,点击菜单“Goto”-->“Function Groups”-->“Create Group”


输入函数组、描述然后保存、激活


3、创建Function

本博文Function主要实现两个自然数的加法

输入Function名称后,点击Create按钮


选择函数组,输入描述,保存


选择Remote-Enabled Module


设置输入参数


设置输出参数


代码如下


保存激活。

4、SAP内部测试

点击图中的运行按钮

输入参数之后,点击图中的执行按钮

测试结果如下:

5、JAVA调用

调用过程中所需要的包及配置文件,在“ java连接sap接口包sapjco3 ”中可以直接下载使用。
SAPConn.java即JAVA与sap连接代码 
package com.pcmall;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;

import org.apache.log4j.Logger;
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;

/**
 * 与SAP连接配置
 * @author jay
 */
public class SAPConn {
	private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
	static{
		Properties connectProperties = new Properties();
		connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxx.xxx.xxx.xxx");//服务器
		connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "xxx");        //系统编号
		connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx");       //SAP集团
		connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "xxx");  //SAP用户名
		connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxx");     //密码
		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){
			log.error("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;
	}
	private static Logger log = Logger.getLogger(SAPConn.class); // 初始化日志对象
}
调用接口代码如下
package com.pcmall;

import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoTable;

public class MultiFromSAP {
	public static void main(String[] args) {
		JCoFunction function = null;
		JCoDestination destination = SAPConn.connect();
		String sum="";//求和
		try {
			//调用Z_WS_TEST函数
			function = destination.getRepository().getFunction("Z_WS_TEST");
			JCoParameterList input = function.getImportParameterList();
			//NUM1
			input.setValue("NUM1", "10");
			//NUM2
			input.setValue("NUM2", "8");
			
			function.execute(destination);
			sum= function.getExportParameterList().getString("NUM");//调用接口返回值 

			System.out.println("求和为:" + sum);
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}
测试输出结果如下,说明SAP接口已经调通



  • 12
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
调用 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 接口而有所不同,需要根据实际情况进行调整和修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值