SAP发布RFC接口,然后用JAVA调用根据物料号查询物料描述
来源:互联网 发布:电脑截图软件推荐 编辑:程序博客网 时间:2024/05/28 16:07
一开始想在SAP里面做接口,然后使用WEBSERVICE发布出来,再由JAVA来调用,但是根据网上的教程发布的WEBSERVICE,不能由SOAMANAGER来访问。于是就退而求其次,不经过WEBSERVICE,直接就用JAVA来访问RFC。
看网上的教程,我先做了一个测试程序,主要目的是测试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 SAPConn { 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里面接口写的有问题,后面调整才好的,希望下次不会再犯!
0 0
- SAP发布RFC接口,然后用JAVA调用根据物料号查询物料描述
- SAP的RFC接口的发布与JAVA调用
- SAP接口开发--关于合同物料号与9位物料码关系接口问题总结
- SAP物料重要描述相关表
- 根据物料号和收货物料凭证,查询对应的序列号
- RFC调用sap接口
- JAVA调用SAP端RFC接口
- java调用sap的RFC接口
- 物料
- C#调用sap rfc 接口
- sap的rfc接口调用
- SAP中几种特殊物料
- SAP特殊物料 (转)
- SAP物料删除标记
- SAP定义物料组
- SAP物料删除标记
- SAP物料组说明
- SAP物料移动类型
- 搭载repo服务器
- jquery select2插件初始化时赋多个值
- maven笔记
- android 6.0权限全面详细分析和解决方案
- 《UNIX操作系统》学习笔记
- SAP发布RFC接口,然后用JAVA调用根据物料号查询物料描述
- POJ 1236 Network of Schools(强连通分量,缩点)
- KEYCODE列表
- c++ set集合的使用方法详解
- 52-打印套接字选项
- 网站页面的底部怎么样设计才最合理,最合适seo优化
- 安装cx_Oracle报错:unable to find vcvarsall.bat
- 使用eclipse+git上传代码到码云
- ssh公钥私钥原理