`
yisam
  • 浏览: 11953 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java连接SAP ————JCO 3.0技术详解

阅读更多

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(filetestpros,Properties pros) ;这个方法是【2】创建property文件的方法,我们以上假设了创建一个property文件,filename是【filetest,后缀名是【pros】,创建成功后,你会看服务器上多出了个【filetest.pros】的文件,这个文件就是保存SAP登录信息的文件;

然后登录时就应该是:

JCoDestinationManager.getDestination(filetest);

 

成功连接了SAP后,可以测试一下有没连接成功,可以打印一下连接信息:

 

//getJCoDestination要传的参数自己去写吧,我自己做个范例而已。

Destination destgetJCoDestination(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 destgetJCoDestination(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文件夹下面,或者放在你本地的哪个位置来的?我忘了,自己去搜索一下吧,反正我不是放在本地的目录下的。这点要切记啊!

 

 

 

 

 

 

 

 

  • 大小: 2.7 KB
  • 大小: 2.9 KB
  • 大小: 2.7 KB
2
1
分享到:
评论

相关推荐

    Java连接SAP系统所用的JCo连接池的配置和使用

    Java连接SAP系统所用的JCo连接池的配置和使用是指在Java应用程序中使用JCo连接池来连接SAP R3系统的技术。JCo(Java Connector)是SAP提供的一种Java API,用于连接SAP系统。在Java应用程序中使用JCo连接池可以提高...

    SAP Java Jco3.0(win32)

    总之,SAP Java Jco3.0为Java开发者提供了一个强大且灵活的工具,使他们能够在Java环境中无缝地集成和操作SAP系统,从而实现跨平台的业务流程自动化和数据交换。通过深入理解和熟练使用SAP JCo,开发者可以构建高效...

    JCO3.0.zip

    Java连接SAP的相关JCO(Java Connector)是用于在Java应用程序和SAP系统之间建立通信桥梁的关键组件。JCO库允许开发人员使用Java语言来访问和操作SAP系统的业务数据和功能,从而实现跨平台的集成。JCO 3.0是这个连接...

    JCO3.0Dll及API文档资料

    《SAP JCO 3.0 Dll及API文档详解》 SAP JCO(Java Connector)是SAP公司提供的一种用于Java应用程序与SAP R/3系统间通信的接口技术。本文主要针对JCO 3.0版本,探讨其Dll(动态链接库)和API文档的相关知识点。 一...

    SAP Java Jco3.0 14 Windows 全平台 32bit 64bit

    JCo3.0 版本是 SAP Java 连接器的一个重要里程碑,它提供了对 SAP 系统的高效、稳定且灵活的访问方式。这里提到的是 SAP Java Jco3.0 版本 14,在 Windows 操作系统上的全平台支持,包括 32 位和 64 位架构。 首先...

    JCO3.0-sap

    在描述中提到的“jco3.0包及连接实例”,通常包含以下组件: 1. SAP JCo库:这是Java API,提供了连接、调用RFC函数模块和处理响应的方法。 2. 配置文件:如`jco.client.properties`,用于设置SAP系统的连接参数,如...

    java连接sap接口包sapjco3

    java连接sap系统需要通过sap javaconnect来连接,对于sapjco3.jar系列文件有32位与64位之分。 a)确定本机使用JDK版本,一般均为32位。 b)将相对应位数的sapjco3.dll文件拷贝至system32。 c)将相对应位数sapjco.jar...

    java连接sap接口包sapjco3 window36/64

    java连接sap系统需要通过sap javaconnect来连接,对于sapjco3.jar系列文件有32位与64位之分。 a)确定本机使用JDK版本,一般均为32位。 b)将相对应位数的sapjco3.dll文件拷贝至system32。 c)将相对应位数sapjco.jar...

    SAP Java Jco3.0 15 Windows 全平台 32bit 64bit

    【SAP Java Jco3.0 15 Windows 全平台 32bit 64bit】是一款适用于Windows操作系统,支持32位和64位环境的SAP Java Connector(JCo)版本3.0的组件。这款软件是SAP与Java应用程序之间的桥梁,它允许Java应用程序与SAP...

    sapjco3压缩包下载

    SAP JCo3(Java Connector 3.0)是一个关键的中间件技术,它使得Java应用程序能够与SAP系统的ABAP环境进行无缝交互。在Java编程中,SAP JCo3提供了一组全面的API,允许开发人员创建、读取、更新和删除SAP系统中的...

    JCO3.0安装包 SAP ABAP

    10. **SAP NetWeaver Gateway**:JCO 3.0在SAP NetWeaver Gateway环境中尤为重要,因为Gateway允许非SAP系统(如Web应用程序或移动设备)通过OData协议与SAP系统交互,而JCO是实现这种交互的Java端桥梁。 总的来说...

    SAP Java Jco3.0(win32,win64,mac64,linux64)

    - JCo3.0提供了一系列Java类和接口,如`JCoDestination`、`JCoRepository`、`JCoFunction`等,用于创建和管理SAP连接,读取RFM,执行RFM调用,并处理结果。 - `JCoDestination`代表一个SAP系统,可以创建多个实例...

    sapjco3-3.0.jar下载

    sapjco3-3.0.jar下载

    sapjco30/sapjco3.dll/sapjco3.jar SAP官网2017/7/18更新版本

    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

    总的来说,SAP JCO 3.0 for Linux X64 提供了一套全面的工具和资源,让 Java 开发者能够在64位 Linux 环境下构建与 SAP 系统交互的应用程序。它改进了性能和兼容性,使得 Java 应用与 SAP 系统之间的集成更加顺畅。...

    连接SAP驱动JCO 3.0 Win64

    连接SAP的最新JCO驱动,Windows64位,有三个文件sapjco3.dll、sapjco3.jar、sapjco3.pdb

    Java链接SAP JCO包 32位,window、linux

    1. **下载JCO**: 首先,你需要从SAP官方网站下载适合32位Windows系统的JCO版本,通常为`.zip`文件,例如`jco3.0.zip`。 2. **解压并安装**: 解压下载的文件,将包含的`jco.dll`和`sapjco3.jar`两个文件放在系统的...

    SAPJCO3.0_LINUX_X86_64.zip

    标题"SAPJCO3.0_LINUX_X86_64.zip"所指的是一款用于Linux x86_64架构的SAP Java Connector (SAP JCo)版本3.0.16的压缩包。SAP JCo是SAP公司提供的一种中间件,允许Java应用程序与SAP系统进行无缝集成和通信。它充当...

    JAVA连接SAP的官方接口文档

    本文将深入探讨如何利用JAVA通过sapjco3连接SAP系统,以及相关的关键知识点。 首先,我们需要了解JCo是什么。JCo是SAP NetWeaver Gateway服务的一部分,它为非SAP系统提供了一种与SAP R/3系统进行通信的方式。JCo3...

    2020官网最新sapjco3.0linux环境亲测可用(含sapjco3.jar和libsapjco3.so)

    标题和描述中提到的"2020官网最新sapjco3.0"表明这是 SAP JCo 的第3个主要版本,且是针对2020年的更新,确保与最新的 SAP 系统兼容。"linux环境亲测可用"意味着这个版本已经过验证,可以在Linux操作系统上正常运行,...

Global site tag (gtag.js) - Google Analytics