SAP发布RFC接口,然后用JAVA调用根据物料号查询物料描述
2017-04-25 15:15
1791 查看
一开始想在SAP里面做接口,然后使用WEBSERVICE发布出来,再由JAVA来调用,但是根据网上的教程发布的WEBSERVICE,不能由SOAMANAGER来访问。于是就退而求其次,不经过WEBSERVICE,直接就用JAVA来访问RFC。
看网上的教程,我先做了一个测试程序,主要目的是测试JAVA和SAP的连接:
1、在SAP中建立了一个函数组,存在本地,再建立了一个函数,该函数有两个输入,一个输出,功能就是把两个输入相加后输出
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/165dfc03f2f81f6552a909b2bbc9588c)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/98b0383050ca45a7a0f645939cc19cb5)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/da40d0a91a825a1a7ba168fe5dd81be0)
源代码:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/0f4c7c53cf9efcd99e20220069d189e9)
保存激活之后,这个RFC就可以进行调用了。
2、接下来进行JAVA端的配置,我是用MYECLIPSE 6,5进行JAVA开发的,链接JAVA和SAP需要用到一个jar包和一个链接库
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/6ef65ca57fe158fa87c1632e903c3418)
将该dll文件放到C盘windows下的SYSWOW64文件夹下(我也放到了system32下面)。
3、打开myeclipse,新建一个JAVA工程
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/e8c6c3dbde150364ba685aa523e79301)
首先把sapjco3.jar这个包引入到工程里面去,
然后就可以写代码了,建立SAP连接的JAVA文件,代码如下
以上是连接SAP的代码,可以进行直接调用,接下来需要访问接口,重新建立一个java文件:
运行结果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/227310baa1cc318bb7491ee1de7fd41a)
上面的例子只是简单的传值,在实际业务中,更多的是使用表来进行数据的交互,下面我来说一个JAVA通过表的操作来进行数据查询的例子:
1、在sap中重新建立一个函数模块:Z_LCQ_WEBSERVICE_TEST,该函数可供远程调用,没有输入输出,只有一个表,具体信息如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/42d50901101bb402f04ea3d697aa4247)
2、ZTYPE_MATNR_TAB结构如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/f2a99785a36ed2d0121043ae4580af48)
3、源代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/4d4d004f8573c0c4d6d68cf5bcbd693e)
源代码就是根据IO_TAB进行遍历,查找每一个物料号对应的物料描述,并且再写到IO_TAB里面去
这样,sap端的工作就完成了,
4、对应于JAVA端,SAPConn.java程序不需要进行任何的改动,直接建立一个JAVA文件,代码如下:
该程序执行结果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/15/6aad6498956e64b03e1881cc74f1d5ba)
在调试的过程中,我出现了JAVA端无论怎么配置都取不到值的情况,后来终于发现,是SAP里面接口写的有问题,后面调整才好的,希望下次不会再犯!
看网上的教程,我先做了一个测试程序,主要目的是测试JAVA和SAP的连接:
1、在SAP中建立了一个函数组,存在本地,再建立了一个函数,该函数有两个输入,一个输出,功能就是把两个输入相加后输出
源代码:
保存激活之后,这个RFC就可以进行调用了。
2、接下来进行JAVA端的配置,我是用MYECLIPSE 6,5进行JAVA开发的,链接JAVA和SAP需要用到一个jar包和一个链接库
将该dll文件放到C盘windows下的SYSWOW64文件夹下(我也放到了system32下面)。
3、打开myeclipse,新建一个JAVA工程
首先把sapjco3.jar这个包引入到工程里面去,
然后就可以写代码了,建立SAP连接的JAVA文件,代码如下
package jco_test; 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; /** * 与SAP连接配置 * @author jay */ public class SA 4000 PConn { private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL"; static{ Properties connectProperties = new Properties(); connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "XXX.XXX.XXX.XXX");//服务器 connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "XX"); //实例编号 connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "800"); //客户端 connectProperties.setProperty(DestinationDataProvider.JCO_USER, "XXXXX"); //SAP用户名 connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "XXXXX"); //密码 connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "zh"); //登录语言 connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); //最大连接数 connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); //最大连接线程 createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties); } /** * 创建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){ throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e); } } /** * 获取SAP连接 * @return SAP连接对象 */ public static JCoDestination connect(){ JCoDestination destination =null; try { destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED); } catch (JCoException e) { } return destination; } }
以上是连接SAP的代码,可以进行直接调用,接下来需要访问接口,重新建立一个java文件:
package jco_test; import com.sap.conn.jco.JCoDestination; import com.sap.conn.jco.JCoFunction; import com.sap.conn.jco.JCoParameterList; import com.sap.conn.jco.JCoTable;
public class MultiFromSAP { public static void main(String[] args) { JCoFunction function = null; JCoDestination destination = SAPConn.connect(); String sum="";//求和 try { //调用Z_WS_TEST函数 function = destination.getRepository().getFunction("Z_LCQ_RFC_TEST"); JCoParameterList input = function.getImportParameterList(); //NUM1 input.setValue("NUM1", "13"); //NUM2 input.setValue("NUM2", "800"); function.execute(destination); sum= function.getExportParameterList().getString("NUM");//调用接口返回值 System.out.println("求和为:" + sum); }catch (Exception e) { e.printStackTrace(); } } }
运行结果如下:
上面的例子只是简单的传值,在实际业务中,更多的是使用表来进行数据的交互,下面我来说一个JAVA通过表的操作来进行数据查询的例子:
1、在sap中重新建立一个函数模块:Z_LCQ_WEBSERVICE_TEST,该函数可供远程调用,没有输入输出,只有一个表,具体信息如下图:
2、ZTYPE_MATNR_TAB结构如下:
3、源代码如下:
源代码就是根据IO_TAB进行遍历,查找每一个物料号对应的物料描述,并且再写到IO_TAB里面去
这样,sap端的工作就完成了,
4、对应于JAVA端,SAPConn.java程序不需要进行任何的改动,直接建立一个JAVA文件,代码如下:
package jco_test; import com.sap.conn.jco.JCoDestination; import com.sap.conn.jco.JCoFunction; import com.sap.conn.jco.JCoParameterList; import com.sap.conn.jco.JCoTable;public class MultiFromSAP {
public static void main(String[] args) {
JCoFunction function = null;
JCoDestination destination = SAPConn.connect();
int sum=0;//求和
String sum1="";
try {
//调用Z_WS_TEST函数
function = destination.getRepository().getFunction("Z_LCQ_WEBSERVICE_TEST");
JCoTable IO_TAB = function.getTableParameterList().getTable("IO_TAB"); //根据函数的表建立了一个表对象
//增加一行
IO_TAB.appendRow();
//传值
IO_TAB.setValue("MATNR","000000000001123800");
//增加一行
IO_TAB.appendRow();
//传值
IO_TAB.setValue("MATNR","000000000001123910");
function.execute(destination);
System.out.println(IO_TAB.getNumRows()); //打印出IO_TAB表里面有多少行数据
for (int i = 0; i < IO_TAB.getNumRows(); i++)
{
IO_TAB.setRow(i);
System.out.println(IO_TAB.getString("MATNR")+" "+IO_TAB.getString("MAKTX"));
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
该程序执行结果如下:
在调试的过程中,我出现了JAVA端无论怎么配置都取不到值的情况,后来终于发现,是SAP里面接口写的有问题,后面调整才好的,希望下次不会再犯!
相关文章推荐
- SAP的RFC接口的发布与JAVA调用
- java调用sap的RFC接口
- 分享一个完整的SAP RFC调用接口封装
- 怎么根据linux c/c++ 开发的d-bus服务生成java 的调用接口文件
- .Net 调用SAP RFC接口来读取数据实战纪实
- SAP接口编程-RFC系列11:C#语言调用RFC
- java调用身份证接口查询
- 分享一个完整的SAP RFC调用接口封装
- Java 调用SAP RFC函数
- PB调用SAP的RFC函数接口
- java中的comparable接口如何根据学生的学号,成绩等多种情况进行定义,然后排序
- Java用axis2调用.net发布的web services接口
- 在 .NET 中调用SAP RFC 接口 VS03和VS08连接SAP
- 一个完整的SAP RFC调用接口封装
- Net 调用SAP RFC接口来读取数据
- 在与sap系统集成时遇到的问题.sap系统发布一webservice,java(xfire)作为客户端调用,调用时抛出如下异常: Wrong Content-Type and empty HTTP-Body received: ("HTTP Code 20
- java 调用SAP RFC函数错误信息集锦
- 调用SAP RFC程序,传入参数后,无法查询出结果--问题分析
- C# 使用 SAP NCO3.0 调用SAP RFC函数接口
- SAP RFC 函数创建 Java程序调用 学习总结 一步一步图文并茂