rfcv函数实现_JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)...

// 获取RFC返回的字段值

11 JCoParameterList exportParam = function.getExportParameterList();

12 String exParamA = exportParam.getString("field_A");

13 String exParamB = exportParam.getString("field_B");

14 // 遍历RFC返回的表对象

15 JCoTable tb = function.getTableParameterList().getTable("table_name");

16 for (int i = 0; i < tb.getNumRows(); i++) {

17 tb.setRow(i);

18 System.out.println(tb.getString("field01"));

19 System.out.println(tb.getString("field02"));

20 }

21 }

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操作系统):

http://service.sap.com/connectors

你可能需要提供SAP Service MarketPlace的用户帐号。解压缩以后,将名为librfc32.dll的文件复制到目录 system32下面。如果该文件已经存在,则覆盖它。这个文件就是SAP的RFC协议实现,可以在http://service.sap.com/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");

使用Java Properties:

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"); logonProperties.put("jco.client.sysnr","00"); logonProperties.put("jco.client.user","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"); logonProperties.put("jco.client.sysnr","00"); logonProperties.put("jco.client.user","DDIC");

JCO.addClientPool( POOL_NAME, // pool name

max_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中的函数,所以被调用的函数必须已经勾选“Remote-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 parameter

JCO.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 parameter

JCO.Structure sFrom = input.getStructure("DESTINATION_FROM");

sFrom.setValue("NEW YORK", "CITY");

input.setValue(sFrom, "DESTINATION_FROM");

类似地,可以使用JCO.Function对象的getTableParameterList方法拿到Table参数列表。下面的代码演示了如何拿到一个名为DATE_RANGE的Table参数并且为它创建两行:

// set up table parameter

JCO.Table tDateRange = funGetList.getTableParameterList()

.getTable("DATE_RANGE");

tDateRange.appendRow();

tDateRange.setRow(0);

tDateRange.setValue("I", "SIGN");

tDateRange.setValue("EQ", "OPTION");

tDateRange.setValue("20070606", "LOW");

tDateRange.appendRow();

tDateRange.setRow(1);

tDateRange.setValue("I", "SIGN");

tDateRange.setValue("EQ", "OPTION");

tDateRange.setValue("20070704", "LOW");

参数设置完毕之后,可以通过JCO.Client对象的execute方法执行远程调用:

myConnection.execute(funGetList);

获得输出参数的方法与输入参数完全一样。下面的代码演示了如何获取一个包含返回值的Table参数,并且输出它的内容:

// get table results

JCO.Table flights = funGetList.getTableParameterList().getTable(

"FLIGHT_LIST");

for (int i = 0; i < flights.getNumRows(); i++) {

flights.setRow(i);

System.out.println("Airline ["

+ flights.getString("AIRLINE")

+ "] from city "

+ flights.getString("CITYFROM")

+ " to city "

+ flights.getString("CITYTO")

+ ", departure time is "

+ flights.getDate("FLIGHTDATE"));

}

JCO.Structure和JCO.Table都继承自类JCO.Record。JCO.Record对每种类型的参数都提供了对应的get和set方法,并且在运行时自动进行Java数据类型和ABAP数据类型之间的转换。限于篇幅,本文不再详叙,请参考JCo库的JavaDoc文档。

在使用JCo库的过程中,主要有两种类型的异常需要处理:

JCO.AbapException

如果ABAP函数执行过程中出现异常,则在Java进程中会触发该异常。

JCO.ConversionException

当执行参数的get和set方法时,如果在Java类型和ABAP类型之间转换失败,则会触发该异常。

作为一种最佳实践,建议使用try-catch封装使用JCo库进行参数设置和函数调用的代码,处理上述两种异常,并且在finally代码块中,释放当前所使用的连接。

远程调试

一般的情况下,在SAP服务器上通过事务代码SE37可以测试ABAP函数。在保证ABAP函数的正确性之后,Java客户端只需要检查输入输出参数是否正确即可。这时可以利用JCo库为了方便调试而提供的了一个很强大的功能,把所有继承自JCO.Record的类的对象格式化输出到一个指定的HTML文档中。通过这种方式,我们可以检查输入输出参数是否正确。比如如下代码输出前面得到的FLIGHT_LIST参数的内容:

JCO.Table flights = funGetList.getTableParameterList().getTable(

"FLIGHT_LIST");

flights.writeHTML("c:flight_list.html");

更进一步地,通过启动ABAP的远程调试功能,可以像调试普通程序一样调试远程调用的ABAP函数。

要实现远程调试,首先需要在Java代码中,通过调用JCO.Client类或者JCO.Pool类的setAbapDebug方法激活JCo的ABAP调试功能。如下代码演示了如何激活一个连接池的ABAP调试功能:

JCO.Pool pool = JCO.getClientPoolManager().getPool(POOL_NAME);

pool.setAbapDebug(true);

如果一个连接池的ABAP调试功能被激活,那么其中的所有连接的ABAP调试功能都会被激活。使用这样一个连接来调用ABAP函数的时候,SAP系统会自动弹出一个调试器窗口(如下图所示)。当然,前提是客户端机器上已经安装了SAPGUI。

这时候调试器仅仅停留在RFC调用的入口处,而并未进入所调用的ABAP函数。

为了让调试器直接进入ABAP函数,需要在事务代码SE37中为该函数设置一个外部断点(External BreakPoint)。

设置好外部断点之后,还必须通过事务代码SRDEBUG激活远程调试功能。

如果之前没有直接在代码上设置过外部断点的话,也可以直接在SRDEBUG中设置断点所在的Function Module。 要注意的是,在调试结束之前,不要关闭SRDEBUG的窗口,否则系统将会立即关闭远程调试功能。

此时,再执行Java代码,将会发现系统自动打开的DEBUG窗口自动停留在我们所设置的外部断点的位置,而Java进程在调试结束之前将会被挂起。

在ABAP调试器中,可以检查通过RFC协议传过来的参数,以及ABAP程序运行的结果。通过这种方式,可以更清晰地跟踪整个执行过程。

调试结束的时候,不要忘记关闭SRDEBUG的窗口和清除外部断点。

更多资源

限于篇幅,本文只能介绍关于JCo库的基本使用方法。更进一步的技术细节,可以查看JCo库的下载文件中自带的文档。

开发者还可以在如下连接的SAP的在线帮助文档中找到丰富的文档资料和示例程序:

http://help.sap.com/saphelp_nw70/helpdata/EN/6f/1bd5c6a85b11d6b28500508b5d5211/frameset.htm

报错信息

RFC接口调用SAP如果有异常会通过com.sap.mw.jco.JCO$Exception: 抛出异常

在开发中遇到的异常有如下

用户名密码可能是错误或者用户无权限,确认用户,必要时联系SAP负责人,检查用户

(103) RFC_ERROR_LOGON_FAILURE: ##.#####,####

(103) RFC_ERROR_LOGON_FAILURE: Name or password is incorrect (repeat logon)

call信息没有填写完整,检查配置文件各个SAP配置信息是否完整

(101) RFC_ERROR_PROGRAM: Missing R3NAME=... or ASHOST=... in connect_param in RfcOpenEx

ip地址失败:

com.sap.mw.jco.JCO$Exception: (102) RFC_ERROR_COMMUNICATION: Connect to SAP gateway failed

组权限访问 server文件没更新.

(102) RFC_ERROR_COMMUNICATION:Connect to message server failed

C:\WINNT\system32\drivers\etc

端口号错误报错信息:

(103) RFC_ERROR_LOGON_FAILURE: ## 502 ########

超时:

(103) RFC_ERROR_LOGON_FAILURE: Timeout

执行函数,函数的问题

(104) RFC_ERROR_SYSTEM_FAILURE: Error in module RSQL of the database interface.执行函数

(104) RFC_ERROR_SYSTEM_FAILURE: An error occurred when receiving a complex parameter.

(106) JCO_ERROR_RESOURCE: Trying to access row values in a table which does not have any rows yet

返回的表没有值.那个表连第一行都没有,取不到

(106) JCO_ERROR_RESOURCE: Trying to access row values in a table which does not have any rows yet

语法错误

(104) RFC_ERROR_SYSTEM_FAILURE: Syntax error in program SAPMV50A

找不到行

(106) JCO_ERROR_RESOURCE: Trying to access row values in a table which does not ha:ve any rows yet

输入参数不能插入SAP函数输入字段中.

(122) JCO_ERROR_CONVERSION: Integer '4234243' has to many digits at field PO_ITEM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

南京林业大学转计算机专业好转吗,南京林业大学如何转专业

第二部分 录取规则一、我校坚持以高考成绩为主&#xff0c;德、智、体全面衡量&#xff0c;按照公平、公正、公开、择优的录取原则。二、普通类考生&#xff0c;统考成绩达到同批录取控制分数线&#xff0c;学校按照不超过计划数的120%的比例调阅考生档案&#xff0c;根据投档成…

abap 转换成字符串_ABAP--关于字符串String到XString XString to String转换代码

转自http://guanhuaing.iteye.com/blog/1498891代码如下report zrich_0001.data: s type string,h(1) type x,c(1) type c,byte(2) type c,length type i,l_bindata type xstring,l_cntbin TYPE sdokcntbins.FIELD-SYMBOLS: .s This Is A String!.length strlen( s ).* Use W…

如何禁用计算机的服务,如何彻底禁用电脑中的迅雷服务XLservicePlatform

‍有用户发现电脑系统安装了迅雷极速版或迅雷7之后就会出现一项服务XLservicePlatform&#xff0c;不仅默认开机自动启动&#xff0c;而且还占用CPU资源。一般的方法无法将其彻底禁用。对此&#xff0c;我们可以参考接下来提供的方法来彻底禁用电脑中的迅雷服务XLservicePlatfo…

[转载]oracle的表导入导出,表空间,用户名

原文地址&#xff1a;oracle的表导入导出&#xff0c;表空间&#xff0c;用户名作者&#xff1a;不小馨1.查询所有的表空间 select * from dba_data_files; 2.创建表空间 create tablespace 名称 logging datafile D:ORACLEPRODUCT10.2.0ORADATAMYDBtest.dbf size 100M reu…

finereport 格式化金额函数_帆软报表(finereport)常用函数

帆软报表FineReport中数据连接之Websphere配置JNDI连接以oracle9i数据源制作的模板jndi.cpt为例来说明如何在FineReport中的Websphere配置JNDI连接.由于常用服务器的JNDI驱动过大,帆软报表FineReport中没有自带, ...帆软报表FineReport SQLServer数据库连接失败常见解决方案1. …

唐山师范学院计算机二级报名,2017年3月唐山师范学院计算机等级考试报名时间(河北)...

唐山师范学院2017年上半年全国计算机等级考试(以下简称NCRE)将于3月份举行。按照教育部考试中心有关要求&#xff0c;现就报名工作有关事项通知如下&#xff1a;一、考试时间2017年上半年NCRE时间为3月25日-28日。二、报名事项说明(一)报名时间2017年上半年NCRE报名工作于2017年…

android ListView实现下拉上拉刷新功能

android ListView实现下拉上拉刷新功能 主ListView类&#xff1a;package com.carcare.refresh;/*** file XListView.java* package me.maxwin.view* create Mar 18, 2012 6:28:41 PM* author Maxwin* description An ListView support (a) Pull down to refresh, (b) Pull up …

一文简述npm和cnpm和yarn的区别

我是歌谣 放弃很容易 但是坚持一定很酷 前言 在前端的vue的项目中 不免会安装较多的文件依赖 对于常规安装依赖 我知道的方式有两种npm和yarn 1npm 1.1定义 npm: Nodejs下的包管理器。 1.2 安装 安装node环境 直接node官网安装一下 1.3 下载地址 node地址 下载安装好之后…

统计通话次数和时间的软件_通话时间统计app下载|通话时间统计安卓版下载 v1.0.3 - 跑跑车安卓网...

这是一款通话记录APP&#xff0c;用户可通过该软件来查看电话未接来电、通话时长等信息&#xff0c;十分便捷好用&#xff0c;有需要的快来下载使用吧&#xff01;软件介绍本程序用于通话记录、时长显示、分类统计、时段统计等参考。想知道最近你跟某人通了多长时间电话吗&…

idea html ajax,在 IntelliJ IDEA 8.1中编写一个ajax jquery实例,取不到页面上的值

在 IntelliJ IDEA 8.1中编写一个ajax jquery实例&#xff0c;取不到页面上的值0brnm12942014.08.17浏览115次分享举报public class AjaxServlet extends HttpServlet{protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)th…

Vue+Element!一千字带你编写合理的编辑,查看,新建!

我是歌谣 放弃很容易 但是坚持一定很酷 1前言 在我们的日常的开发过程中 不免会遇到需要操作同一页面得情况 2需求 比如一个页面 我们会有一个对应的一个表单 A:姓名:XXXX B&#xff1a;年龄:XXXX C:账号:XXXX D&#xff1a;密码:XXXX E:邮箱:XXXX XXXXXel-formel-input name…

script标签属性用type还是language?

一个网站的建设&#xff0c;经常会用到JavaScript,其中必须用到script标签来外调js文件&#xff0c;但是script标签属性用type还是language&#xff1f; type 和 language 属性都可用来指定 <script> 标签中的脚本的类型。所以可以使用下面两种属性&#xff1a; language…

惊呼!JavaScript基本数据类型和引用数据类型详解

前言 我是歌谣 知其然知其所以然 人人都有一个大厂梦 希望通过自己的一个总结分享可以给予大家带来帮助和提升。 本期知识点 JavaScript中基本数据类型和引用数据类型 目标 理解基本数据类型和引用数据类型的定义理解堆和栈数据类型分为哪些 定义 ECMAScript包括两个不同类型…

计算机的特点 分类及其应用,2016计算机知识:计算机的特点、分类及其应用(1)...

【导读】为了帮助广大考生更好的备考&#xff0c;中公事业单位考试网提供2016年计算机知识《计算机的特点、分类及其应用(1)》&#xff0c;为考生定制计算机基础知识复习计划&#xff0c;相信广大考生可以顺利计算机知识考试。一、第1代&#xff1a;电子管数字计算机(1946-1958…

面向船舶结构健康监测的数据采集与处理系统(一)系统架构

世界贸易快速发展起始于航海时代&#xff0c;而船舶作为重要的水上交通工具&#xff0c;有 其装载量大&#xff0c;运费低廉等优势。但船舶在运营过程中出现的某些结构处应力值 过大问题往往会给运营部门造成重大的损失&#xff0c;甚至造成大量的人员伤亡和严重 的环境污染…

Gunicorn 0.17 发布,Python HTTP 服务器

HTTP 服务器 Gunicorn 0.17 发布了&#xff0c;该版本改进内容包括&#xff1a; 支持绑定多个网卡地址支持 SSL支持 syslog增加 nworkers_changed 钩子为 post_request 钩子增加 response 参数使用 argparse 解析命令行参数&#xff08;废弃 optparse&#xff09;fix PWD detec…

优地机器人厂家_2019中国人工智能机器人企业TOP30榜单发布 优地科技跻身前十...

原标题&#xff1a;2019中国人工智能机器人企业TOP30榜单发布 优地科技跻身前十据2019《互联网周刊》&eNet研究院选择排行&#xff0c;“2019中国的人工智能机器人企业TOP30”榜单新鲜出炉&#xff0c;名单如下&#xff1a;从榜单可以看到&#xff0c;阿里巴巴、新松、百度…