您的位置:首页 > 编程语言 > Java开发

SAP发布RFC接口,然后用JAVA调用根据物料号查询物料描述

2017-04-25 15:15 1791 查看
             一开始想在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 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里面接口写的有问题,后面调整才好的,希望下次不会再犯!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: