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系统所用的JCo连接池的配置和使用是指在Java应用程序中使用JCo连接池来连接SAP R3系统的技术。JCo(Java Connector)是SAP提供的一种Java API,用于连接SAP系统。在Java应用程序中使用JCo连接池可以提高...
总之,SAP Java Jco3.0为Java开发者提供了一个强大且灵活的工具,使他们能够在Java环境中无缝地集成和操作SAP系统,从而实现跨平台的业务流程自动化和数据交换。通过深入理解和熟练使用SAP JCo,开发者可以构建高效...
Java连接SAP的相关JCO(Java Connector)是用于在Java应用程序和SAP系统之间建立通信桥梁的关键组件。JCO库允许开发人员使用Java语言来访问和操作SAP系统的业务数据和功能,从而实现跨平台的集成。JCO 3.0是这个连接...
《SAP JCO 3.0 Dll及API文档详解》 SAP JCO(Java Connector)是SAP公司提供的一种用于Java应用程序与SAP R/3系统间通信的接口技术。本文主要针对JCO 3.0版本,探讨其Dll(动态链接库)和API文档的相关知识点。 一...
JCo3.0 版本是 SAP Java 连接器的一个重要里程碑,它提供了对 SAP 系统的高效、稳定且灵活的访问方式。这里提到的是 SAP Java Jco3.0 版本 14,在 Windows 操作系统上的全平台支持,包括 32 位和 64 位架构。 首先...
在描述中提到的“jco3.0包及连接实例”,通常包含以下组件: 1. SAP JCo库:这是Java API,提供了连接、调用RFC函数模块和处理响应的方法。 2. 配置文件:如`jco.client.properties`,用于设置SAP系统的连接参数,如...
java连接sap系统需要通过sap javaconnect来连接,对于sapjco3.jar系列文件有32位与64位之分。 a)确定本机使用JDK版本,一般均为32位。 b)将相对应位数的sapjco3.dll文件拷贝至system32。 c)将相对应位数sapjco.jar...
java连接sap系统需要通过sap javaconnect来连接,对于sapjco3.jar系列文件有32位与64位之分。 a)确定本机使用JDK版本,一般均为32位。 b)将相对应位数的sapjco3.dll文件拷贝至system32。 c)将相对应位数sapjco.jar...
sapjco3-3.0.jar下载
【SAP Java Jco3.0 15 Windows 全平台 32bit 64bit】是一款适用于Windows操作系统,支持32位和64位环境的SAP Java Connector(JCo)版本3.0的组件。这款软件是SAP与Java应用程序之间的桥梁,它允许Java应用程序与SAP...
SAP JCo3(Java Connector 3.0)是一个关键的中间件技术,它使得Java应用程序能够与SAP系统的ABAP环境进行无缝交互。在Java编程中,SAP JCo3提供了一组全面的API,允许开发人员创建、读取、更新和删除SAP系统中的...
10. **SAP NetWeaver Gateway**:JCO 3.0在SAP NetWeaver Gateway环境中尤为重要,因为Gateway允许非SAP系统(如Web应用程序或移动设备)通过OData协议与SAP系统交互,而JCO是实现这种交互的Java端桥梁。 总的来说...
- JCo3.0提供了一系列Java类和接口,如`JCoDestination`、`JCoRepository`、`JCoFunction`等,用于创建和管理SAP连接,读取RFM,执行RFM调用,并处理结果。 - `JCoDestination`代表一个SAP系统,可以创建多个实例...
SAP JCo (Java Connector) 是一款用于连接Java应用程序与SAP系统的关键组件,它提供了在Java环境中访问SAP R/3系统或者SAP NetWeaver应用服务器的能力。"sapjco30"指的是SAP JCo的第三版,这个版本对应于JCo 3.0,是...
总的来说,SAP JCO 3.0 for Linux X64 提供了一套全面的工具和资源,让 Java 开发者能够在64位 Linux 环境下构建与 SAP 系统交互的应用程序。它改进了性能和兼容性,使得 Java 应用与 SAP 系统之间的集成更加顺畅。...
总的来说,JAVA对接SAP接口使用`sapjco3.dll`和`jar`文件是一个涉及多个步骤的过程,包括环境配置、连接建立、接口调用以及资源管理和安全设置。理解这些核心概念和操作,能够帮助开发者有效地集成JAVA应用与SAP系统...
连接SAP的最新JCO驱动,Windows64位,有三个文件sapjco3.dll、sapjco3.jar、sapjco3.pdb
Java JCO连接SAP是一种常见的技术实践,用于在Java应用程序中与SAP系统进行交互。JCO(Java Connector Architecture)是SAP提供的一个接口库,它允许非SAP应用程序,如Java应用,与SAP R/3系统进行通信。在这个主题...
1. **下载JCO**: 首先,你需要从SAP官方网站下载适合32位Windows系统的JCO版本,通常为`.zip`文件,例如`jco3.0.zip`。 2. **解压并安装**: 解压下载的文件,将包含的`jco.dll`和`sapjco3.jar`两个文件放在系统的...
这时,就需要使用到SAP提供的Java连接器,即JCo(Java Connector)。本文将详细介绍如何使用JAVA链接SAP的相关jar包,包括sapjco3.jar、sapjco3.dll和libsapjco3.so,并指导如何将它们导入到Maven项目中。 首先,...