JAVA与SAP-ERP的通信策略
现在的java应用系统在公司运行时,常常需要与公司的SAP ERP系统建立通信,采集SAP ERP系统中的基本生产主数据信息。
目前主流的交互方式是是用JCO的方式来实现连接。
JCO是服务于SAP系统和Java系统的RFC中间件,是用Java实现的API,以Jar包的方式发布。应用灵活。实现起来非常简单。
RFC(远程函数调用 Remote Function Call)是一个 SAP 的接口协议。
我们从SAP ERP中采集数据,可以把SAP ERP看成是一个数据库。连接到SAP ERP系统的过程主要是
导入jar包,动态链接库文件,定义连接,建立连接对象,打开连接,调用功能模块,关闭连接。
准备:
1 一个sapjco.jar的jar包
2 两个动态链接库文件librfc32.dll,sapjcorfc.dll
以上的文件都可以在网上免费下载到。
3 确认好你要连接的SAP ERP系统的信息。
SAP ERP系统的参数有
client=800 客户端口号
user=liweiguo 用户名
passwd=init0330 密码
lang= 语言
ashost=192.168.8.8 sap-erp服务器ip
sysnr=20 sap-erp系统实例标识号 相当于oracle 实例的端口号 1521,标识唯一的一个SAP ERP实例
SAP-EAP系统中每一个应用实例都有一个不同的系统实例标识号,相当于oracle的一个SID。
每一个实例可以对应多个不同的客户端口号,不同的客户端口号,控制权限不同。
每一个客户端口号对应多个不同的用户,同客户端口不同的用户,控制权限也不同。
实现:
针对32位 xp系统而言
1 首先把 librfc32.dll sapjcorfc.dll 放在服务器的系统的C:\WINDOWS\system32文件夹下。
2 建立一个java 工程 引入sapjco.jar到工程中。
3 编写连接类
public class SAPConnectionManager {
private JCO.Client mConnection;
private JCO.Repository mRepository;
/**
* FuncName: getConnect
* Description: 创建到SAP函数的连接
* Author: liwg
*/
public void getConnect() throws Exception {
try {
InputStream inputStream =
this.getClass().getResourceAsStream("SAP.properties");
Properties p = new Properties();
p.load(inputStream);
inputStream.close();
mConnection =
JCO.createClient(p.getProperty("client"),
p.getProperty("user"),
p.getProperty("passwd"),
p.getProperty("lang"),
p.getProperty("ashost"),
p.getProperty("sysnr"));
System.out.println("创建针对SAP的连接");
//打开对sap的连接
mConnection.connect();
System.out.println("创建针对SAP的连接成功");
}
catch (Exception e) {
System.out.println("创建连接信息失败");
//有异常就停止程序
System.exit(-1);
}
}
/**
* FuncName: getConnect
* Description: 关闭到SAP函数的连接
* Author: liwg
*/
public void disConnect() throws Exception {
try{
mConnection.disconnect();
}catch (Exception e){
System.out.println("关闭到SAP端的连接失败");
e.printStackTrace();
}
}
/**
* FuncName: createFunction
* Description: 创建函数,从SAP过数据的必须准备
* Author: liwg
*/
private JCO.Function createFunction(String name){
JCO.Function fc = null;
try {
IFunctionTemplate ft = mRepository.getFunctionTemplate(name.toUpperCase());
fc = ft.getFunction();
}
catch (Exception e) {
System.out.println("创建函数内部函数中出错");
e.printStackTrace();
}
return fc;
}
/**
* FuncName: getDataFromSAP
* Description: 根据SAP端函数,获取函数返回的数据结果集
* SAP端建立的RFC类型的函数为Z_RFC_TRANS_MYMAIN_DATA
* 函数封装数据返回的Table类型的结果集为 MY_MAINDATE
* 一个RFC类型的函数可以返回多个Table类型的结果集对象
* MY_MAINDATE结果集中的 两个列 NAME AGE
* Author: liwg
*/
public void getDataFromSAP() throws Exception {
JCO.Table fromSapData = null;
try {
mRepository = new JCO.Repository("MySAPJco",mConnection);
JCO.Function func = null;
func = this.createFunction("Z_RFC_TRANS_MYMAIN_DATA");
try {
mConnection.execute(func);
} catch(Exception e) {
System.out.println("执行函数出错");
e.printStackTrace();
}
fromSapData =
func.getTableParameterList().getTable("MY_MAINDATE");
//打印结果集
for ( int i = 0; i < fromSapData.getNumRows(); i++ ) {
fromSapData.setRow(i);
if(i%10==0){
System.out.println(fromSapData.getString("NAME"));
System.out.println(fromSapData.getString("AGE"));
}
}
} catch(Exception e) {
System.out.println("对SAP端函数执行出错");
}finally{
System.out.println("存取执行完成");
}
}
}
4 编写执行主类
public class DataController {
public static void main(String args[]){
try {
//先进行jco的SAP连接
SAPConnectionManager sc=new SAPConnectionManager();
sc.getConnect();
//调用SAP系统中的方法
sc.getDataFromSAP();
//关闭连接
sc.disConnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
现在的java应用系统在公司运行时,常常需要与公司的SAP ERP系统建立通信,采集SAP ERP系统中的基本生产主数据信息。
目前主流的交互方式是是用JCO的方式来实现连接。
JCO是服务于SAP系统和Java系统的RFC中间件,是用Java实现的API,以Jar包的方式发布。应用灵活。实现起来非常简单。
RFC(远程函数调用 Remote Function Call)是一个 SAP 的接口协议。
我们从SAP ERP中采集数据,可以把SAP ERP看成是一个数据库。连接到SAP ERP系统的过程主要是
导入jar包,动态链接库文件,定义连接,建立连接对象,打开连接,调用功能模块,关闭连接。
准备:
1 一个sapjco.jar的jar包
2 两个动态链接库文件librfc32.dll,sapjcorfc.dll
以上的文件都可以在网上免费下载到。
3 确认好你要连接的SAP ERP系统的信息。
SAP ERP系统的参数有
client=800 客户端口号
user=liweiguo 用户名
passwd=init0330 密码
lang= 语言
ashost=192.168.8.8 sap-erp服务器ip
sysnr=20 sap-erp系统实例标识号 相当于oracle 实例的端口号 1521,标识唯一的一个SAP ERP实例
SAP-EAP系统中每一个应用实例都有一个不同的系统实例标识号,相当于oracle的一个SID。
每一个实例可以对应多个不同的客户端口号,不同的客户端口号,控制权限不同。
每一个客户端口号对应多个不同的用户,同客户端口不同的用户,控制权限也不同。
实现:
针对32位 xp系统而言
1 首先把 librfc32.dll sapjcorfc.dll 放在服务器的系统的C:\WINDOWS\system32文件夹下。
2 建立一个java 工程 引入sapjco.jar到工程中。
3 编写连接类
public class SAPConnectionManager {
private JCO.Client mConnection;
private JCO.Repository mRepository;
/**
* FuncName: getConnect
* Description: 创建到SAP函数的连接
* Author: liwg
*/
public void getConnect() throws Exception {
try {
InputStream inputStream =
this.getClass().getResourceAsStream("SAP.properties");
Properties p = new Properties();
p.load(inputStream);
inputStream.close();
mConnection =
JCO.createClient(p.getProperty("client"),
p.getProperty("user"),
p.getProperty("passwd"),
p.getProperty("lang"),
p.getProperty("ashost"),
p.getProperty("sysnr"));
System.out.println("创建针对SAP的连接");
//打开对sap的连接
mConnection.connect();
System.out.println("创建针对SAP的连接成功");
}
catch (Exception e) {
System.out.println("创建连接信息失败");
//有异常就停止程序
System.exit(-1);
}
}
/**
* FuncName: getConnect
* Description: 关闭到SAP函数的连接
* Author: liwg
*/
public void disConnect() throws Exception {
try{
mConnection.disconnect();
}catch (Exception e){
System.out.println("关闭到SAP端的连接失败");
e.printStackTrace();
}
}
/**
* FuncName: createFunction
* Description: 创建函数,从SAP过数据的必须准备
* Author: liwg
*/
private JCO.Function createFunction(String name){
JCO.Function fc = null;
try {
IFunctionTemplate ft = mRepository.getFunctionTemplate(name.toUpperCase());
fc = ft.getFunction();
}
catch (Exception e) {
System.out.println("创建函数内部函数中出错");
e.printStackTrace();
}
return fc;
}
/**
* FuncName: getDataFromSAP
* Description: 根据SAP端函数,获取函数返回的数据结果集
* SAP端建立的RFC类型的函数为Z_RFC_TRANS_MYMAIN_DATA
* 函数封装数据返回的Table类型的结果集为 MY_MAINDATE
* 一个RFC类型的函数可以返回多个Table类型的结果集对象
* MY_MAINDATE结果集中的 两个列 NAME AGE
* Author: liwg
*/
public void getDataFromSAP() throws Exception {
JCO.Table fromSapData = null;
try {
mRepository = new JCO.Repository("MySAPJco",mConnection);
JCO.Function func = null;
func = this.createFunction("Z_RFC_TRANS_MYMAIN_DATA");
try {
mConnection.execute(func);
} catch(Exception e) {
System.out.println("执行函数出错");
e.printStackTrace();
}
fromSapData =
func.getTableParameterList().getTable("MY_MAINDATE");
//打印结果集
for ( int i = 0; i < fromSapData.getNumRows(); i++ ) {
fromSapData.setRow(i);
if(i%10==0){
System.out.println(fromSapData.getString("NAME"));
System.out.println(fromSapData.getString("AGE"));
}
}
} catch(Exception e) {
System.out.println("对SAP端函数执行出错");
}finally{
System.out.println("存取执行完成");
}
}
}
4 编写执行主类
public class DataController {
public static void main(String args[]){
try {
//先进行jco的SAP连接
SAPConnectionManager sc=new SAPConnectionManager();
sc.getConnect();
//调用SAP系统中的方法
sc.getDataFromSAP();
//关闭连接
sc.disConnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}