-
linux 命令是 的sap_Linux下如何Java连SAP
2020-12-23 14:29:33Linux下Java如何连SAP本文档测试环境:1)Linux操作系统版本:RedHatEnterpriseLinuxServerrelease52.6.18-8.el52)jdk版本1.5.0_16Linux下连Java连sap步骤1)下载sapjco.jar请到service.sap.com/connectors,下载sap...Linux
下
Java
如何连
SAP
本文档测试环境:
1
)
Linux
操作系统版本:
Red Hat Enterprise Linux Server release 5
2.6.18-8.el5
2
)
jdk
版本
1.5.0_16
Linux
下连
Java
连
sap
步骤
1
)下载
sapjco.jar
请到
service.sap.com/connectors
,
下载
sapjco.jar
,
本案下载的是
sapjco-linuxintel-2.1.8.zip
2
)
解
压
zip
文
件
,
将
其
中
librfccm.so
、
libsapjcorfc.so
两
个
文
件
,
拷
贝
复
制
到
$JA
V
A_HOME/jre/lib/i386/server
,
并将
sapjco.jar
复制到特定目录下,
然后设置
CLASSPA
TH
变
量
即
可
,
本
案
export
CLASSPA
TH=.:/usr/java/jdk1.5.0_16/lib:/usr/java/jdk1.5.0_16/jre/lib:/usr/wuxq/sapjco.jar
3
)在进行
sap
rfc
连接的时候,需要
libstdc++-libc6.2-2.so.3
库文件,可从
csdn
上下载,
-
java调用SAP WebService服务
2020-02-27 11:25:17调用SAP WebService服务需要转换操作 1、通过浏览器访问SAP WebService地址,进行验证并生成wsdl文件 地址并不是可以直接转化的wsdl: 直接访问地址并进行验证后: 另存文件wsdl 2、通过Idea生成java可执行... -
JAVA对接SAP接口使用sapjco3的见解
2019-05-10 10:35:16SAP JCo3.0是Java语言与ABAP语言双向通讯的中间件。与之前1.0/2.0相比,是重新设计的产品。API和架构设计与NCo3.0比较类似,前面也说过,NCo3.0的设计参考了JCo3.0。从本篇开始,系统介绍JCo3.0编程的技术要点。 JCo...参考了作者zfswff的资料
SAP
JCo3.0是Java语言与ABAP语言双向通讯的中间件。与之前1.0/2.0相比,是重新设计的产品。API和架构设计与NCo3.0比较类似,前面也说过,NCo3.0的设计参考了JCo3.0。从本篇开始,系统介绍JCo3.0编程的技术要点。
JCo3.0 安装
下载JCo3.0,注意下载的时候根据操作系统和JVM版本(32位还是64)选择不同的版本。安装就是解压,将文件解压到目标文件夹。以Windows系统为例,主要的文件包括:
sapjco3.dll
sapjco3.jarSAP强烈推荐将这两个文件放在同一文件夹下。
测试安装是否成功,可以在命令窗口下,进入安装文件夹,运行下面的命令:
java -jar sapjco3.jarJCoDestination
JCoDestination代表后台SAP系统,程序员不用关心与SAP的连接,jco3.0运行时环境负责管理连接和释放连接。我们先以一个简单的例子看看jco3.0 JCoDestination类的一些要点。
我使用的编程环境是Eclipse,环境准备如下:
-
新建一个spring boot项目,项目名为JCo3Demo。
-
将sapjco3.jar加入到项目的resources下lib(新建)中。注意前面所说的sapjco3.jar和sapjco3.dll(不需要build path)要放在同一个文件夹下。
-
创建实体类SapConn用来存储对接的SAP系统的连接参数,
代码
如下:// 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 ROUTER private 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; } @Override public 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 + '\'' + '}'; }
-
获取 JCoDestination 的工具类,通过
new SAPConnUtils().jCoDestination
创建链接并获取JCoDestination类,并且项目根目录下会生成配置文件ABAP_AS_WITH_POOL.jcoDestination
,之后可以使用jCoDestination= JCoDestinationManager.getDestination("ABAP_AS_WITH_POOL");
获取private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL"; public JCoDestination jCoDestination; public SAPConnUtils(){ SapConn con = new SapConn( "xxxxx", "00", "300", "xxx", "xxxxx", "zh", "30", "150", "xxxxxxxxx" ); jCoDestination = connect(con); } /** * 创建SAP接口属性文件。 * @param name ABAP管道名称 * @param suffix 属性文件后缀 * @param properties 属性文件内容 */ private static void createDataFile(String name, String suffix, Properties properties){ File cfg = new File(name+"."+suffix); if(cfg.exists()){ cfg.deleteOnExit(); } try{ FileOutputStream fos = new FileOutputStream(cfg, false); properties.store(fos, "for tests only !"); fos.close(); }catch (Exception e){ System.out.println("Create Data file fault, error msg: " + e.toString()); throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e); } } /** * 初始化SAP连接 */ private static void initProperties(SapConn sapConn) { Properties connectProperties = new Properties(); // SAP服务器 connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, sapConn.getJCO_ASHOST()); // SAP系统编号 connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, sapConn.getJCO_SYSNR()); // SAP集团 connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, sapConn.getJCO_CLIENT()); // SAP用户名 connectProperties.setProperty(DestinationDataProvider.JCO_USER, sapConn.getJCO_USER()); // SAP密码 connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, sapConn.getJCO_PASSWD()); // SAP登录语言 connectProperties.setProperty(DestinationDataProvider.JCO_LANG, sapConn.getJCO_LANG()); // 最大连接数 connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, sapConn.getJCO_POOL_CAPACITY()); // 最大连接线程 connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, sapConn.getJCO_PEAK_LIMIT()); // SAP ROUTER connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, sapConn.getJCO_SAPROUTER()); createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties); } /** * 获取SAP连接 * @return SAP连接对象 */ public static JCoDestination connect(SapConn sapConn){ System.out.println("正在连接至SAP..."); JCoDestination destination = null; initProperties(sapConn); try { destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED); destination.ping(); System.out.println("已成功建立sap的连接"); } catch (JCoException e) { System.out.println("Connect SAP fault, error msg: " + e.toString()); } return destination; }
}
JCo3.0调用SAP函数的过程
大致可以总结为以下步骤:
- 连接至SAP系统(参考上面3和4步骤)
- 创建JcoFunction接口的实例(这个实例代表SAP系统中相关函数)
- 设置importing参数
- 调用函数
- 从exporting参数或者table参数获取数据
JCoFunction接口说明
-
JCoFunction是一个接口,代表SAP系统的函数
-
JCoFunction包含importing参数,exporting参数,changing参数,table参数。分别使用getImportParameterList方法,getExportParameterList方法,getChangingParameterList方法和getTableParameterList获得。这些方法的返回值都是JCoParameter类型
-
JCoFunction.execute方法实际执行函数
如何创建JCoFunction对象
- 上面的代码是第一种创建JCoFunction实例的方法,
BAPI_COMPANYCODE_GETDETAIL
为调用函数名:
JCoRepository repository = dest.getRepository(); JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
- 如果我们不关心JCoRepository,也可以这样写:
JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
- 第三种方法是使用JCoFunctionTemplate.getFunction方法,JCoFunctionTemplate也是一个接口,代表SAP函数的meta-data。
JCoFunctionTemplate fmTemplate= dest.getRepository().getFunctionTemplate("BAPI_COMPANYCODE_GETDETAIL"); JCoFunction fm = fmTemplate.getFunction();
设置importing参数
//调用function函数 function = jCoDestination.getRepository().getFunction("调用函数名"); //ParamKey为的参数名,以逗号隔开,ParamValue为参数名对应的参数值, if("".equals(ParamKey) || "".equals(ParamValue)) { // 不需要参数 }else{ String[] paramKeys = ParamKey.split(","); String[] paramValues = ParamValue.split(","); for (int i = 0; i < paramKeys.length; i++) { function.getImportParameterList().setValue(paramKeys[i], "null".equals(paramValues[i]) ? "" : paramValues[i]); } } function.execute(jCoDestination);//提交
设置exporting参数,获取结果
Integer retCode=function.getExportParameterList().getInt("RET_CODE");
设置table参数
Table参数作为export parameter
JCo中,与表参数相关的两个接口是JCoTable和JCoRecordMetaDta, JCoTable就是RFM中tabl参数,而JCoRecordMetaDta是JCoTable或JCoStructure的元数据。
//ET_LOG为table名 JCoTable jcoTable=function.getTableParameterList().getTable("表名"); //要点说明:对JCoTable,输出表头和行项目。 //表头通过获取JCoTable的JCoRecordMetaData,然后使用JCoRecordMetaData的getName()方法 JCoRecordMetaData tableMeta = jcoTable.getRecordMetaData(); for(int i = 0; i < tableMeta.getFieldCount(); i++){ System.out.print(String.format("%s\t", tableMeta.getName(i))); } System.out.println(); // new line //获取表体 //JCoTable每一行都是一个JCoStructure,可以通过setRow()设置指针的位置,然后再遍历各个field: for(int i = 0; i < jcoTable.getNumRows(); i++){ // Sets the row pointer to the specified position(beginning from zero) jcoTable.setRow(i);//每次一张表 // Each line is of type JCoStructure for(JCoField fld : jcoTable){ System.out.println(String.format("%s\t%s",fld.getName(),fld.getString())); } System.out.println(); }
Table参数作为import parameter
table作为输入参数,主要解决填充table的问题,基本模式如下:
someTable.appendRow();
someTable.setValue("FLDNAME", someValue);
以RFC_READ_TABLE为例,读取表./** * Shows how to process JCoTable (as importing) */ JCoFunction fm = dest.getRepository().getFunction("RFC_READ_TABLE"); // table we want to query is USR04 // which is user authorization table in SAP fm.getImportParameterList().setValue("QUERY_TABLE", "USR04"); // output data will be delimited by comma fm.getImportParameterList().setValue("DELIMITER", ","); // processing table parameters JCoTable options = fm.getTableParameterList().getTable("OPTIONS"); // modification date >= 2012.01.01 and <= 2015.12.31 options.appendRow(); options.setValue("TEXT", "MODDA GE '20120101' "); options.appendRow(); options.setValue("TEXT", "AND MODDA LE '20151231' "); // We only care about fields of [user id] and [modification date] String[] outputFields = new String[] {"BNAME", "MODDA"}; JCoTable fields = fm.getTableParameterList().getTable("FIELDS"); int count = outputFields.length; fields.appendRows(count); for (int i = 0; i < count; i++){ fields.setRow(i); fields.setValue("FIELDNAME", outputFields[i]); } fm.execute(dest); JCoTable data = fm.getTableParameterList().getTable("DATA"); return data;
在代码中我们使用了两种方法来插入table的行项目,第一种方法:
JCoTable options = fm.getTableParameterList().getTable("OPTIONS"); // modification date >= 2012.01.01 and <= 2015.12.31 options.appendRow(); options.setValue("TEXT", "MODDA GE '20120101' "); options.appendRow(); options.setValue("TEXT", "AND MODDA LE '20151231' ");
第二种方法:
String[] outputFields = new String[] {"BNAME", "MODDA"}; JCoTable fields = fm.getTableParameterList().getTable("FIELDS"); int count = outputFields.length; fields.appendRows(count); for (int i = 0; i < count; i++){ fields.setRow(i); fields.setValue("FIELDNAME", outputFields[i]); }
JCoTable重要方法总结
sapjco3 开发与部署环境设置(以下没验证,网上资料)
windows 环境设置
1. sapjco3.dll 需要与 sapjco3.jar 在同一目录 2. 设置系统环境变量,将sapjco3所在目录加入系统环境变量 3. 根据自己的操作系统版本选择对应的sapjco3包
32位系统
例如:
新建环境变量
变量名: JAVA_SAPJCO
变量值: E:\sapjco3\sapjco3-win32
将新建的 JAVA_SAPJCO 环境变量加入 系统环境变量 Path变量集合中.
%JAVA_SAPJCO%\sapjco3.jar项目部署运行
32位系统 将 sapjco3.dll 加入到c:/windows/system32/目录 或者 将 sapjco3.dll 加入到 JDK/bin 目录下 64位系统 将 sapjco3.dll 加入到c:/windows/SysWOW64/目录 或者 将 sapjco3.dll 加入到 JDK/bin 目录下
部署异常问题
1.问题
异常信息 Can’t load IA 64-bit .dll on a AMD 64-bit platform
项目编译及运行,根据自己的操作系统版本选择对应的sapjco3包
2.问题
报错 java.lang.UnsatisfiedLinkError: no sapjco3 in java.library.path ,
是因为没有找到 sapjco3.dll这个库的路径,安装了JDK的环境中,这个库默认的位置不是在system32下,而是在 JDK/JRE/BIN下面。sapjco3 开发环境设置
1.开发中需要将sapjco3.jar加入到项目的build path中
2.或者将其加入 本地 maven 库mvn install:install-file -DgroupId=org.hibersap -DartifactId=sapjco3 -Dversion=3.0 -Dpackaging=jar -Dfile=E:/sapjco3/sapjco3-win32/sapjco3.jar
用以替换 org.hibersap 加载项下载的文件
<dependency> <groupId>org.hibersap</groupId> <artifactId>sapjco3</artifactId> <version>3.0</version> </dependency>
Linux环境设置
Linux java 环境设置
1.创建目录
mkdir /usr/java
2.把下载的rpm文件copy过去
cp jdk-8u161-linux-x64.rpm /usr/java/
3.进入目录
cd /usr/java
4.添加可执行权限
chmod +x jdk-8u161-linux-x64.rpm
5.执行rpm命令安装
rpm -ivh jdk-8u161-linux-x64.rpm
6.查看是否安装成功
java -version
Linux sapjco3 环境设置
1.解压 sapjco3-linux64 或 sapjco3-linuxintel-3.0.5 当前生产环境 centos_X64_32 系统使用的是 sapjco3-linux64
2.将sapjco3.jar 文件复制至 $JAVA_HOME/lib/sapjco3.jar
3.将 libsapjco3.so 文件复制至 $JAVA_HOME/jre/lib/amd64/server/libsapjco3.so
4.设置环境变量vim /etc/profile //修改文件
JAVA_HOME=/usr/local/java PATH=$PATH:$JAVA_HOME/bin CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/sapjco3.jar JRE_HOME=$JAVA_HOME/jre LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server export JAVA_HOME LD_LIBRARY_PATH PATH
5.刷新配置
source /etc/profile
6.配置本地 hosts 将主机名字映射到IP地址
1.控制台执行 hostname 命令查看计算机名
2.控制台执行 hostname -i 查看本机IP
3.编辑hosts文件 vi /etc/hosts
4.在 /etc/hosts中 加入
192.168.1.10(本机IP) localhost hostname(计算机名)建立 Jco Serever 监听服务时相关设置windows jco 监听设置
进入 %SystemRoot%\System32\drivers\etc 1.修改 services文件,在services文件尾部 将 jco.server.gwserv:sapgw00 属性值 sapgw00 加入 SAP 端口映射 sapdp00 3200/tcp #SAP Server sapgw00 3300/tcp #SAP Gateway 2.修改 hosts文件,在 hosts中 将 jco.server.gwhost:gmdev01 属性值 gmdev01 加入 SAP服务器IP 地址映射 10.86.95.121 gmdev01 3.具体示例 参考项目目录内的 services/hosts 文件
linux jco 监听设置
1.执行 vi /etc/hosts 修改 hosts文件,在 hosts中 将 jco.server.gwhost:gmdev01 属性值 gmdev01 加入 SAP服务器IP 地址映射 10.86.95.121 gmdev01 2.执行 vi /etc/services 修改 services文件,在services文件尾部 将 jco.server.gwserv:sapgw00 属性值 sapgw00 加入 SAP 端口映射 sapdp00 3200/tcp #SAP Server sapgw00 3300/tcp #SAP Gateway
linux 下运行
运行
nohup java -jar test.jar >test.txt &
nohup java -XX:-UseGCOverheadLimit -jar test.jar >SYNC_$(date +%Y%m%d%H%M%S).txt &
查找进程
ps -aux|grep test
结束进程
kill -s 9 “pid”SAP
JCo3.0是Java语言与ABAP语言双向通讯的中间件。与之前1.0/2.0相比,是重新设计的产品。API和架构设计与NCo3.0比较类似,前面也说过,NCo3.0的设计参考了JCo3.0。从本篇开始,系统介绍JCo3.0编程的技术要点。
JCo3.0 安装
下载JCo3.0,注意下载的时候根据操作系统和JVM版本(32位还是64)选择不同的版本。安装就是解压,将文件解压到目标文件夹。以Windows系统为例,主要的文件包括:
sapjco3.dll
sapjco3.jarSAP强烈推荐将这两个文件放在同一文件夹下。
测试安装是否成功,可以在命令窗口下,进入安装文件夹,运行下面的命令:
java -jar sapjco3.jarJCoDestination
JCoDestination代表后台SAP系统,程序员不用关心与SAP的连接,jco3.0运行时环境负责管理连接和释放连接。我们先以一个简单的例子看看jco3.0 JCoDestination类的一些要点。
我使用的编程环境是Eclipse,环境准备如下:
-
新建一个spring boot项目,项目名为JCo3Demo。
-
将sapjco3.jar加入到项目的resources下lib(新建)中。注意前面所说的sapjco3.jar和sapjco3.dll(不需要build path)要放在同一个文件夹下。
-
创建实体类SapConn用来存储对接的SAP系统的连接参数,
代码
如下:// 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 ROUTER private 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; } @Override public 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 + '\'' + '}'; }
-
获取 JCoDestination 的工具类,通过
new SAPConnUtils().jCoDestination
创建链接并获取JCoDestination类,并且项目根目录下会生成配置文件ABAP_AS_WITH_POOL.jcoDestination
private static final String ABAP_AS_POOLED = “ABAP_AS_WITH_POOL”;
public JCoDestination jCoDestination;public SAPConnUtils(){
SapConn con = new SapConn(
“xxxxx”,
“00”,
“300”,
“xxx”,
“xxxxx”,
“zh”,
“30”,
“150”,
“xxxxxxxxx”
);
jCoDestination = connect(con);
}/**
- 创建SAP接口属性文件。
- @param name ABAP管道名称
- @param suffix 属性文件后缀
- @param properties 属性文件内容
*/
private static void createDataFile(String name, String suffix, Properties properties){
File cfg = new File(name+"."+suffix);
if(cfg.exists()){
cfg.deleteOnExit();
}
try{
FileOutputStream fos = new FileOutputStream(cfg, false);
properties.store(fos, “for tests only !”);
fos.close();
}catch (Exception e){
System.out.println("Create Data file fault, error msg: " + e.toString());
throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
}
}
/**
- 初始化SAP连接
*/
private static void initProperties(SapConn sapConn) {
Properties connectProperties = new Properties();
// SAP服务器
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, sapConn.getJCO_ASHOST());
// SAP系统编号
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, sapConn.getJCO_SYSNR());
// SAP集团
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, sapConn.getJCO_CLIENT());
// SAP用户名
connectProperties.setProperty(DestinationDataProvider.JCO_USER, sapConn.getJCO_USER());
// SAP密码
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, sapConn.getJCO_PASSWD());
// SAP登录语言
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, sapConn.getJCO_LANG());
// 最大连接数
connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, sapConn.getJCO_POOL_CAPACITY());
// 最大连接线程
connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, sapConn.getJCO_PEAK_LIMIT());
// SAP ROUTER
connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, sapConn.getJCO_SAPROUTER());createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
}
/**
- 获取SAP连接
- @return SAP连接对象
*/
public static JCoDestination connect(SapConn sapConn){
System.out.println(“正在连接至SAP…”);
JCoDestination destination = null;
initProperties(sapConn);
try {
destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
destination.ping();
System.out.println(“已成功建立sap的连接”);
} catch (JCoException e) {
System.out.println("Connect SAP fault, error msg: " + e.toString());
}
return destination;
}
}
JCo3.0调用SAP函数的过程
大致可以总结为以下步骤:
- 连接至SAP系统(参考上面3和4步骤)
- 创建JcoFunction接口的实例(这个实例代表SAP系统中相关函数)
- 设置importing参数
- 调用函数
- 从exporting参数或者table参数获取数据
JCoFunction接口说明
-
JCoFunction是一个接口,代表SAP系统的函数
-
JCoFunction包含importing参数,exporting参数,changing参数,table参数。分别使用getImportParameterList方法,getExportParameterList方法,getChangingParameterList方法和getTableParameterList获得。这些方法的返回值都是JCoParameter类型
-
JCoFunction.execute方法实际执行函数
如何创建JCoFunction对象
- 上面的代码是第一种创建JCoFunction实例的方法,
BAPI_COMPANYCODE_GETDETAIL
为调用函数名:
JCoRepository repository = dest.getRepository(); JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
- 如果我们不关心JCoRepository,也可以这样写:
JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
- 第三种方法是使用JCoFunctionTemplate.getFunction方法,JCoFunctionTemplate也是一个接口,代表SAP函数的meta-data。
JCoFunctionTemplate fmTemplate= dest.getRepository().getFunctionTemplate("BAPI_COMPANYCODE_GETDETAIL"); JCoFunction fm = fmTemplate.getFunction();
设置importing参数
//调用function函数 function = jCoDestination.getRepository().getFunction("调用函数名"); //ParamKey为的参数名,以逗号隔开,ParamValue为参数名对应的参数值, if("".equals(ParamKey) || "".equals(ParamValue)) { // 不需要参数 }else{ String[] paramKeys = ParamKey.split(","); String[] paramValues = ParamValue.split(","); for (int i = 0; i < paramKeys.length; i++) { function.getImportParameterList().setValue(paramKeys[i], "null".equals(paramValues[i]) ? "" : paramValues[i]); } } function.execute(jCoDestination);//提交
设置exporting参数,获取结果
Integer retCode=function.getExportParameterList().getInt("RET_CODE");
设置table参数
Table参数作为export parameter
JCo中,与表参数相关的两个接口是JCoTable和JCoRecordMetaDta, JCoTable就是RFM中tabl参数,而JCoRecordMetaDta是JCoTable或JCoStructure的元数据。
//ET_LOG为table名
JCoTable jcoTable=function.getTableParameterList().getTable(“表名”);
//要点说明:对JCoTable,输出表头和行项目。
//表头通过获取JCoTable的JCoRecordMetaData,然后使用JCoRecordMetaData的getName()方法
JCoRecordMetaData tableMeta = jcoTable.getRecordMetaData();
for(int i = 0; i < tableMeta.getFieldCount(); i++){
System.out.print(String.format("%s\t", tableMeta.getName(i)));
}
System.out.println(); // new line
//获取表体
//JCoTable每一行都是一个JCoStructure,可以通过setRow()设置指针的位置,然后再遍历各个field:
for(int i = 0; i < jcoTable.getNumRows(); i++){
// Sets the row pointer to the specified position(beginning from zero)
jcoTable.setRow(i);//每次一张表// Each line is of type JCoStructure for(JCoField fld : jcoTable){ System.out.println(String.format("%s\t%s",fld.getName(),fld.getString())); } System.out.println(); }
Table参数作为import parameter
table作为输入参数,主要解决填充table的问题,基本模式如下:
someTable.appendRow();
someTable.setValue("FLDNAME", someValue);
以RFC_READ_TABLE为例,读取表.
/**
* Shows how to process JCoTable (as importing)
*/
JCoFunction fm = dest.getRepository().getFunction(“RFC_READ_TABLE”);// table we want to query is USR04 // which is user authorization table in SAP fm.getImportParameterList().setValue("QUERY_TABLE", "USR04"); // output data will be delimited by comma fm.getImportParameterList().setValue("DELIMITER", ","); // processing table parameters JCoTable options = fm.getTableParameterList().getTable("OPTIONS"); // modification date >= 2012.01.01 and <= 2015.12.31 options.appendRow(); options.setValue("TEXT", "MODDA GE '20120101' "); options.appendRow(); options.setValue("TEXT", "AND MODDA LE '20151231' "); // We only care about fields of [user id] and [modification date] String[] outputFields = new String[] {"BNAME", "MODDA"}; JCoTable fields = fm.getTableParameterList().getTable("FIELDS"); int count = outputFields.length; fields.appendRows(count); for (int i = 0; i < count; i++){ fields.setRow(i); fields.setValue("FIELDNAME", outputFields[i]); } fm.execute(dest); JCoTable data = fm.getTableParameterList().getTable("DATA"); return data; 在代码中我们使用了两种方法来插入table的行项目,第一种方法:
JCoTable options = fm.getTableParameterList().getTable("OPTIONS"); // modification date >= 2012.01.01 and <= 2015.12.31 options.appendRow(); options.setValue("TEXT", "MODDA GE '20120101' "); options.appendRow(); options.setValue("TEXT", "AND MODDA LE '20151231' ");
第二种方法:
String[] outputFields = new String[] {"BNAME", "MODDA"}; JCoTable fields = fm.getTableParameterList().getTable("FIELDS"); int count = outputFields.length; fields.appendRows(count); for (int i = 0; i < count; i++){ fields.setRow(i); fields.setValue("FIELDNAME", outputFields[i]); }
JCoTable重要方法总结
sapjco3 开发与部署环境设置(以下没验证,网上资料)
windows 环境设置
1. sapjco3.dll 需要与 sapjco3.jar 在同一目录 2. 设置系统环境变量,将sapjco3所在目录加入系统环境变量 3. 根据自己的操作系统版本选择对应的sapjco3包
32位系统
例如:
新建环境变量
变量名: JAVA_SAPJCO
变量值: E:\sapjco3\sapjco3-win32
将新建的 JAVA_SAPJCO 环境变量加入 系统环境变量 Path变量集合中.
%JAVA_SAPJCO%\sapjco3.jar项目部署运行
32位系统 将 sapjco3.dll 加入到c:/windows/system32/目录 或者 将 sapjco3.dll 加入到 JDK/bin 目录下 64位系统 将 sapjco3.dll 加入到c:/windows/SysWOW64/目录 或者 将 sapjco3.dll 加入到 JDK/bin 目录下
部署异常问题
1.问题
异常信息 Can’t load IA 64-bit .dll on a AMD 64-bit platform
项目编译及运行,根据自己的操作系统版本选择对应的sapjco3包
2.问题
报错 java.lang.UnsatisfiedLinkError: no sapjco3 in java.library.path ,
是因为没有找到 sapjco3.dll这个库的路径,安装了JDK的环境中,这个库默认的位置不是在system32下,而是在 JDK/JRE/BIN下面。sapjco3 开发环境设置
1.开发中需要将sapjco3.jar加入到项目的build path中
2.或者将其加入 本地 maven 库mvn install:install-file -DgroupId=org.hibersap -DartifactId=sapjco3 -Dversion=3.0 -Dpackaging=jar -Dfile=E:/sapjco3/sapjco3-win32/sapjco3.jar
用以替换 org.hibersap 加载项下载的文件
<dependency> <groupId>org.hibersap</groupId> <artifactId>sapjco3</artifactId> <version>3.0</version> </dependency>
Linux环境设置
Linux java 环境设置
1.创建目录
mkdir /usr/java
2.把下载的rpm文件copy过去
cp jdk-8u161-linux-x64.rpm /usr/java/
3.进入目录
cd /usr/java
4.添加可执行权限
chmod +x jdk-8u161-linux-x64.rpm
5.执行rpm命令安装
rpm -ivh jdk-8u161-linux-x64.rpm
6.查看是否安装成功
java -version
Linux sapjco3 环境设置
1.解压 sapjco3-linux64 或 sapjco3-linuxintel-3.0.5 当前生产环境 centos_X64_32 系统使用的是 sapjco3-linux64
2.将sapjco3.jar 文件复制至 $JAVA_HOME/lib/sapjco3.jar
3.将 libsapjco3.so 文件复制至 $JAVA_HOME/jre/lib/amd64/server/libsapjco3.so
4.设置环境变量vim /etc/profile //修改文件
JAVA_HOME=/usr/local/java PATH=$PATH:$JAVA_HOME/bin CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/sapjco3.jar JRE_HOME=$JAVA_HOME/jre LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server export JAVA_HOME LD_LIBRARY_PATH PATH
5.刷新配置
source /etc/profile
6.配置本地 hosts 将主机名字映射到IP地址
1.控制台执行 hostname 命令查看计算机名
2.控制台执行 hostname -i 查看本机IP
3.编辑hosts文件 vi /etc/hosts
4.在 /etc/hosts中 加入
192.168.1.10(本机IP) localhost hostname(计算机名)建立 Jco Serever 监听服务时相关设置windows jco 监听设置
进入 %SystemRoot%\System32\drivers\etc 1.修改 services文件,在services文件尾部 将 jco.server.gwserv:sapgw00 属性值 sapgw00 加入 SAP 端口映射 sapdp00 3200/tcp #SAP Server sapgw00 3300/tcp #SAP Gateway 2.修改 hosts文件,在 hosts中 将 jco.server.gwhost:gmdev01 属性值 gmdev01 加入 SAP服务器IP 地址映射 10.86.95.121 gmdev01 3.具体示例 参考项目目录内的 services/hosts 文件
linux jco 监听设置
1.执行 vi /etc/hosts 修改 hosts文件,在 hosts中 将 jco.server.gwhost:gmdev01 属性值 gmdev01 加入 SAP服务器IP 地址映射 10.86.95.121 gmdev01 2.执行 vi /etc/services 修改 services文件,在services文件尾部 将 jco.server.gwserv:sapgw00 属性值 sapgw00 加入 SAP 端口映射 sapdp00 3200/tcp #SAP Server sapgw00 3300/tcp #SAP Gateway
linux 下运行
运行
nohup java -jar test.jar >test.txt &
nohup java -XX:-UseGCOverheadLimit -jar test.jar >SYNC_$(date +%Y%m%d%H%M%S).txt &
查找进程
ps -aux|grep test
结束进程
kill -s 9 “pid” -
-
SAP Java Connector 3.0 操作手册
2013-06-14 08:56:47SAP Java Connector 3.0 操作手册(英文) -
SAP-JAVA操作手册
2008-09-03 13:06:00SAP-JAVA;font-family:宋体;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"">操作手册<span lang="EN-US" stySAP-JAVA操作手册
SAP Java Connector(JCo)
JCo是一个高性能的,基于JNI的中间件,它实现了SAP的RFC(Remote Function Call)协议,JCo是Java Connector的简称,实现了基于RFC的BAPI与JAVA接口。通常用于BAPI的外部调用,RFC_enabled FM也可以调用,但一般不常用。
1、JCo的安装
从http://service.sap.com/connectors下载JCo,解压后将librfc32.dll和sapjcorfc.dll拷贝到WINNT/SYSTEM32下,将sapjco.jar加入项目的classpath中。2、与SAP的连接
⑴、JCo支持两种连接方式,direct connections和connection pools。
direct connections:
import com.sap.mw.jco.*;
public TutorialConnect1() {
JCO.Client mConnection;
try {
mConnection = JCO.createClient("001", // SAP client
"", // userid
"****", // password
null, // language
"", // server host name
"00"); // system number mConnection.connect();
mConnection.connect();
} catch (Exception ex) {
}
}
connection pools:
static final String POOL_NAME = "Pool";
public TutorialConnect2() {
JCO.Client mConnection;
try {
JCO.Pool pool = JCO.getClientPoolManager().getPool(POOL_NAME);
if (pool == null) {
OrderedProperties properties = OrderedProperties.load("/logon.properties");
JCO.addClientPool(POOL_NAME, // pool name
5, // maximum number of connections
logonProperties); // properties
}
mConnection = JCO.getClient(POOL_NAME);
} catch (Exception ex) {
} finally { //返回连接到连接池,否则会导致无可用连接
JCO.releaseClient(mConnection);
}
}
logon.properties文件的定义:
jco.client.client=001
jco.client.user=userid
jco.client.passwd=****
jco.client.ashost=hostname
jco.client.sysnr=00
3、对SAP进行操作
SAP中有JCO.Repository对象,包含着SAP的RFM的运行环境元数据。
JCO.Repository mRepository;
mRepository = new JCO.Repository("ARAsoft", mConnection);
构造器中包含两个参数,第一个是一个任意名称,第二个是连接池或JCO.Client对象。
IFunctionTemplate对象包含着某个特定的RFM元数据,JCO.Function则代表着一个包含所有参数的 RFM。它们之间的关系类似Java中Class和Object的关系。
IFunctionTemplate ft = mRepository.getFunctionTemplate("BAPI_SALESORDER_GETLIST");
//ft为空表示没有在SAP发现对应的RFM
if (ft == null) return null;
JCO.Function function = ft.getFunction();
JCO.ParameterList对象包含做Function的输入、输出和表参数。
client = JCO.getClient(SID); //从Pool中取得Client
JCO.ParameterList input = function.getImportParameterList();
//设置参数,参数名为第二个参数,参数值为第一个参数,
input.setValue("0000001200", "CUSTOMER_NUMBER" );
input.setValue( "170", "SALES_ORGANIZATION");
client.execute(function); -
Java連接sap的包
2020-08-08 08:50:29java連接sap的文件,32位64位都有,附有操作說明 java連接sap的文件,32位64位都有,附有操作說明 java連接sap的文件,32位64位都有,附有操作說明 -
java wsimport生成 sap_SAP发布WebService和JAVA互联
2021-02-26 12:24:10原理:SAP通过发布WEBService,java代码去调用,从而控制sap的操作。这一方案可以将sap的业务拿到web或者Android中去。首先SAP发布Webservice这时我们可以看到sap webservice的wsdl文档。注意,我们使用SOAMANAGER... -
(二)通过JAVA调用SAP接口 (增加一二级参数)
2018-12-09 15:05:00(二)通过JAVA调用SAP接口 (增加一二级参数) 一、建立sap连接 请参考我的上一篇博客 JAVA连接SAP 二、测试项目环境准备 在上一篇操作下已经建好的环境后,在上面的基础上新增类即可 三、源码编写及... -
SAP仓库移动操作 JAVA源码
2020-09-02 10:13:53@SAP仓库移动操作 采购入库migo 01 101 调拨入库MB1B 04 311 领料出库 MB1A 03 261 MD04 CO03 工单退料 03 261 加入XSTOB = ‘X’ 使用冲销移动类型标识符 查看库存 MMBE MB51 查询凭证 MB03 GM_CODE GM_Code 01: ... -
Java连接SAP ————JCO 3.0技术详解
2019-04-08 20:06:36SAP的ERP平台很强大,这是毋庸置疑的,它被运用于个个行业领域,也正因如此,所以公司上线SAP后,总需要花费很多时间去培养用户,有时候,在SAP上,用户的操作需求很简单,但在SAP平台上,却不得不进行许多复杂的... -
JAVA 与SAP RFC连接
2009-12-17 22:14:00操作步骤: 1.项目名上右击-->new -->web service client 2.Enter a uri to a wsdl 输入网址:http://服务器地址:8000/sap/bc/soap/wsdl/?services=RFC名称 示例代码: //RFC名称 = Z_RFC_GETLIST Z_RFC_... -
OData入门:OData Java和SAP UI5的几个帖子
2016-05-19 18:19:58中文教程 Web编程学习六:使用Apache olingo将JPA数据库操作转化为RESTful Web Service http://blog.csdn.net/starshus/article/details/22709923中文教程 Web编程学习三: 使用SAPUI5来创建Web应用UI ... -
Linux下Java如何连SAP
2009-10-20 10:45:00本文档测试环境:1)Linux操作系统版本: Red Hat Enterprise Linux Server release 5 2.6.18-8.el52)jdk版本 1.5.0_16 Linux下连Java连sap步骤1)下载sapjco.jar 请到service.sap.com/connectors,下载s -
java修改另存excel_SAP Intelligent Robotic Process Automation操作Excel
2020-12-20 20:20:55今天是鼠年正月十二。这是Jerry鼠年的第11篇文章,也是汪子熙...除了编程语言之外,SAP新发布的SAP Intelligent Robotic Process Automation(简称SAP iRPA),提供了强大的企业级自动化流程解决方案,善加利用,... -
linux java gui_linux下java版本的sapgui中文显示成方块,怎么解决呢?
2021-03-03 16:01:48默认的连接下,中文字符显示是小方块,而操作系统本生的配置以及SAP服务器端的都没有问题,怎么调都没有效果。问题的本质是需要让java的JVM能识别中文字体,需要给JVM安装中文字体。1、copy windows下的fonts目录下... -
SAP写入mysql_使用JDBC操作SAP云平台上的HANA数据库
2021-02-11 09:08:18本文假设您对JDBC(Java Database Connectivity)有最基本的了解。您也可以将其同ADBC(ABAP Database Connectivity)做对比,细节请参考我的博客:ADBC and JDBC这篇文章分为... 开发一个Java应用,部署到SAP云平台上。... -
使用JDBC操作SAP云平台上的HANA数据库
2018-05-19 21:18:48本文假设您对JDBC(Java Database Connectivity)有最基本的了解。您也可以将其同ADBC(ABAP Database Connectivity)做对比,细节请参考我的博客ADBC and JDBC ...开发一个Java应用,部署到SAP云平台上。该J... -
java通过JCO连接SAP学习资料
2008-09-02 11:23:29本资料简要的讲述了java怎样通过jco连接sap,怎样存取数据等,内含基本操作的一些常用例子,是入门的好资料! -
java 通过JCO 连接SAP 求jar包跟操作步骤 求大神
2012-12-10 16:51:05java 通过JCO 连接SAP 求jar包跟操作步骤 求大神 ! java 通过JCO 连接SAP 求jar包跟操作步骤 求大神 ! java 通过JCO 连接SAP 求jar包跟操作步骤 求大神 ! -
J代码调用操作SAP创建
2018-10-29 15:37:13首先在我们自己的maven项目中,提供一个属性配置文件如下图所示,提供SAP足够权限用户的用户名密码等信息然后测试java代码TestNG代码如下 package com.tsmi.hibernate.utils; import org.testng.annotations.Test; ... -
JAVA使用JCO实现调用SAP接口方法
2019-04-08 20:21:351.根据操作系统将sapjco3.dll文件放入C:\Windows\System32目录; 2.在项目中引入sapjco3.jar包; 3.创建DisplaySalesActivity.java类,配置生成连接 public class DisplaySalesActivity { static String ... -
JAVA+FLEX与SAP RFC连接
2009-12-17 22:14:00FLEX炫界面,JAVA做后台服务类,读取操作SAP的数据.用BlazeDs做JAVA+FLEX的通信配置.JAVA:在proxy-config.xml中做如下配置: class="flex.messaging.services.HTTPProxyService"> 100 2 -
java 关联 vb 开发的sap系统的文本框
2014-12-23 02:15:28我用java web 开发了一个成品库库位管理系统 用条码扫描入库 但sap系统得继续使用 就是说得开两个窗口 只扫描一次两个系统在文本框中都要有值 才不会出现两次重复 操作扫描,请各位大神帮忙