由于物流看板和人资报表的 SAP 系统不一样,调用的地址就需要配置两个,但是用上次的方法会导致冲突 ,无法同时使用!后面又重新找了一个方法!该引入的包还是一样的,只是这次使用的 java类不一样,如下图:这次使用 方法二,
看代码:
有了这个类 ,接下来看看如何在代码中调用这个类,用这个类和第一种方法的调用有些不一样
JCoDestination destination = HrSAPConn.connect(); //获得和sap系统的连接
以上加颜色的三个地方就是和第一种方法的区别,其他参数的设置和获取基本都是一样的 ! 用这种方法就可以 同时在一个后台中连接两个sap 系统 而不会冲突!
看代码:
package com.towery.utils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.apache.log4j.Logger;
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;
public class HrSAPConn {
private static final String ABAP_AS_POOLED = "HR";
static{
//以下这段是在代码中直接设置 sap 的信息,但是不合理,应该使用配置文件的形式 所以注释了,但是也要知道怎么在代码里面写
//以下这段是在代码中直接设置 sap 的信息,但是不合理,应该使用配置文件的形式 所以注释了,但是也要知道怎么在代码里面写
/* Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "10.5.60.100");//服务器
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00"); //系统编号
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "260"); //SAP集团
connectProperties.setProperty(DestinationDataProvider.JCO_USER, "ek1460"); //SAP用户名
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "321456"); //密码
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", HrSAPConn.loadProperties());
}
public static Properties loadProperties() {
// 加载配置文件
HrSAPConn manager = new HrSAPConn();
Properties prop = new Properties();
try {
prop.load(manager.getClass().getResourceAsStream("/hr_rfc_conf.properties"));
} catch (IOException e) {
e.printStackTrace();
}
return prop;
}
/**
* 创建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){
log.error("Create Data file fault, error msg: " + e.toString());
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) {
log.error("Connect SAP fault, error msg: " + e.toString());
}
return destination;
}
private static Logger log = Logger.getLogger(HrSAPConn.class); // 初始化日志对象
}
JCoDestination destination = HrSAPConn.connect(); //获得和sap系统的连接
try{
// 这句话会有异常需要捕获
JCoFunction function = destination.getRepository().getFunction("ZRFC_HR_READ_TABLE"); //获取方法和第一种也不一样
// 设置import 参数
JCoParameterList importParam = function.getImportParameterList();
importParam.setValue("QUERY_TABLE","ZTHR_R004"); //区域 ALL 代表全部的公司
importParam.setValue("ROWSKIPS","0"); //
importParam.setValue("ROWCOUNT","0"); //
importParam.setValue("USERNAME",userNum); //
importParam.setValue("ORDER_BY",""); //
// importParam.setValue("SELECTION","BUKRS 3100"); //
JCoParameterList inTableParam = function.getTableParameterList();
JCoTable tableInD = inTableParam.getTable("DATA");
JCoTable tableInF = inTableParam.getTable("FIELDS");
JCoTable tableInO = inTableParam.getTable("OPTIONS");
JCoTable tableInS = inTableParam.getTable("SELECTION");
// JCoTable tableInop = inTableParam.getTable("SELECTION");//得到SAP函数中的条件参数
if(!burkNum.equals("") && burkNum != null){
tableInS.appendRow();//添加一行
tableInS.setValue("FIELDNAME","BUKRS");
tableInS.setValue("OPTION","EQ");
tableInS.setValue("ANDOR","AND");
tableInS.setValue("LOW",burkNum);
}
if(!areaNum.equals("") && areaNum != null){
tableInS.appendRow();//添加一行
tableInS.setValue("FIELDNAME","SOBJID");
tableInS.setValue("OPTION","EQ");
tableInS.setValue("ANDOR","AND");
tableInS.setValue("LOW",areaNum);
}
// 执行RFC
function.execute(destination); // 执行方法和第一种不一样
.....
....
}catch (JCoException e) {
.....
....
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
以上加颜色的三个地方就是和第一种方法的区别,其他参数的设置和获取基本都是一样的 ! 用这种方法就可以 同时在一个后台中连接两个sap 系统 而不会冲突!