由於物流看板和人資報表的 SAP 系統不一樣,調用的地址就需要配置兩個,但是用上次的方法會導致衝突 ,無法同時使用!後面又重新找了一個方法!該引入的包還是一樣的,只是這次使用的 java類不一樣,如下圖:這次使用 方法二,
看代碼:
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 的信息,但是不合理,應該使用配置文件的形式 所以註釋了,但是也要知道怎麼在代碼裏面寫
/* 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 系統 而不會衝突!