SAP的ERP平台很强大,这是毋庸置疑的,它被运用于个个行业领域,也正因如此,所以公司上线SAP后,总需要花费很多时间去培养用户,有时候,在SAP上,用户的操作需求很简单,但在SAP平台上,却不得不进行许多复杂的操作。
=======================================================================================
在我们公司,许多Sales和“老大们”都是电脑白痴,SAP虽然很强大,但是在他们自己用来,却觉得很复杂繁琐,他们想查看一下报表、操作一些功能,总要记住各种T-CODE,随着开发人员开发的T-CODE越来越多,用户要记住的也就越多。SAP虽然很强大,但是也有不少不方便的地方,因为它不是针对某个公司去设计的,所以它也有很多不完善和不能满足公司需求的地方。
随着公司的用户越来越多,公司SAP购买的帐号分配和权限分配也不断被需求,很多时候几十个用户,虽然他们有很多时候对SAP的操作需求是一样的,但是公司却不得不为他们购买和分配SAP帐号...基于公司内部的需求,我们希望能把SAP上一些简单的功能模块抽取出来,架设一个Web平台,该平台旨在:打造一个更加符合本公司需求、提高用户效率、便捷、主流的接口平台。
经过比较和分析,我们决定使用JCO技术,我作为一个Java出身的ABAP开发员,从来没有真正去了解过JCO技术,上网才发现,JCO技术早已经更新到了3.0版本了,可是在中文网上(百度、360搜索)的许多资料却都是关于JCO 2.0技术的,关于JCO3.0的资料寥寥无几,谷歌上虽然也有不少,可是在开发过程遇到的许多问题,在谷歌上回答的人也不多。但是为了与时俱进,我还是花了一段时间认真的研究了JCO 3.0的API,和查找了不少的资料。终于给我研究出来了,经过不断的开发和对JCO 3.0的不断渗透了解,现在已经能很好的驾驭它。
废话少说,就和大家一起分享一下啊JCO 3.0的实现技术吧。
<!--[if !supportLists]-->1、<!--[endif]-->首先,如果不知道JCO是什么?和JCO能干什么的?自己去谷歌吧,这里就不解释了。我们先来看一下JCO 3.0是如何连接SAP Netweaver 的。
JCO 3.0与2.0有许多的不同,它对SAP的连接更加的快捷、稳定和高效,不相信的,可以在学完3.0技术后,再去看看2.0的技术吧。
JCO 3.0对SAP的接口操作一般有两种方式:一种是以Web服务器作为客户端,SAP Netweaver为服务端,传输和接收数据;另一种是作为Server端,但是这种方式我没怎么了解,只是测试过,在Web端stop和start Web Server后,SAP会产生什么样的反应;而且在网上大量的资料也都是关于第一种的连接方式。
所以,在此,我就只介绍第一种连接方式吧,第一种连接SAP方式的原理是:
以Web Server(Tomcat)作为客户端,JCO技术作为中间接口桥梁,SAP作为服务的,用户在Web端所有的操作数据最终将通过RFC回滚到SAP上去维护,SAP会自动处理这些数据,这和BAPI原理是一样的。许多公司,上线了SAP后,需要将原来公司内部的ERP软件上的数据写入SAP,也是通过JCO技术作为桥梁来处理的。
<!--[if !supportLists]-->2、<!--[endif]-->连接第一步:
JCO连接SAP时,先要创建一个连接池,它的连接信息保存在一个Properties文件里。
/**
* 创建属性文件
*
* @param filename
* 文件名
* @param stuffix
* 後綴名
* @param host
* 主機地址
* @param sysnr
* 系統ID
* @param client
* 客戶端
* @param user
* 用戶名
* @param pass
* 密碼
* @param lang
* 語言
* @param pool_capacity 最大空閒連接
* @param peak_limit 最大活動鏈接數
* @return
*/
public static boolean creatSapPros(String filename, String stuffix,
String host, String sysnr, String client, String user, String pass,
String lang, String pool_capacity, String peak_limit) {
Properties pros = new Properties();
boolean iscreate = false;
String sysno = "";
if (sysnr.equals("AFD")) {
sysno = "00";
}
if (sysnr.equals("AFQ")) {
sysno = "00";
}
if (sysnr.equals("AFP")) {
sysno = "01";
}
if (lang.equals("")) {
lang = "ZF";
}
pros.clear(); // 先清空
pros.setProperty(DestinationDataProvider.JCO_ASHOST, host);
pros.setProperty(DestinationDataProvider.JCO_SYSNR, sysno);
pros.setProperty(DestinationDataProvider.JCO_CLIENT, client);
pros.setProperty(DestinationDataProvider.JCO_USER, user);
pros.setProperty(DestinationDataProvider.JCO_PASSWD, pass);
pros.setProperty(DestinationDataProvider.JCO_LANG, lang);
pros.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY,
pool_capacity);
pros.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, peak_limit);
iscreate = createFiles(filename, stuffix, pros);
if (iscreate) {
return true;
} else {
return false;
}
}
/**
* 判斷文件是否存在
*
* @param filename
* @param stuffix
* @return
*/
public static boolean isFileExist(String filename, String stuffix) {
File file = new File(filename + "." + stuffix);
if (file.exists()) {
try {
System.out.println("路徑:" + file.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
return true;
} else {
return false;
}
}
/**
* 創建新文件
*
* @param filename
* 文件名
* @param suffix
* 後綴名
* @param pros
* Properties
* @return
*/
public static boolean createFiles(String filename, String suffix,
Properties pros) {
File file = new File(filename + "." + suffix);
FileOutputStream fos = null;
if (!file.exists()) {
try {
System.out.println("********* 正在寫入文件 **********");
fos = new FileOutputStream(file, false);
pros.store(fos, "Author: EthanLiang");
fos.close();
return true;
} catch (FileNotFoundException e) {
System.out.println("-------- 找不到文件! ---------");
e.printStackTrace();
return false;
} catch (IOException e) {
System.out.println("-------- 內容寫入失敗! ---------");
e.printStackTrace();
return false;
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
return false;
}
}
上面我写了一个创建Property文件的方法,这样的话,这个文件是保存在Web服务器里面的,至于在什么位置,自己创建后,有兴趣可以去找找看。
<!--[if !supportLists]-->3、<!--[endif]-->第二步:开始连接SAP:
这一步,我们也可以叫它“登录SAP”,其实JCO实现的原理是和SAP的客户端原理是一样的,你要登录到SAP,首先是要先登录,第一步是创建了一个连接池,接下来咱们就要把用户的登录信息写在这个文件里,SAP会通过RFC自己去调用的。
public synchronized JCoDestination getJCoDestination(String filename,
String stuffix, String host, String sysnr, String client,
String user, String pass, String lang) {
boolean isexist = false; // 判断文件是否存在
boolean isCreate = false; // 穿件pro文件
JCoDestination destination;
isexist = FileUtil.isFileExist(filename, stuffix);
if (isexist == true) {
System.out.println("-------- 文件已經存在 -----------");
try {
destination = JCoDestinationManager.getDestination(filename);
return destination;
} catch (JCoException e) {
System.out
.println("---------- 獲取JCoDestination失敗! -----------");
e.printStackTrace();
return null;
}
} else {
isCreate = FileUtil.creatSapPros(filename, stuffix, host, sysnr,
client, user, pass, lang, "3000", "500");
if (isCreate == true) {
try {
destination = JCoDestinationManager
.getDestination(filename);
System.out
.println("---------- 獲取JCoDestination!成功,正在返回數據 -----------");
return destination;
} catch (JCoException e) {
System.out
.println("---------- 無法獲取JCoDestination! -----------");
e.printStackTrace();
return null;
}
} else { // 如果文件不存在
return null;
}
}
}
===================================================================
上面的连接SAP代码,我设计了一个非常人性化的代码,我写了一个getJCoDestination的方法,该方法用来连接SAP,连接成功后会返回远程连接目标信息,也就是JCoDestination。代码中,去登录前,先判断property文件是否已经创建好了,如果创建好了,就直接取出文件登录信息去连接SAP,如果没有,就先去创建一次,创建的代码请看第2步。
JCoDestinationManager.getDestination(filename);
这代码就是根据你创建的property文件的命名去获取里面的登录信息;
这里的filename是你自己随机定义命名的,你创建property文件时,是用什么名字,你getDestination也要用什么名字,这个filename是不包含property后缀名的,一定要切记。比如:createFiles(“filetest”, “pros”,Properties pros) ;这个方法是【第2步】创建property文件的方法,我们以上假设了创建一个property文件,filename是【filetest】,后缀名是【pros】,创建成功后,你会看服务器上多出了个【filetest.pros】的文件,这个文件就是保存SAP登录信息的文件;
然后登录时就应该是:
JCoDestinationManager.getDestination(“filetest”);
成功连接了SAP后,可以测试一下有没连接成功,可以打印一下连接信息:
//getJCoDestination要传的参数自己去写吧,我自己做个范例而已。
Destination dest= getJCoDestination(String filename,
String stuffix, String host, String sysnr, String client,
String user, String pass, String lang);
System.out.println(destination.getAttributes());
<!--[if !supportLists]-->4、<!--[endif]-->当成功连接了SAP后,开始与SAP交互了:
Java同JCO技术与SAP进行交互的时候,主要是通过SAP 的RFC进行操作,也就SAP的Function,这个Function可以是SAP任何的Function,当然要成功连接Function前,请记得先去SAPFunction的【属性】设置里,选择【Remote-Enable Module立即开始】,要切记啊,不然连接不到Function,如果是自己开发的Function,还要激活它这个Function才能用。
首先我们通过上面的第三部连接成功后:
Destination dest= getJCoDestination(String filename,
String stuffix, String host, String sysnr, String client,
String user, String pass, String lang);
//开始连接function
try {
JCoFunction fun = dest.getRepository()
.getFunction(“ZRFC_PRICE_STATUS”);
} catch (JCoException e) {
fun = null;
System.out.println("JCO異常,無法獲取Function");
e.printStackTrace();
}
有没连接成功,可以打印一下function.getName()来看看;
<!--[if !supportLists]-->5、<!--[endif]-->获取接口参数:
做ABAP开发的都知道,ABAP的Functionz主要有四个接口:Export、Import、Changing和Table;
Function连接成功后,我们就开始获取这四个接口的参数;首先是获取到这个三个接口:
JCoParameterList imlist= function.getImportParameterList();
JCoParameterList emlist= function.getExportParameterList();
JCoParameterList tmlist= function.getTableParameterList();
JCoParameterList cmlist= function.getChangingParameterList();
接着我们可以开始向SAP传数据,如果不需要传递数据,可以直接跳过以下的步骤。我们来往function的import接口里的参数传,其他的三个接口也类似,其它三个借口的传法,可以去参考API的案例或者去百度。
imlist.setValue("STATUS", "D"); // 傳入參數
imlist.setValue("VBELN_LOW", vbeln.trim()); // 傳入參數
<!--[if !supportLists]-->6、<!--[endif]-->开始调用function:
try {
JCoParameterList imlist= function.getImportParameterList();
JCoParameterList tmlist= function.getTableParameterList();
imlist.setValue("STATUS", "D"); // 傳入參數
imlist.setValue("VBELN_LOW", vbeln.trim()); // 傳入參數
JCoContext.begin(destination); //开启一个事务
//开始执行function
function.execute(destination);
//获取function返回的数据,因为我的function执行成功后,abap返回的数据是存放在table接口,所以我以上是这样去获得数据,如果你想返回在export里面,那就用export的方式去获取
JCoTable tab = tmlist.getTable("IT_RETURN");
for (int i = 0; i < tab .getNumRows(); i++) {
tab.setRow(i); //设置指针位置,这个很重要
//获取出table接口里名为“IT_RETURN”的表的数据
tab.getString("VBELN"); //訂單號
tab.getString("NAME1"); //買 方
tab.getString("NAME2"); //付款人
tab.getString("NAME3"); //收貨人
}
try {
JCoContext.end(destination); //远程调用结束后可以关闭
} catch (JCoException e1) {
e1.printStackTrace();
}
catch (JCoException e1) {
e1.printStackTrace();
}
<!--[if !supportLists]-->7、<!--[endif]-->最后:
好了,Java与SAP的交互已经说完了,中间还有很多的细节和功能,你在自己按着这个思路去摸索吧。
当然,使用JCO首先要去下载JCO 3.0的JAR文件,这里我就不提供,网上也有,想要的话,也可以问我要。JCO 3.0的压缩包里,除了有Jar包,还有API和Demo,你可以慢慢去看Demo。
最后声明,要想成功连接SAP,JCO 3.0包里面还有一个重要“sapjco3.dll”这个文件,你必须把这个文件放在你的项目WEB-INF/lib文件夹下面,或者放在你本地的哪个位置来的?我忘了,自己去搜索一下吧,反正我不是放在本地的目录下的。这点要切记啊!
相关推荐
java连接sap系统需要通过sap javaconnect来连接,对于sapjco3.jar系列文件有32位与64位之分。 a)确定本机使用JDK版本,一般均为32位。 b)将相对应位数的sapjco3.dll文件拷贝至system32。 c)将相对应位数sapjco.jar...
SAP Java Jco3.0 , 内部包含 windows 32位的全部资源( dll 和 jar 文件 )
sap编程接口.JCo3.0是Java语言与ABAP语言双向通讯的中间件。
Java里如何使用JCo的连接池来连接SAP R3系统.
java连接sap系统需要通过sap javaconnect来连接,对于sapjco3.jar系列文件有32位与64位之分。 a)确定本机使用JDK版本,一般均为32位。 b)将相对应位数的sapjco3.dll文件拷贝至system32。 c)将相对应位数sapjco.jar...
Java连接SAP的相关JCO包。包括各个Linux版本及Windows版本的。
sapjco3-3.0.jar下载
连接SAP的最新JCO驱动,Windows64位,有三个文件sapjco3.dll、sapjco3.jar、sapjco3.pdb
SAP Java Jco3.0 15 Windows 全平台 32bit 64bit ERP Solutions.
SAP Java Jco3.0 14 Windows 全平台 32bit 64bit ERP Solutions.
SAP Java Jco3.0 15 Windows 全平台 32bit 64bit ERP Solutions.
JAVA对接SAP接口使用sapjco3.dll跟jar文件
包括jco3.0包及连接实例,适用jdk32位版本环境
SAP Java Jco3.0 , 内部包含 windows 32位和64位, mac 64 位,以及linux 64位的全部资源
JAVA 通过JCO调用SAP端接口的相关包(sapjco3.jar,sapjco3.dll,sapjcorfc.dll)打包下载
SAP开发接口文档:最新sap JCO3.0包和示例代码
sap的sapjco3.jar、sapjco3.dll及API文档说明,请各位参阅
SAP Java Jco3.0 17 Windows 全平台 32bit 64bit ERP Solutions.
2020官网最新sapjco3.0linux环境亲测可用(含sapjco3.jar和libsapjco3.so)
JAVA连接SAP的官方接口(通过sapjco3连接)文档 内含java端代码 内容详细 可用来学习