如何实现SAP的RFC函数调用(原创)
连接sap系统需要通过sap javaconnect来连接,对于sapjco.jar系列文件有32位与64位之分【32位用的JAR版本是 2.1.10 (2011-05-10) ,64位用的JAR版本是 2.1.7 (2006-06-12)】。即对jdk有严格要求。现说明客户端32位部署及服务端64位部署两种情况:
一、 我本地是32位,部署本地客户端 sapjco32.zip
a) 将附件相对应位数的librfc32.dll、sapjcorfc.dll、msvcp71.dll、msvcr71.dll四个文件拷贝至system32,其中前两个文件是必须拷贝(后面2个可以不用)。
b) 将相对应位数的sapjco-2.1.7.jar拷贝至对应模块lib下,然后将其部署好。
这里我把它配置到我们的pom.xml里面了,如下:
- 首先把相应的JAR文件放在项目的\WEB-INF\lib目录下面。
2. 在pom.xml里面指向该文件。
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco</artifactId>
<version>2.1.7</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/sapjco-2.1.7.jar</systemPath>
</dependency>
二、 服务器是64位 sapjco64.zip
a) 将附件相对应位数的librfc32.dll、sapjcorfc.dll、msvcp71.dll、msvcr71.dll四个文件拷贝至system32及SysWOW64文件夹下
b) 将相对应位数的sapjco-2.1.10.jar拷贝至服务端的lib下,然后将其部署好。同上。
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco</artifactId>
<version>2.1.10</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/sapjco-2.1.10.jar</systemPath>
</dependency>
如何在JAVA里面调用RFC函数,简单的demo如下:[详细的工具类 SapUtil.java]
package org.jeecgframework.core.util;
import com.sap.mw.jco.IFunctionTemplate;
import com.sap.mw.jco.JCO;
import com.sap.mw.jco.JCO.Structure;
public class SapUtil {
public static double getRate(String rateType, String fromCurrency, String toCurrency, String date) {
JCO.Client client = null;
double rate = 0;
try {
client = addClientPool();
JCO.Function func = getFunction(client, "BAPI_EXCHANGERATE_GETDETAIL");
JCO.ParameterList inputParameterList = func.getImportParameterList();
inputParameterList.getField("RATE_TYPE").setValue(rateType);
inputParameterList.getField("FROM_CURR").setValue(fromCurrency);
inputParameterList.getField("TO_CURRNCY").setValue(toCurrency);
inputParameterList.getField("DATE").setValue(date);
client.execute(func);
JCO.ParameterList outputParameterList = func.getExportParameterList();
Structure rateStructure = outputParameterList.getStructure("EXCH_RATE");
rate = rateStructure.getDouble("EXCH_RATE");
System.out.println(rate);
} catch (JCO.Exception e) {
e.printStackTrace();
} finally {
if (client != null) {
JCO.releaseClient(client);
}
}
return rate;
}
private static JCO.Client addClientPool() {
String client = "800";
String user = "crmuser1";
String password = "CRM1";
String language = "1";
String host = "10.10.1.80"; //正式机
String sysnr = "00";
JCO.Client sapclient = null;
try {
sapclient = JCO.createClient(client, user, password, language, host, sysnr);
sapclient.connect();
} catch (JCO.Exception e) {
throw new RuntimeException("SAP连接错误:" + e.getMessage());
}
return sapclient;
}
private static JCO.Function getFunction(JCO.Client client, String funcName) {
String repositoryName = "repository";
JCO.Function func = null;
try {
JCO.Repository repository = new JCO.Repository(repositoryName, client);
IFunctionTemplate ft = repository.getFunctionTemplate(funcName);
func = ft.getFunction();
} catch (JCO.Exception e) {
e.printStackTrace();
}
return func;
}
public static void main(String[] args) {
getRate("M", "USD", "CNY", "20141001");
getRate("M", "USD", "CNY", "00000000");
getRate("M", "EUR", "CNY", null);
getRate("M", "EUR", "CNY", "20141001");
}
}
PS:可能遇到的问题(都是32位和64位所用文件不一致问题)
java.lang.ExceptionInInitializerError:
JCO.classInitialize(): Could not load middleware layer
'com.sap.mw.jco.rfc.MiddlewareRFC'JCO.nativeInit():
Could not
initialize dynamic link library sapjcorfc
[C:\Windows\System32\sapjcorfc.dll: Can't load AMD 64-bit .dll on a IA
32-bit platform].java.lang.ExceptionInInitializerError:
JCO.classInitialize(): Could not load middleware layer
'com.sap.mw.jco.rfc.MiddlewareRFC'JCO.nativeInit():
Could not
initialize dynamic link library sapjcorfc. Found version "2.1.7
(2006-06-12)" but required version "2.1.10 (2011-05-10)".
如何实现SAP的RFC函数调用(原创)的更多相关文章
- 访问SAP的RFC
.NET 环境Xp(sp3) vs2010, win2003 EN 32bit(sp2)winform,webform 引用sapnco.dll,sapnco_utils.dll(自动引用)配置文件需 ...
- SAP 调用RFC 的时候记录异常报错方式
DATA: lv_error TYPE char100. CALL FUNCTION 'ZRFC_WM_ZEL001' DESTINATION lv_desc EXPORTING process_fl ...
- SAP ABAP RFC接口通用日志工具:abap fm logger
很早之前就想写个能记录函数模块日志的通用工具,最早尝试时,没有想清楚插入代码的体积问题.在一些群友的提醒下,了解到可以用宏来处理这一问题.不过当时比较忙,就没有动笔.最近又想起这件事,花了2天完成了一 ...
- 一个完整的SAP RFC调用接口封装
因为经常需要访问sap操作数据,就封装了一个类方便调用,运行条件需要安装sap客户端,在sap客户端安装之后会带有一个com接口,本接口就通过这个com访问sap,因为com的后期绑定问题故使用了vb ...
- SAP学习日志--RFC REMOTE FUNCTION CALL
RFC Remote function Call 远程功能调用, 是SAP系统之间以及非SAP系统之间程序通信的基本接口技术. 例如BAPI , ALE都是基于RFC实现的 SAP系统提供了三种外部 ...
- C#通过RFC调用SAP
using System;using System.Collections.Generic;using SAP.Middleware.Connector;using System.Data;using ...
- .NET连接SAP系统专题:.NET调用RFC几种方式(一)
本来今天是要写一篇关于NCO3.0的东西,就是关乎.NET调用SAP的RFC的,支持VS2010和.NET 4.0等.现在网上到处都是充斥着NCO1.X和NCO2.0,需要用VS2003来使用,都是一 ...
- 还在写SQL做SAP二开?通过RFC调用NetWeaver,让HANA数据库操作更可靠
相比于从零开始构建全套信息化系统,基于成熟的ERP等行业软件做二次开发是更多中大型企业应对个性化软件需求的首选方案.如何在二开模块中,可靠地对成品软件的数据库进行读写操作,以满足单据自动创建.元数据自 ...
- Java(JCo3)与SAP系统相互调用
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- 设计模式-中介者模式(Mediator)
场景分析: 众所周知,电脑有很多组成部分,如硬盘.内存.光驱.音频.键盘等,各个组件之间协同工作才能保证电脑的正常运行. 如果各个组件之间直接交互,可能会比较复杂,如下图: 将上面的各个组件抽象成类, ...
- centos下网络的基本配置方法讲解
上一篇中我们已经成功安装了我们的centos系统,但是我们可能发现我们安装的centos上不了网,所以这一章我们来说说如何配置centos来连接外网和局域网. 我们首先来认识一下linux下部分网络配 ...
- linu流量监控
iftophttp://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858923.html 默认是监控第一块网卡的流量iftop 监控eth1iftop ...
- wpMVVM模式绑定集合的应用
一.新建一个项目,命名为wpMVVMone,添加一个有关食品信息的类Food.CS,代码如下: public class Food { public string Name { get; set; } ...
- [leetcode]_Pascal's Triangle II
题目:Pascal三角的变形,要求只用O(K)的额外空间. 思路:由于Pascal三角中,tri[n][i] = tri[n - 1][i] + tri[n-1][i-1],(通常情况下) 如果已经获 ...
- Silverlight Color的颜色值
1.MainPage.xaml <UserControl xmlns:SysManage="clr-namespace:Application" x:Class=" ...
- TFS build dotCover StyleCop
FS2010 – Customizing the Build Details View – Summary View http://blogs.msdn.com/b/jpricket/archive/ ...
- Redis监控方案
Redis 监控最直接的方法当然就是使用系统提供的 info 命令来做了,你只需要执行下面一条命令,就能获得 Redis 系统的状态报告. redis-cli info 内存使用 如果 Redis 使 ...
- Java输出1~1000之间所有可以被3整除又可以被5整除的数
主要在于判断是否能被整除,思路是用取余运算符%,取余结果为0就表示能被整除. 代码如下: public class NumDemo { public static void main(String a ...
- Java排序
给出10个数,使用某种排序方法,按照从小到大的顺序输出个个数. 根据要求,首先得给出这10个数,这里的算法需要一个循环,数据结构需要一个长度为10的整型数组.首先用BufferedReader in= ...