JCo在java中调用abap服务
SAP ABAP与JAVA之间通过RFC传递数据实例
str[i][j++] = field.getString();
}else
if(field.getName().equals("LTEXT")){
str[i][j] = field.getString();
}
System.out.println(field.getName() +
":\t" + field.getString());
图6 特别要注意的是,下面图要默认 Unicode,因为这个标示影响 Java 代码中的 Unicode 设置。
4
SAP ABAP 与 JAVA 之间通过 RFC 传递数据实例 作者的 EMAIL:ebahaimei@ ebahaimei
图7 上述配置完成即可。 测试连接
5
SAP ABAP 与 JAVA 之间通过 RFC 传递数据实例 作者的 EMAIL:ebahaimei@ ebahaimei
}
s.nextRow();
}
JCO.Table
inputTable
=
function.getTableParameterList().getTable("ZT001T_T"); //SAP 回传表名
for(int i=0;i<str.length;i++){
13
SAP ABAP 与 JAVA 之间通过 RFC 传递数据实例 作者的 EMAIL:ebahaimei@
inputTable.insertRow(i);
inputTable.setRow(i);
ebahaimei
"BUKRS");
inputTable.setValue(100, "MANDT"); inputTable.setValue(str[i][0],
SAP JCO使用指导
SAP Java Connector1.目的SAP Java Connector (SAP JCo)是个中间件组件,用于SAP组件和JAVA程序的开发。
SAP JCO 支持两种方向连接SAP 服务器:inbound calls (Java calls ABAP) and outbound calls (ABAP calls Java)。
SAP JCO可以用于桌面应用和WEB应用程序也可以作为组件嵌入到一下程序中:SAP Business Connector:用于与外边的JAVA程序的连接SAP Web Application Server:通过ABAP环境连接到嵌入式J2EE服务2.实现SAP 提供SAP JCO 各种版本✧作为单独的独立于SAP环境软件组件,可以从/connectors.下载安装文件✧当你使用SAP Business Connector 或者SAP Web Application Server for Java时SAP JCO 会自动安装。
3.SAP JCO 体系结构从JAVA程序开始,JAVA 业务方法通过JCO 核心API,再通过RFC和JNI层,发送到SAP系统,系统响应了请求,并把相应信息通过以上路径返回到JAVA程序中。
4.SAP JCo情景图1:使用SAP JCo在SAP Web AS中融合J2EE 和ABAP图2:使用CPI-C/fRFC 连接ABAP和J2EE.5.SAP JCO 安装SAP JCo 2.0需要JDK 1.2和更高,如果你需要用JDK1.1需要使用1.1.04或者更高过程:创建目录,例如C:\\SAPJCo,抽取JCo .zip到该目录中在SAP JCo目录中复制librfc32.dll到C:\WINNT\SYSTEM32放置sapjco.jar到程序的类路径中6.SAP JCO 客户端编程SAP JCo主要的操作活动建立到SAP 服务器的连接SAP JCo有两种方式连接到SAP服务器:直接连接和连接池直接连接打开连接:调用函数和关闭连接:连接池创建连接池:获取和释放连接:JCO.Repository:用于存取RFMs的元数据创建Repository创建JCO.FUNCTION执行JCO.FUNCTION映射JAVA和ABAP数据类型存取表BAPI函数调用。
最新Jco 3.0技术详解---Java EE连接SAP
本内容由【菊花频道】特别提供---------------- 版权所有,盗版必爆菊花=================================================================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的资料寥寥无几,谷歌上虽然也有不少,可是在开发过程遇到的许多问题,在谷歌上回答的人也不多。
java 操作sap标准表
java 操作sap标准表在Java 中,要操作SAP 标准表,通常需要使用SAP 的Java 连接器(SAP Java Connector,SAP JCo)。
SAP JCo 是SAP 提供的用于在Java 中与SAP 系统进行通信的库。
以下是使用SAP JCo 操作SAP 标准表的一般步骤:1. 导入SAP JCo 库:-首先,你需要下载SAP JCo 库并将其包含在你的Java 项目中。
你可以从SAP 官方网站下载JCo 库,然后将相关的JAR 文件包含到你的项目中。
2. 建立连接:-使用SAP JCo 创建连接到SAP 系统的连接对象。
```javaimport com.sap.conn.jco.*;public class SAPConnector {private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";public static JCoDestination connect() {try {JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);return destination;} catch (JCoException e) {e.printStackTrace();return null;}}}```3. 获取SAP 表数据:-通过连接对象获取SAP 表的数据。
```javaimport com.sap.conn.jco.*;public class SAPTableReader {public static void readSAPTable(JCoDestination destination, String tableName) { try {JCoFunction function = destination.getRepository().getFunction("RFC_READ_TABLE");if (function == null) {throw new RuntimeException("Function RFC_READ_TABLE not found in SAP system.");}// 设置参数function.getImportParameterList().setValue("QUERY_TABLE", tableName);// 执行函数function.execute(destination);// 获取结果JCoTable resultTable = function.getTableParameterList().getTable("DATA");// 处理结果for (int i = 0; i < resultTable.getNumRows(); i++) {resultTable.setRow(i);String rowData = resultTable.getString("WA");System.out.println(rowData);}} catch (JCoException e) {e.printStackTrace();}}}```4. 关闭连接:-在完成SAP 表的操作后,关闭连接。
JCO基本介绍
阅读提示:SAP的R/3系统与Java平台一样有着许多类似的技术理念,以及同样广泛的企业级用户,但是它们完全是两个不同的世界。
当用户面临流程或者数据整合方面的需求的时候,就迫切需要一种高效的方式,在R/3系统和Ja.....SAP的R/3系统与Java平台一样有着许多类似的技术理念,以及同样广泛的企业级用户,但是它们完全是两个不同的世界。
当用户面临流程或者数据整合方面的需求的时候,就迫切需要一种高效的方式,在R/3系统和Java平台之间实时地交换数据。
基于这样的需求,SAP 提供了一套高效的基于RFC的ABAP和Java进程间通讯组件:SAP Java Connector(JCo)。
本文将介绍JCo组件的架构,配置,基本使用方法以及调试,同时还将讨论如何对RFC方式调用的ABAP函数进行远程调试。
JCo组件的基本架构如下图所示:如图所示,JCo库提供了可以直接在Java程序中使用的API。
该API通过JNI调用部署在客户端的SAP的RFC库。
该RFC库是用C语言实现的,并且与JCo库相互独立发布。
但是,在下载的JCo库压缩包中也会提供。
该组件支持Inbound(在Java代码中调用ABAP函数)和Outbound(在ABAP代码中调用Java)两种模式。
本文只专注于介绍Inbound 模式中,如何在Java代码远程调用ABAP函数。
安装与配置最新版本的JCo库可以在如下网址下载(请选择适合你的软件和硬件平台的版本,本文的示例都基于32位Windows操作系统):你可能需要提供SAP Service MarketPlace的用户帐号。
解压缩以后,将名为librfc32.dll的文件复制到目录{windows-dir}\system32下面。
如果该文件已经存在,则覆盖它。
这个文件就是SAP的RFC协议实现。
然后,确保CLASSPATH环境变量中包含文件sapjco.jar所在的目录。
因为这个JAR包中含有在Java程序中需要直接调用的类和接口。
JCO 使用简介
SAP的R/3系统与Java平台一样有着许多类似的技术理念,以及同样广泛的企业级用户,但是它们完全是两个不同的世界。
当用户面临流程或者数据整合方面的需求的时候,就迫切需要一种高效的方式,在R/3系统和Java平台之间实时地交换数据。
基于这样的需求,SAP提供了一套高效的基于RFC的ABAP和Java 进程间通讯组件:SAP Java Connector(JCo)。
本文将介绍JCo组件的架构,配置,基本使用方法以及调试,同时还将讨论如何对RFC方式调用的ABAP 函数进行远程调试。
JCo库提供了可以直接在Java程序中使用的API。
该API通过JNI调用部署在客户端的SAP的RFC库。
该RFC库是用C语言实现的,并且与JCo库相互独立发布。
但是,在下载的JCo库压缩包中也会提供。
该组件支持Inbound(在Java代码中调用ABAP函数)和Outbound(在ABAP代码中调用Java)两种模式。
本文只专注于介绍Inbound模式中,如何在Java代码远程调用ABAP函数。
安装与配置最新版本的JCo库可以在如下网址下载(请选择适合你的软件和硬件平台的版本,本文的示例都基于32位Windows操作系统):/connectors你可能需要提供SAP ServiceMarketPlace的用户帐号。
解压缩以后,将名为librfc32.dll的文件复制到目录system32下面。
如果该文件已经存在,则覆盖它。
这个文件就是SAP的RFC协议实现,可以在http://s /connectors下载其最新版本。
然后,确保CLASSPATH环境变量中包含文件sapjco.jar所在的目录。
因为这个JAR包中含有在Java程序中需要直接调用的类和接口。
下载的压缩包中还包含了JavaDoc,文档以及示例程序供参考。
建立连接在执行任何操作之前,必须先建立到SAP系统的连接。
本文示例使用的用户名是“DDIC”,登录密码是“min isap”类JCO是Jco库中最主要的一个入口,它提供了许多静态方法。
JCo-在Java中调用ABAP服务
般 的情 况 下 ,在 S AP服 务 器上 通过 事务 代 码 S 3 激 活 J 的 AB E7 C0 AP调 试 功 能 。
如果一 个连接 池 的 AB AP调试 功 能被 激活 ,那么其 中
可 以 测 试 AB AP函 数 。 在 保 证 AB AP函 数 的 正 确 性 之 后 ,
念 ,以 及 同样 广 泛 的 企 业 级 用 户 ,但 是 它 们 完 全 是 两 个 合 你 的 软 件 和 硬 件 平 台 的 版 本 , 本 文 的 示 例 都 基 于 3 2位
的世 界。当用户面临流程或者数据整合方面 的需求的时 Wid ws 作系统) no 操 : 就迫 切需要一种高 效的方式 ,在 R 3系统和 J v / a a平台
Jv a a客 户 端 只 需要 检 查 输 入 输 出 参 数 是 否 正 确 即 可 。 这 时 的所 有连接 的 AB AP调试 功能都 会被激 活。使用 这样一个 可以利用 J Co库 为 了方 便 调 试 而 提 供 的 了 一 个 很 强 大 的功 连 接 来 调 用 AB AP函 数 的 时 候 ,S AP系 统 会 ,必须先建立到 S AP系统的连接。 类 J CO 是 J o库 中最 主要的一个入口 ,它提供 了许 多 c
静 态 方 法 。 其 中 有 一 系 列 重 载 的 c e t Cl n 方 法 可 以用 rae i t e
来创建 与 S AP系统 的连接信 息 。这 些信息都 保存在 返回 的
的 AP。 该 AP 通 过 J 调 用 部 署 在 客 户 端 的 S I I NI AP的 和 允 许 同时 激 活 的 最 大 连 接 数 。
库 。该 R C库 是用 C语 言实 现 的 ,并 且与 J F Co库 相 立发布 。但是 ,在下载的 J Co库压缩包 中也会提供 。
Java和ABAP接口对应关系
Java和ABAP接口对应关系Java 和ABAP 接口对应关系Java调用ABAP1.表单发送Java:sendSheetT oFinance(int type, HashMap map)ABAP:ZRFC_(type)其中type是表单类型id2.表单回滚Java:rollbackSheetSubmit(String djbh)ABAP:ZRFC_DJ_REV其中djbh是单据编号3.立项Java:sendProjectT oFinance(Vector projects)ABAP:ZRFC_WBS_ZJ (如果资产分类是8000-资产证券化)ZRFC_LIXIANG (其他)4.立项补偿Java:rollbackProjectSubmit (Vector projects)ABAP:ZRFC_WBS_ZJ_REV (如果资产分类是8000-资产证券化)ZRFC_LIXIANG_REV (其他)5.固定资产查询Java:queryGDZC(GDZC_Cond condition)ABAP:ZRFC_FIXEDASSET_GETDETAIL6.转清理固定资产查询Java:queryZQLGDZC (GDZC_Cond condition)ABAP:ZRFC_FIXEDASSET_GETDETAIL_BF7.无形资产查询Java:queryWXZC (WXZC_Cond condition)ABAP:ZRFC_WXZC_GETDETAIL8.银行账户查询Java:queryYHZH(YHZH_Cond condition)ABAP:ZRFC_BANK_DETAIL9.递延所得税查询Java:queryDYSDS(Date kjqsr, Date kjjzr, String type) ABAP:ZRFC_SELECT_DYJDC1其中,kjqsr 是会计起始日,kjjzr是会计截止日,type 为“101”是查询递延所得资产,”102”查询递延所得负债10.未分配利润余额查询Java:QueryWFPLRYE(String jgbm)ABAP:ZRFC_WFPLR其中,jgbm是机构代码11.费用科目查询Java:queryKMXX(List types)ABAP:ZRFC_GET_ACC_NUM_BY_ETYPE其中,types 是费用类型列表12.公允价值查询(附表13-收入信息录入单-投资业务)Java:queryGYJZ13(String type, String zcbh, String jrzcfl)ABAP:ZRFC_KMYEHJ13其中,type是查询类型,zcbh 是资产编号,jrzcfl是金融资产分类13.公允价值查询(附表22-公允价值变动信息录入单)Java:queryGYJZ22 (String type, String zcbh, String jrzcfl)ABAP:ZRFC_KMYEHJ22其中,type是查询类型,zcbh 是资产编号,jrzcfl是金融资产分类14.公允价值查询(附表23-金融资产处置信息录入单)Java:queryGYJZ23 (String type, String zcbh, String jrzcfl)ABAP:ZRFC_KMYEHJ23其中,type是查询类型,zcbh 是资产编号,jrzcfl是金融资产分类15.公允价值查询(附表29-长期股权投资处置信息录入单)Java:queryGYJZ29 (String type, String zcbh, String jrzcfl)ABAP:ZRFC_KMYEHJ29其中,type是查询类型,zcbh 是资产编号,jrzcfl是金融资产分类16.帐面余额查询(附表25资产分类信息录入单_购入资产分类调整/附表25资产分类信息录入单_债券分类调整)Java:queryZMYEMX(Vector list)ABAP:ZRFC_KMYEHJ125其中,list 是要查询的帐面余额资产列表17.帐面余额查询(附表25资产分类信息录入单_购入资产分类调整/附表25资产分类信息录入单_债券分类调整)Java:queryZMYEMX2 (Vector list)ABAP:ZRFC_KMYEHJ225其中,list 是要查询的帐面余额资产列表18.利息试算Java:queryLXSS(String jgdm, String xybh, String ywlx, Date jsrq, String bz)ABAP:ZRFC_INTEREST_RZSS其中,jgdm 是机构编码,xybh 是协议编号,ywlx 是业务类型,jsrq是截止日期,bz是币种19.个贷系统同步Java:sendGDT oFinance(String type, JCO.Table table)ABAP:ZRFC_INTEREST_GDLX其中,type 1:计息2:计息补偿3:还款4:还款补偿5:还款冲正6:还款冲正补偿20.项目经理Java:sendXMJL(Vector list)ABAP:ZRFC_WBS_XMJL其中,list 是项目经理列表21.项目经理补偿Java:rollbackXMJL (Vector list)ABAP:ZRFC_WBS_XMJL_REV其中,list 是项目经理列表ABAP调用Java1.退单通知ABAP:ZRFC_TDTZJava(南天):ServiceForSap. Sheetconfirm(单据编号,”0”,退单原因,操作者,退单日期)2.退单补偿ABAP:ZRFC_TDTZ_REVJava(南天):ServiceForSap. Sheetconfirm(单据编号)3.过账通知ABAP:ZRFC_PZ_POSTJava(南天):ServiceForSap. Sheetconfirm(单据编号,”1”,””,操作者,退单日期) 4.过账补偿ABAP:ZRFC_PZ_POST_REVJava(南天):ServiceForSap. Sheetconfirm(单据编号)5.汇率同步ABAP:ZRFC_HL_POSTJava(南天):ServiceForSap. SendT oBus("101", 汇率列表);6.汇率补偿ABAP:ZRFC_HL_POST_REVJava(南天):ServiceForSap. SendT oBus("601", 汇率列表);7.部门同步ABAP:ZRFC_COST_POSTJava(南天):ServiceForSap. SendT oBus("201", 部门率列表);8.部门补偿ABAP:ZRFC_COST_POST_REVJava(南天):ServiceForSap. SendT oBus("701", 部门率列表);9.利息发送ABAP:ZRFC_INTEREST_NTJava(南天):ServiceForSap. sendlxtoyw (业务类型, 利息列表);其中:业务类型购入项目:101往来款项:102融资:103内部往来:104投资:10510.利息补偿ABAP:ZRFC_INTEREST_NT_REVJava(南天):ServiceForSap. sendlxtoyw (业务类型, 利息列表);其中:业务类型购入项目:601往来款项:602融资:603内部往来:604投资:60511.I T设备信息同步ABAP:ZRFC_IT_DEVICEJava(华科):HardwareService .getHardwareInfo(开始时间, 截止时间);12.人员信息同步ABAP:ZRFC_EMP_POSTJava(华科):UserService.getUserSynInfo (开始时间, 截止时间);13.归档ABAP:ZRFC_ATTACHMENT_ARCHIVEJava(华科):ArchivePreDeposer.asynSubmitCommonArchive(archiveList, parameter)。
JAVA调用SAP之JCO配置说明v2
JAVA调用SAP之JCO配置说明●环境配置(一)根据机器环境选择jco的jar包,现有jco的jar包分为32位包、64位包、hpux包。
(二)根据机器选择相应zip包,解压后把sapjco30P_9-10005324-win32\sapjco3-NTintel-3.0.9目录下的文件拷贝到相应目录例如:C:\SAPJCo(三)添加环境变数CLASSPATH:C:/SAPJCo/sapjco3.jar(四)添加环境变数Path:C:\SAPJCo●更新pom.xml文件(可忽略)执行命令:mvn clean eclipse:eclipse●Web项目下的env环境变量配置默认sap连接#ip地址JCO_HOST=192.168.70.230#系统编号JCO_SYSNR=01#客户端JCO_CLIENT=320#用户名JCO_USER=PIAPPLUSER#密码JCO_PWD=654321#语言JCO_LANG=ZH#最大连接数JCO_POOL_CAPACITY=10#最大连接线程JCO_PEAK_LIMIT=3●web项目resources目录下创建sap文件夹,里面存放sap的bapi对应的Mapper映射文件(一)下面以创建凭证为实例讲解Mapper映射文件:1.首先sap中创建凭证需要调用函数【BAPI_ACC_DOCUMENT_POST】和【BAPI_TRANSACTION_COMMIT】。
(这个函数需要sap顾问提供名称)2.BAPI_ACC_DOCUMENT_POST函数是具体创建凭证数据的函数3.BAPI_TRANSACTION_COMMIT函数是提交事务的函数4.创建Mapper映射xml文件a)【SAP-DEFINE】为根节点、设置属性namespace.b)c)d)e)f)g)Java调用接口方式a)单一数据源连接方式,默认连接为环境变量配置sap地址b)多sap系统连接方式(如下图),其他调用过程都和a说明一致。
jcofunction的方法
jcofunction的方法JcoFunction方法使用指南JcoFunction是一个用于与SAP系统进行交互的Java类库,它提供了一系列方法来执行RFC(远程函数调用)和BAPI(业务应用程序接口)。
本文将介绍JcoFunction的使用方法,帮助读者快速上手并进行SAP系统的开发工作。
一、JcoFunction的引入在使用JcoFunction之前,首先需要将相应的JAR包引入到项目中。
可以通过Maven或手动引入的方式将JcoFunction的依赖添加到项目的构建文件中。
在引入完成后,就可以开始使用JcoFunction 了。
二、创建JcoFunction对象使用JcoFunction需要先创建一个JcoFunction对象。
可以通过以下代码来实现:```javaJcoFunction jcoFunction = new JcoFunction(functionName);```其中,functionName是要调用的RFC或BAPI的名称。
创建JcoFunction对象后,就可以开始设置参数和执行调用了。
三、设置输入参数在执行RFC或BAPI之前,通常需要设置一些输入参数。
JcoFunction提供了多种设置参数的方法,可以根据参数的类型和需求选择合适的方法进行设置。
例如,如果要设置一个字符串类型的输入参数,可以使用以下代码:```javajcoFunction.setParameter("paramName", "paramValue");```其中,paramName是参数的名称,paramValue是参数的值。
根据实际需要,可以设置多个输入参数。
四、执行调用设置完输入参数后,就可以执行RFC或BAPI的调用了。
JcoFunction提供了两种执行调用的方式:同步调用和异步调用。
1. 同步调用同步调用是指在调用函数时,程序会等待函数执行完毕并返回结果后继续执行。
sap jco原理
sap jco原理SAP JCo(Java Connector)是SAP公司提供的用于连接Java程序与SAP系统进行通信的技术。
它是基于Java Native Interface (JNI)开发的,可以在Java程序中直接调用SAP RFC(Remote Function Call)函数模块,实现与SAP系统的数据交互。
SAP JCo的原理主要包括以下几个方面:1. 连接管理:SAP JCo通过配置连接参数,如SAP系统的主机名、端口号、客户端编号等,建立与SAP系统的连接。
连接参数可以通过配置文件或者程序代码进行设置。
连接建立后,SAP JCo会维护一个连接池,实现连接的复用,提高系统的性能。
2. RFC函数调用:SAP JCo提供了一组API,用于调用SAP系统中的RFC函数模块。
在Java程序中,可以通过指定RFC函数的名称、输入参数和输出参数,直接调用SAP系统中的函数模块。
SAP JCo 会将Java程序传递的参数转换成RFC函数所需的格式,并将RFC 函数的结果返回给Java程序。
3. 事务管理:SAP JCo支持事务的处理。
在Java程序中,可以通过SAP JCo的API开始一个事务、提交一个事务或者回滚一个事务。
事务的处理可以确保数据的一致性和完整性。
4. 异常处理:SAP JCo提供了异常处理机制,可以捕获和处理与SAP系统通信过程中可能出现的各种异常情况,如连接失败、RFC 函数调用失败等。
通过合理地处理异常,可以保证程序的稳定性和可靠性。
5. 数据转换:SAP JCo可以处理不同数据类型之间的转换,如日期、时间、字符串、数字等。
在Java程序与SAP系统之间进行数据交互时,SAP JCo会自动进行数据类型的转换,确保数据的准确性和一致性。
6. 并发处理:SAP JCo支持多线程并发处理。
在Java程序中,可以创建多个线程同时进行与SAP系统的通信,提高系统的并发处理能力。
ABAP发布WEBSERVICE以及JAVA调用
ABAP发布Webservice以及JAVA调用方式ABAP发布Webservice一、输入se37或者se80创建WEBSERVICE二、Webservice创建成功后,输入事务代码SOAMANAGER注意:WINDOWS 中需要配置host 文件三、选择第二个也签中的第一个连接单击Open WSDL document for selected binding连接弹出:WSDL的地址<soap:addresslocation=":8000/sap/bc/srt/rfc/sap/zws_s ervic/300/zws_servic/zws_servic" />LOCATION 或者ACTION后的地址则是外部调用Webservice的地址逻辑端口也用如此方法创建JA V A调用ABAP发布的Webservice1.调用过程中存在问题及解决办法1.1无法利用AXIS2, CXF标准工具解析ECC发布的地址。
解决:利用IE访问Webservice地址,然后将其另存为*.xml文件利用CXF工具,编译该*.xml 文件,生成JAVA类。
输入:wsdl2java -d src - client http://Webservice。
附加:wsdl2java用法:wsdl2java -p com -d src -all aa.wsdl-p 指定其wsdl的命名空间,也就是要生成代码的包名:-d 指定要产生代码所在目录-client 生成客户端测试web service的代码将文件拷贝到程序中。
注意问题:1. 类文件中的包名需要修改,部分定义的-包.类-格式中的包也需要修改.2. 工具生成类的过程中,如果出现重名的情况(例如某类:TEST,但是有其他类应该是test,大小写不区分),一般只会保存一个类,需要手工添加缺少的类(可从其他代码的报错信息看出)。
1.2访问权限问题:访问的权限体现在http的体系中不同的调用方式,拥有不同的设置权限方法,以CXF为例:需要在解析后的**client类中添加代码:Client client = ClientProxy.getClient(port);HTTPConduit http = (HTTPConduit) client.getConduit();AuthorizationPolicy auth = new AuthorizationPolicy();auth.setUserName("gang.xu");auth.setPassword("654321");h ttp.setAuthorization(auth);1.3访问地址:ABAP会发布两种可以访问的WSDL地址;第一种::8000/sap/bc/srt/rfc/sap/ytest_service/300/ytest_service/ytest_service第二种::8000/sap/bc/srt/wsdl/bndg_DF511834C4CA61F1830600221999201E/wsdl11/allinone/ws_policy/document?sap-client=300JAVA解析及调用的是第二种地址;第一种发布出的Webservice服务,具体的方法等信息在第二种体现,2中,也包含了1的地址:<wsdl:service name="service"><wsdl:port name="YTEST_SERVICE" binding="tns:YTEST_SERVICE"><soap:addresslocation=":8000/sap/bc/srt/rfc/sap/ytest_ service/300/ytest_service/ytest_service" /></wsdl:port></wsdl:service>1.4调用方法根据生成的**client类,可以找到方法名,需要传入的参数等信息。
Java(JCo3)与SAP系统相互调用
Java(JCo3)与SAP系统相互调⽤外部系统(Java)调⽤BAPI函数在调⽤BAPI时,SAP为各编程环境(VB、C++、Java等)提供了RFC库及SAP连接器(如Jco、Nco等)。
这些类库中的RFC API封闭了外部系统和SAP的连接细节安装JCo3JCo有32位和64为之分,32位的JVM选择32位的JCO, 64位的JVM选择64位的JCO, 在windows环境,选择相应的sapjco3.dll, Unix和Linux环境选择合适的sapjco3.so解压后将sapjco3.dll拷贝到c:/windows/system32与C:\Program Files (x86)\Java\jdk1.7.0_51\bin下,将sapjco3.jar加⼊项⽬的classpath中。
测试安装成功与否,很简单,打开⼀个命令:/sapjco3.jar或者java -cp C:/sapjco3.jar com.sap.conn.jco.rt.About创建JCo3连接JCo连接到SAP服务器有两种⽅法,分别是直连和通过连接池进⾏连接。
其差别在于,打开直连连接后可以⼀直保持连接;连接池则是在需要时才建⽴连接,连接暂不需要时,将被释放回连接池,再分配给其他⽤户使⽤。
在⽹络服务器应⽤程序⾥,⼀般采⽤连接池进⾏连接SAP服务器。
如果是⽼系统,可能要还注意远程登录⽤户的类型:直连import java.io.File;import java.io.FileOutputStream;import java.util.Properties;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;public class ConnectNoPool {// 直连⽅式,⾮连接池// 连接属性配置⽂件名,名称可以随便取static String ABAP_AS = "ABAP_AS_WITHOUT_POOL";static {Properties connectProperties = new Properties();connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST,"192.168.111.137");connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "800");connectProperties.setProperty(DestinationDataProvider.JCO_USER,"SAPECC");// 注:密码是区分⼤⼩写的,要注意⼤⼩写connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD,"sapecc60");connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "en");// 需要将属性配置保存属性⽂件,该⽂件的⽂件名为 ABAP_AS_WITHOUT_POOL.jcoDestination,// JCoDestinationManager.getDestination()调⽤时会需要该连接配置⽂件,后缀名需要为jcoDestinationcreateDataFile(ABAP_AS, "jcoDestination", connectProperties);}// 基于上⾯设定的属性⽣成连接配置⽂件static void createDataFile(String name, String suffix, Properties properties) {File cfg = new File(name + "." + suffix);if (!cfg.exists()) {try {FileOutputStream fos = new FileOutputStream(cfg, false);properties.store(fos, "for tests only !");fos.close();} catch (Exception e) {e.printStackTrace();}}}public static void connectWithoutPool() throws JCoException {// 到当前类所在⽬录中搜索 ABAP_AS_WITHOUT_POOL.jcoDestination// 属性连接配置⽂件,并根据⽂件中的配置信息来创建连接JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS);// 只需指定⽂件名(不能带扩展名jcoDestination名,会⾃动加上) System.out.println("Attributes:");// 调⽤destination属性时就会发起连接,⼀直等待远程响应System.out.println(destination.getAttributes());}public static void main(String[] args) throws JCoException {connectWithoutPool();}}Attributes:DEST: ABAP_AS_WITHOUT_POOLOWN_HOST: jiangzhengjunPARTNER_HOST: SAPECC6SYSTNR: 00SYSID: ECCCLIENT: 800USER: SAPECCLANGUAGE: EISO_LANGUAGE: ENOWN_CODEPAGE: 4102OWN_CHARSET: UTF16OWN_ENCODING: utf-16OWN_BYTES_PER_CHAR: 2PARTNER_CODEPAGE: 4103PARTNER_CHARSET: UTF16PARTNER_ENCODING: utf-16PARNER_BYTES_PER_CHAR: 2OWN_REL: 720PARTNER_REL: 731PARTNER_TYPE: 3KERNEL_REL: 720TRACE:RFC_ROLE: COWN_TYPE: ECPIC_CONVID: 00000000连接池程序运⾏结果与上⾯直接是⼀样的import java.io.File;import java.io.FileOutputStream;import java.util.Properties;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;public class ConnectPooled {// 连接池static String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";static {Properties connectProperties = new Properties();connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST,"192.168.111.137");connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "800");connectProperties.setProperty(DestinationDataProvider.JCO_USER,"SAPECC");// 注:密码是区分⼤⼩写的,要注意⼤⼩写connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD,"sapecc60");connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "en");// *********连接池⽅式与直接不同的是设置了下⾯两个连接属性// JCO_PEAK_LIMIT - 同时可创建的最⼤活动连接数,0表⽰⽆限制,默认为JCO_POOL_CAPACITY的值// 如果⼩于JCO_POOL_CAPACITY的值,则⾃动设置为该值,在没有设置JCO_POOL_CAPACITY的情况下为0connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,"10");// JCO_POOL_CAPACITY - 空闲连接数,如果为0,则没有连接池效果,默认为1connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);}static void createDataFile(String name, String suffix, Properties properties) {File cfg = new File(name + "." + suffix);if (!cfg.exists()) {try {FileOutputStream fos = new FileOutputStream(cfg, false);properties.store(fos, "for tests only !");fos.close();} catch (Exception e) {e.printStackTrace();}}}public static void connectWithPooled() throws JCoException {JCoDestination destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);System.out.println("Attributes:");System.out.println(destination.getAttributes());}public static void main(String[] args) throws JCoException {connectWithPooled();}}DestinationDataProvider接⼝(不需连接属性配置⽂件)上⾯直接连接、连接池,两种连接⽅法都需要先建⽴⼀个属性配置⽂件,然后JCo再从建⽴好⽂件⾥读取连接到SAP服务器所需要的连接属性,这个⽅法很难在实际的环境中应⽤,存储SAP连接属性配置信息到⼀个⽂件⾥,是⽐较不安全的。
(一)通过JAVA连接SAP(sapjco3.jar在Windows和MacOS上的配置)
(⼀)通过JAVA连接SAP(sapjco3.jar在Windows和MacOS上的配置)(⼀)通过JAVA连接SAP调⽤接⼝ (sapjco3.jar在Windows和MacOS上的配置)⼀、sapjoc3.jar获取由于sap官⽹提供的链接需要合作公司提供账号密码,如果商⽤请索要正确的⽤户名密码下载,如果只是想做测试使⽤,可以使⽤我这⾥提供的链接,资源失效请及时提醒我,谢谢密码:1u0t密码:7zuv密码:lafl⼆、测试项⽬环境准备1. 新建项⽬这个就不多谈了,直接上图,我这⾥新建了⼀个空的测试项⽬,新建lib⽂件夹,准备把需要⽤到的jar包丢进来2. windows和macOS环境配置1. windows直接把 sapjco3.jar sapjco3.dll sapjco3.pdb 拷贝⾄lib下,然后add library把他们都添加进去2. macOS把 sapjco3.jar 和 libsapjco3.jnilib 拷贝⾄lib下,同样add libray添加进去,这⾥只需要add sapjco3.jar 即可。
WARNING: 这⾥很多博客讲到需要添加classpath在变量⾥⾯,这是参照了官⽅提供的安装⽅式,这⾥的话我们只需要将上述⽂件拷贝⾄lib⽂件夹下即可。
三、源码编写及测试⾸先编写⽤来放置sap连接信息的SapConn实体类SapConn/*** Created by gang.xu01@ on 2018/12/6*/public class SapConn {// SAP服务器private String JCO_ASHOST;// SAP系统编号private String JCO_SYSNR;// SAP集团private String JCO_CLIENT;// SAP⽤户名private String JCO_USER;// SAP密码private String JCO_PASSWD;// SAP登录语⾔private String JCO_LANG;// 最⼤连接数private String JCO_POOL_CAPACITY;// 最⼤连接线程private String JCO_PEAK_LIMIT;// SAP ROUTERprivate String JCO_SAPROUTER;public SapConn(String JCO_ASHOST, String JCO_SYSNR, String JCO_CLIENT, String JCO_USER,String JCO_PASSWD, String JCO_LANG, String JCO_POOL_CAPACITY, String JCO_PEAK_LIMIT,String JCO_SAPROUTER) {this.JCO_ASHOST = JCO_ASHOST;this.JCO_SYSNR = JCO_SYSNR;this.JCO_CLIENT = JCO_CLIENT;this.JCO_USER = JCO_USER;this.JCO_PASSWD = JCO_PASSWD;this.JCO_LANG = JCO_LANG;this.JCO_POOL_CAPACITY = JCO_POOL_CAPACITY;this.JCO_PEAK_LIMIT = JCO_PEAK_LIMIT;this.JCO_SAPROUTER = JCO_SAPROUTER;}public SapConn() {}public String getJCO_ASHOST() {return JCO_ASHOST;}public void setJCO_ASHOST(String JCO_ASHOST) {this.JCO_ASHOST = JCO_ASHOST;}public String getJCO_SYSNR() {return JCO_SYSNR;}public void setJCO_SYSNR(String JCO_SYSNR) {this.JCO_SYSNR = JCO_SYSNR;}public String getJCO_CLIENT() {return JCO_CLIENT;}public void setJCO_CLIENT(String JCO_CLIENT) {this.JCO_CLIENT = JCO_CLIENT;}public String getJCO_USER() {return JCO_USER;}public void setJCO_USER(String JCO_USER) {this.JCO_USER = JCO_USER;}public String getJCO_PASSWD() {return JCO_PASSWD;}public void setJCO_PASSWD(String JCO_PASSWD) {this.JCO_PASSWD = JCO_PASSWD;}public String getJCO_LANG() {return JCO_LANG;}public void setJCO_LANG(String JCO_LANG) {this.JCO_LANG = JCO_LANG;}public String getJCO_POOL_CAPACITY() {return JCO_POOL_CAPACITY;}public void setJCO_POOL_CAPACITY(String JCO_POOL_CAPACITY) {this.JCO_POOL_CAPACITY = JCO_POOL_CAPACITY;}public String getJCO_PEAK_LIMIT() {return JCO_PEAK_LIMIT;}public void setJCO_PEAK_LIMIT(String JCO_PEAK_LIMIT) {this.JCO_PEAK_LIMIT = JCO_PEAK_LIMIT;}public String getJCO_SAPROUTER() {return JCO_SAPROUTER;}public void setJCO_SAPROUTER(String JCO_SAPROUTER) {this.JCO_SAPROUTER = JCO_SAPROUTER;}@Overridepublic String toString() {return "SapConn{" +"JCO_ASHOST='" + JCO_ASHOST + '\'' +", JCO_SYSNR='" + JCO_SYSNR + '\'' +", JCO_CLIENT='" + JCO_CLIENT + '\'' +", JCO_USER='" + JCO_USER + '\'' +", JCO_PASSWD='" + JCO_PASSWD + '\'' +", JCO_LANG='" + JCO_LANG + '\'' +", JCO_POOL_CAPACITY='" + JCO_POOL_CAPACITY + '\'' +", JCO_PEAK_LIMIT='" + JCO_PEAK_LIMIT + '\'' +", JCO_SAPROUTER='" + JCO_SAPROUTER + '\'' +'}';}}然后编写⽤来建⽴sap连接的SapConn作为连接类编写连接类SAPConnUtils 下⾯是源码/*** Created by gang.xu01@ on 2018/12/4*/public class SAPConnUtils {private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";/*** 创建SAP接⼝属性⽂件。
SAP系统中RFC技术的基本原理及在企业中的应用
SAP系统中RFC技术的基本原理及在企业中的应用本文主要介绍RFC的基本应用原理及该技术在企业中的应用。
让广大读者了解SAP系统中IDoc、BAPI、WebSerivce等接口技术的基础RFC的基本运行原理,及在企业中的应用。
标签:SAP 系统;RFC;远程功能调用1 引言随着企业的不断发展,对信息化的要求不断提升。
单一的公司主系统(SAP 系统)已经不能够满足部分个性化的需求。
在个性化的子系统中又与公司主系统的数据具有高度的集成关系。
SAP接口技术在各个信息系统之间架起了沟通的桥梁,提高了系统的整合能力。
2 RFC技术的基本原理(1)RFC基础。
RFC是SAP系统之间以及SAP与外部系统之间的通信的基本接口技术。
诸多其他更高层的SAP接口和通信技术(比如BAPI、ALE等)都是基于RFC实现的。
RFC过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有一个必须是SAP ABAP系统。
在SAP中,可以提供给其他系统进行远程调用的程序模块是支持RFC的功能模块。
SAP 提供的外部接口有三种,分别是:程序通信接口(与其他系统进行数据交换的通路);文件I/O接口(与其他系统进行文件数据交换的通路;例如将数据从文件上载到程序中,或将运行时数据下载至文件);数据接口(与数据库的数据交换通路:批输入、SAP SQL)。
RFC位于程序通讯接口中,RFC是基于CPI-C实现的。
而CPI-C是比RFC 更底层的数据交换接口。
1)RFC调用过程。
在系统间通信过程中,需要区分发送系统和接受系统,RFC调用请求从发送系统中传至接收系统(被调用系统,也称为远程系统或目标系统)。
发送请求的系统在通信过程中称为RFC客户端,通信的另一方则称为RFC服务器RFC客户端发起远程功能调用以执行RFC服务器提供的功能调用系统和被调用系统均可以使SAP系统或非SAP系统2)RFC通信的情况。
根据通信方式和系统类型,共有如下3中RFC通信:两个独立的SAP系统之间通信;SAP系统作为调用系统,与外部远程系统(非SAP ABAP系统)通信;外部系统作为调用系统,与SAP系统通信3)SAP接口系统。
jco 关联类型 structure
jco 关联类型structureJCO(Java Connector)关联类型结构是指通过JCO(Java Connector)建立Java应用程序与SAP系统之间的连接时所使用的关联类型。
JCO 关联类型结构是SAP系统和Java应用程序之间进行数据传输和交互的基础。
JCO关联类型结构由以下几个部分组成:1. 关联标识(Association Identifiers):关联标识是用于标识一个JCO关联的唯一标识符。
它由SAP系统和Java应用程序各自维护的标识符组成。
2. 参数列表(Parameter List):参数列表是用于定义JCO关联中传递的参数的类型和格式。
它包括输入参数、输出参数、更改参数等不同类型的参数。
3. 函数模块(Function Module):函数模块是SAP系统中定义的操作或功能的实现。
Java应用程序通过JCO关联调用SAP系统中的函数模块来执行相应的操作。
4. 数据字典(Data Dictionary):数据字典是SAP系统中存储数据元素、表、结构等的数据库。
Java应用程序通过JCO关联访问数据字典中的数据元素来获取或修改数据。
5. 通信协议(Communication Protocol):通信协议是Java应用程序与SAP系统之间进行数据传输和通信的协议。
JCO关联使用SAP 系统的通信协议来确保数据传输的可靠性和安全性。
通过了解JCO关联类型结构,Java应用程序开发人员可以更好地理解如何使用JCO建立与SAP系统的连接,并实现数据的传输和交互。
同时,对于SAP系统开发人员来说,了解JCO关联类型结构也有助于更好地设计和实现SAP系统与Java应用程序之间的集成。
Java调用第三方API指南:实现对外部服务的调用
Java调用第三方API指南:实现对外部服务的调用引言:在当今的软件开发领域,很少有应用程序能够独立运行而不需要与其他服务进行交互。
为了实现更多的功能和提供更好的用户体验,开发人员通常会使用第三方API来调用外部服务。
本文将介绍如何在Java中调用第三方API,以实现对外部服务的调用。
一、了解第三方API在开始调用第三方API之前,我们首先需要了解该API的相关信息。
这包括API的功能、使用方式、请求参数和响应格式等。
通常,第三方API提供商会提供相关的文档和示例代码,供开发人员参考。
我们可以通过查阅官方文档或进行网络搜索来获取这些信息。
二、选择合适的HTTP客户端库在Java中,我们可以使用各种HTTP客户端库来发送HTTP请求和接收响应。
常用的HTTP客户端库包括Apache HttpClient、OkHttp和HttpURLConnection等。
我们需要根据自己的需求选择合适的库。
例如,如果我们需要支持异步请求和响应,可以选择OkHttp;如果我们需要更多的自定义选项,可以选择Apache HttpClient。
三、构建HTTP请求在调用第三方API之前,我们需要构建HTTP请求。
构建HTTP请求包括设置请求方法、URL、请求头和请求体等。
根据第三方API的要求,我们可能需要在请求头中添加认证信息或其他必要的参数。
在构建请求体时,我们需要将请求参数转换为合适的格式,例如JSON或表单数据。
四、发送HTTP请求一旦我们构建好HTTP请求,就可以使用选定的HTTP客户端库发送请求了。
发送请求的过程通常是同步的,但如果使用了支持异步请求的库,我们也可以选择异步发送请求。
在发送请求之前,我们需要确保网络连接正常,并处理可能出现的异常情况。
发送请求后,我们可以获取到服务器返回的HTTP响应。
五、处理HTTP响应在接收到HTTP响应后,我们需要对其进行处理。
首先,我们需要检查响应的状态码,以确定请求是否成功。
2.3.3-通过Java语言进行BAPI调用
2.3.3-通过Java语言进行BAPI调用// 载入所需的类库:import com.sap.rfc.*;import com.sap.rfc.exception.*;import com.ibm.sap.bapi.*;import com.ibm.sap.bapi.generated.*;// 连接SAP系统static private IRfcConnection establishConnection(MiddlewareInfo aMiddlewareInfo) throws JRfcRemoteException{IRfcConnection aConnection = null ;ConnectInfo aConnectInfo = null ;UserInfo aUserInfo = null ;String orbServerName = aMiddlewareInfo.getOrbServerName() ;boolean bAdjusted = true;if (!bAdjusted){throw (new JRfcRfcConnectionException ("Please adjust the Connection-Parameters to your needs!"));}//连接信息:调整为所需要输入的值aConnectInfo = new ConnectInfo (3, // int Rfc模式 3=R/3 or 2=R/2null, // String RFC目标"9.7.12.7", // String 主机名(IP地址)0, // int 系统编号null, // String 网关主机null, // String 网关服务null, // String 系统名null, // String 服务器组名null, // String 消息服务器false, // Boolean 负载平衡选项true); // Boolean 权限检查选项// 用户信息aUserInfo = new UserInfo ("MUSTER", // String 用户名"IDES", // String 密码"800", // String 集团"e", // String 登录语言1103); // int 代码页// Technical conversion for the selected middleware;// 打开连接Open connection:IRfcConnectionFactory aConnectionFactory =FactoryManager.getSingleInstance().getRfcConnectionFacto ry() ;aConnection = aConnectionFactory.createRfcConnection(aConnectInfo, aUserInfo) ;aConnection.open() ;// 返回连接return aConnection ;}// 调用main方法public static void main (/doc/2b7541973.html,ng.String[] args)//通过所指定的中间件设定连接选项{MiddlewareInfo aMiddlewareInfo = new MiddlewareInfo(args) ;FactoryManager aFactoryManager = FactoryManager.getSingleInstance() ;aFactoryManager.setMiddlewareInfo(aMiddlewareInfo) ;//初始化连接连接对象IRfcConnection aConnection = null ;try{aConnection = establishConnection(aMiddlewareInfo) ;}catch (Exception ex){System.out.println("ERROR : Could not create connection : " + ex) ;System.exit(-1) ;}System.out.println("Connection established.");// --- 测试代码段开始 --------------------------------------try{printList(aConnection) ;//调用BAPI://为业务对象CompanyCode声明一个IDobjectId = CompanyCode.getEmptyObjectId() ;//为ID赋值objectId.getKeyField("COMPANYCODEID").setString("1000") ;//通过该ID初始化CompanyCode对象companyCode = new CompanyCode(objectId) ;System.out.println ("Successfully created new CompanyCode : '" + companyCode + "'") ;printDetails(companyCode, aConnection) ;}// --- 测试代码段结束 ----------------------------------------catch (Exception ex){System.out.println ("Unexpected exception occurred:");System.out.println (ex);}}private static void printDetails(CompanyCode companyCode, IRfcConnection connection){try{// 声明BAPI CompanyCode.GetDetail中的参数CompanyCodeGetdetailParams aCompanyCodeGetdetailParams = new CompanyCodeGetdetailParams() ;// 调用BAPI CompanyCode.GetDetailcompanyCode.getdetail(connection, aCompanyCodeGetdetailParams);// 将参数对象分解为独立组件// 获取结构类型参数Bapi0002_2Structure struct = aCompanyCodeGetdetailParams.getCompanycodeDetail() ;System.out.println ("The details of the companycode are : ") ;// 将结构分解为各个独立字段System.out.println ("CompCode : '" + struct.getCompCode() + "'");System.out.println ("CompName : '" + struct.getCompName() + "'");System.out.println ("City1 : '" + struct.getCity() + "'");System.out.println ("Country1 : '" + struct.getCountry() + "'");System.out.println ("Currency : '" + struct.getCurrency() + "'");System.out.println ("Langu1 : '" + struct.getLangu() + "'");System.out.println ("ChrtAccts : '" + struct.getChrtAccts() + "'");System.out.println ("FyVariant : '" + struct.getFyVariant() + "'");System.out.println ("VatRegNo : '" + struct.getVatRegNo() + "'");System.out.println ("Company : '" + struct.getCompany() + "'");System.out.println ("AddrNo : '" + struct.getAddrNo() + "'");System.out.println() ;}catch (Exception ex){System.out.println("Exception in printDetails() : " + ex) ;}return;}private static void printList(IRfcConnection connection){try{//Declaring the parameter object:CompanyCodeGetlistParams aCompanyCodeGetlistParams = new CompanyCodeGetlistParams() ;//实际BAPI调用CompanyCode.getlist(connection, aCompanyCodeGetlistParams);//将参数类型分解为独立组件表Bapi0002_1Table table = aCompanyCodeGetlistParams.getCompanycodeList();int rowCount = table.getRowCount() ;System.out.println ("Returned table has " + rowCount + " lines.");//逐行处理BAPI返回的表for (int i = 0; i < rowCount; i++){Bapi0002_1TableRow row = table.getRow(i) ;System.out.println("\t" + row.getCompCode() + "\t" + row.getCompName()) ;}System.out.println() ;}catch (Exception ex){System.out.println("Exception in printList() : " + ex) ;}return;}。
Java使用JCO远程调用SAP
Linux下连Java连sap步骤1)解压zip文件,将其中librfccm.so、libsapjcorfc.so两个文件,拷贝复制到$JA V A_HOME/jre/lib/i386/server,并将sapjco.jar复制到特定目录下,然后设置CLASSPATH 变量即可,本案export CLASSPATH=.:/usr/java/jdk1.5.0_16/lib:/usr/java/jdk1.5.0_16/jre/lib:/usr/wuxq/sapjco.jar2)在进行sap rfc连接的时候,需要libstdc++-libc6.2-2.so.3库文件将libstdc++-libc6.2-2.so.3库文件复制到librfccm.so、libsapjcorfc.so文件所在的目录即可;3) 将librfccm.so、libsapjcorfc.so、libstdc++-libc6.2-2.so.3 文件拷贝到/usr/lib/下4)至此,已经完成jco在linux下的安装,下一步工作就是写一个测试用例,本案调用了一个sap的RFC函数,该函数传如一个字符串参数,返回一个整形值;·创建JCO.Client,并连接public boolean connect(){boolean rtn = false;try{client = JCO.createClient(sid, username,password,language,host,系统编号);//sid-集团号;language-ZH,EN等;系统编号-00等client.connect();rtn = true;}catch(Exception e){e.printStackTrace();}return rtn;}·创建RFC函数public JCO.Function createFunction(String name) throws Exception { try {JCO.Repository mRepository;mRepository = new JCO.Repository("ARAsoft", client);IFunctionTemplate ft = mRepository.getFunctionTemplate(name.toUpperCase());if (ft == null)return null;return ft.getFunction();} catch (Exception ex) {throw new Exception("Problem retrieving JCO.Function object.");}}·置传入参数、调用函数、返回值处理public int ZSD_CALCULATE_VBELN_SO() throws Exception{JCO.Function function = createFunction("ZSD_CALCULATE_VBELN_SO");//设置参数JCO.ParameterList input = function.getImportParameterList();input.setValue("0020100306", "VGBEL");//执行函数client.execute(function);//返回结果处理JCO.ParameterList output = function.getExportParameterList();int num = output.getInt("NUMS");return num;}·断开连接public void disConnect(){client.disconnect();}5)编译运行JcoTest类,可以得到返回结果1,与在sap/r3中执行函数ZSD_CALCULATE_VBELN_SO,返回结果一致。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JCo–在Java中调用ABAP服务作者:CNET科技资讯网2008-05-09 12:10:31关键词:SAP Java概述SAP的R/3系统与Java平台一样有着许多类似的技术理念,以及同样广泛的企业级用户,但是它们完全是两个不同的世界。
当用户面临流程或者数据整合方面的需求的时候,就迫切需要一种高效的方式,在R/3系统和Java平台之间实时地交换数据。
基于这样的需求,SAP 提供了一套高效的基于RFC的ABAP和Java进程间通讯组件:SAP Java Connector(JCo)。
本文将介绍JCo组件的架构,配置,基本使用方法以及调试,同时还将讨论如何对RFC方式调用的ABAP函数进行远程调试。
JCo库提供了可以直接在Java程序中使用的API。
该API通过JNI调用部署在客户端的SAP 的RFC库。
该RFC库是用C语言实现的,并且与JCo库相互独立发布。
但是,在下载的JCo 库压缩包中也会提供。
该组件支持Inbound(在Java代码中调用ABAP函数)和Outbound(在ABAP代码中调用Java)两种模式。
本文只专注于介绍Inbound模式中,如何在Java代码远程调用ABAP函数。
安装与配置最新版本的JCo库可以在如下网址下载(请选择适合你的软件和硬件平台的版本,本文的示例都基于32位Windows操作系统):/connectors你可能需要提供SAP Service MarketPlace的用户帐号。
解压缩以后,将名为librfc32.dll的文件复制到目录system32下面。
如果该文件已经存在,则覆盖它。
这个文件就是SAP的RFC协议实现,可以在/connectors下载其最新版本。
然后,确保CLASSPATH环境变量中包含文件sapjco.jar所在的目录。
因为这个JAR包中含有在Java程序中需要直接调用的类和接口。
下载的压缩包中还包含了JavaDoc,文档以及示例程序供参考。
建立连接在执行任何操作之前,必须先建立到SAP系统的连接。
本文示例使用的用户名是“DDIC”,登录密码是“minisap”类JCO是Jco库中最主要的一个入口,它提供了许多静态方法。
其中有一系列重载的createClient方法可以用来创建与SAP系统的连接信息。
这些信息都保存在返回的JCO.Client 类的实例中。
常用的两种方式如下:直接输入参数:JCO.Client myConnection = JCO.createClient("000", "DDIC", "minisap", "EN", "10.0.0.11", "00");方法2:使用Java Properties:Properties logonProperties = newProperties(); logonProperties.put("jco.client.ashost","10.0.0.11"); logonPr operties.put("jco.client.client","000"); logonProperties.put("jco.client.passwd","mi nisap"); logonProperties.put("jco.client.sysnr","00"); logonProperties.put(" er","DDIC");JCO.Client myConnection = JCO.createClient( logonProperties ).第一种方式比较简单,所有的参数都直接写在代码中。
相比之下,第二种方式使用Java Properties,它好处在于,除了硬编码这种方式之外,用户也可以将连接信息保存在一个单独的.properties文件中。
这样即使连接信息改变也无需改变代码,只需要修改.properties文件中的数据即可。
关于.properties文件的用法,请参考相关的Java语言教程。
JCO.Client提供方法connect方法来建立从当前Java进程到SAP服务器的连接。
this.myConnection.connect();可以使用isAlive方法来获取一个连接的状态,还可以使用disconnect方法来关闭一个连接:if ( myConnection != null && myConnection.isAlive())很多情况下,频繁创建新的连接可能导致严重的性能问题。
典型的情况就是在Web应用程序中,如果每个session创建一个连接,那么用户数量很多的时候系对系统来说就是一场灾难。
JCo库支持以连接池的形式重用已创建的连接。
只需要调用JCO类的静态方法addClientPool即可创建一个连接池,并且可以在参数中指定连接池的名字和允许同时激活的最大连接数。
如下代码演示了如何创建一个名为“Sample_Pool”的JCo连接池:public static final String POOL_NAME = "Sample_Pool";public static final int max_connection = 2;……JCO.Pool pool = JCO.getClientPoolManager().getPool(POOL_NAME);if (pool == null) {Properties logonProperties = new Properties();logonProperties.put("jco.client.ashost","10.0.0.11"); logonProperties.put("jco.client .client","000"); logonProperties.put("jco.client.passwd","minisap"); logonP roperties.put("jco.client.sysnr","00"); logonProperties.put("er","DDIC" );JCO.addClientPool( POOL_NAME, // pool namemax_connection, // max num of connections,logonProperties); // properties}创建好连接池之后,可以通过如下代码来从连接池中获取一个连接:mConnection = JCO.getClient(POOL_NAME);在连接使用完毕之后,不要忘记使用releaseClient方法释放当前连接:JCO.releaseClient( myConnection ).如果需要移除连接池,则可以使用如下代码:JCO.removeClientPool(POOL_NAME);移除连接池将导致其中所有的活动连接被强行关闭,所以必须在确保连接池中所有的连接都不再被使用的时候才能执行该操作。
调用Function Modules为了演示如何使用JCo库来调用远程的ABAP函数,本文示例中使用NetWeaver ABAP试用版系统中的一个样例函数BAPI_FLIGHT_GETLIST。
JCo库使用RFC的方式来调用ABAP中的函数,所以被调用的函数必须已经勾选“Remot e-enabled”属性。
调用一个函数之前,需要知道函数的元数据,比如函数名字,输入输出参数等等。
在JCo 库中,必须通过类JCO.Repository来获取所有的ABAP函数的元数据,所以第一步是创建一个JCO.Repository类的对象:JCO.Repository myRepository = new JCO.Repository("Repository", myConnection);JCO.Repository类的构造函数有两个参数,第一个是可以任意指定的名字,第二个是当前使用的连接。
此处也可以直接指定一个连接池的名字,JCo库将自动从该连接池中获取连接。
此时,必须保证该连接使用的用户名在目标SAP服务器上有足够的权限。
获得JCO.Repository类的实例之后,就可以通过该实例来获得函数的信息。
如下代码演示了如何获取函数BAPI_FLIGHT_GETLIST的信息以及如何设置简单类型的参数:String strFunc = "BAPI_FLIGHT_GETLIST";IFunctionTemplate ft = myRepository.getFunctionTemplate(strFunc.toUpperCase()); JCO.Function funGetList = ft.getFunction();// set up scalar parameterJCO.ParameterList input = funGetList.getImportParameterList();input.setValue(10, "MAX_ROWS");JCO.Function对象提供了对应的方法来获取ABAP函数的参数列表。
例如,上例中的getImportParameterList方法返回该函数的Import参数列表。
在上面的示例代码中,仅仅设置了一个最简单的int类型的参数。
事实上,setValue方法有许多重载形式,允许设置各种复杂类型的参数,比如structure类型和table类型的参数。
而且,除了通过参数名字引用要设置的参数之外,还可以通过参数的索引来引用一个参数。
在设置structure和table类型的参数之前,需要通过JCO.Function对象的方法获取相应的JCO.Structure和JCO.Table对象,然后才可以使用对每个字段进行赋值。
在我们使用的函数BAPI_FLIGHT_GETLIST中,Import参数中的DESTINATION_FROM是一个structure,其中包含一个CITY字段。
如下代码演示了如何将CITY字段赋值为“NEW YORK”:// set up structure parameterJCO.Structure sFrom = input.getStructure("DESTINATION_FROM");sFrom.setValue("NEW YORK", "CITY");input.setValue(sFrom, "DESTINATION_FROM");类似地,可以使用JCO.Function对象的getTableParameterList方法拿到Table参数列表。