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