java後臺調用 SAP RFC 第二種方法

由於物流看板和人資報表的 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 系統 而不會衝突! 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章