1.此處不涉及到sap端的開發,sap端接口寫好了,只是經過JAVA直接調用接口名 .java
2.sapjco3.jar,sapjco3.dll和sapjcorfc.dll要放在容器的lib下面,而不是項目的WEB-INF\lib,例如tomcat,D:\Program Files\Tomcat 6.0\lib,就是你tomcat安裝路徑下。
緣由見 http://www.iteye.com/problems/96263
本文章中兩個例子:1.讀取SAP系統中的借款餘額;2.生成SAP會計憑證
1.下載下面的jar和dll,放到容器的lib中;接着經過代碼實現與sap鏈接
SAPConn.java即JAVA與sap鏈接代碼 數據庫
Java代碼 apache
package rising.sap; import java.io.File; import java.io.FileOutputStream; 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; /** * 與SAP鏈接配置 * @author wy */ public class SAPConn { private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL"; static{ Properties connectProperties = new Properties(); connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "192.168.17.8");//服務器 connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00"); //系統編號 connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "120"); //SAP集團 connectProperties.setProperty(DestinationDataProvider.JCO_USER, "OASERVICE"); //SAP用戶名 connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "oatest"); //密碼 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){ 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(SAPConn.class); // 初始化日誌對象 }
2.從sap取餘額接口的文檔
這個接口的功能是去sap中查詢出我的借款餘額
ZRFC_GET_REMAIN_SUM這個爲接口名;
輸入參數I_PARAM,I_KUNNR...這些表示你調用該接口時傳入的參數
輸出參數:
(1)E_STATUS 數據返回狀態
S:成功讀取餘額
F:無餘額
E:異常
(2)E_MESSAGE數據返回消息
E_STATUS 返回數據爲E,錯誤信息存放於E_MESSAGE
(3)E_REMAIN_SUM 餘額,就是你想要的餘額
接口調用成功返回正確的餘額數據
LoadBorrowMoneyBalanceFromSAP.java即JAVA調用sap獲取餘額 tomcat
Java代碼 服務器
package rising.test; import rising.sap.SAPConn; import com.sap.conn.jco.JCoDestination; import com.sap.conn.jco.JCoException; import com.sap.conn.jco.JCoFunction; /** * 從sap中取得借款餘額 * @author kmd * 2013-06-05 * */ public class LoadBorrowMoneyBalanceFromSAP { /* * balanceType 借款類型 01:我的借款餘額 02:其餘應付借款餘額 03:供應商的應付款餘額 * customerEmployeeNumber 客戶員工編號 * supplierCode 供應商編碼 * companyCode 公司代碼(法人體) * accountNumber 會計科目編號 * year 年 * month 月 */ public static String LoadBorrowMoneyBalance(String balanceType,String customerEmployeeNumber,String supplierCode,String companyCode,String accountNumber,String year,String month){ String balance=""; JCoFunction function = null; //鏈接sap,其實就相似於鏈接數據庫 JCoDestination destination = SAPConn.connect(); try { //調用ZRFC_GET_REMAIN_SUM函數 function = destination.getRepository().getFunction("ZRFC_GET_REMAIN_SUM"); //將當前傳入的值賦予各個參數 function.getImportParameterList().setValue("I_PARAM", balanceType); function.getImportParameterList().setValue("I_KUNNR", customerEmployeeNumber); function.getImportParameterList().setValue("I_LIFNR", supplierCode); function.getImportParameterList().setValue("I_BUKRS", companyCode); function.getImportParameterList().setValue("I_KOBEZ", accountNumber); function.getImportParameterList().setValue("I_YEAR", year); function.getImportParameterList().setValue("I_MONTH", month); function.execute(destination); //獲取借款餘額 balance=function.getExportParameterList().getString("E_REMAIN_SUM"); //獲返回狀態 String state=function.getExportParameterList().getString("E_STATUS"); //獲返回信息 String message=function.getExportParameterList().getString("E_MESSAGE"); System.out.println("調用返回狀態--->"+state); System.out.println("調用返回信息--->"+message); } catch (JCoException e) { // TODO Auto-generated catch block e.printStackTrace(); } return balance; } }
3.sap生成憑證接口的文檔
該接口表示傳入爲一個表的形式,參數公司代碼和憑證類型封裝在表T_ACCDOCUMENT中
而輸出來的有返回狀態 ,返回消息和表T_ACCDOCUMENT,而從文檔能夠看出會附帶得出會計憑證號和會計憑證行項目這兩個參數。(爲了簡單方便,文檔中有些參數省略了)
CreateVoucherFromSAP.java生成SAP會計憑證 app
Java代碼 ide
package rising.test; import rising.sap.SAPConn; import com.sap.conn.jco.JCoDestination; import com.sap.conn.jco.JCoFunction; import com.sap.conn.jco.JCoTable; /** * 從sap中生成憑證 * @author kmd * 2013-06-05 * */ public class CreateVoucherFromSAP { public static void main(String[] args) { JCoFunction function = null; JCoDestination destination = SAPConn.connect(); String state="";//調用接口返回狀態 String message="";//調用接口返回信息 String belnr="";//會計憑證號 String buzei="";//會計憑證行項目 try { //調用ZRFC_GET_REMAIN_SUM函數 function = destination.getRepository().getFunction("ZRFC_OA_ACC_DOCUMENT"); //獲取傳入表參數T_ACCDOCUMENT JCoTable T_ACCDOCUMENT = function.getTableParameterList().getTable("T_ACCDOCUMENT"); T_ACCDOCUMENT.appendRow();//增長一行 //給表參數中的字段賦值,此處測試,就隨便傳兩個值進去 T_ACCDOCUMENT.setValue("BUKRS", "1000"); T_ACCDOCUMENT.setValue("BLART", "SA"); function.execute(destination); state= function.getExportParameterList().getString("E_STATUS");//調用接口返回狀態 message= function.getExportParameterList().getString("E_MESSAGE");//調用接口返回信息 System.out.println("調用返回狀態--->"+state+";調用返回信息--->"+message); T_ACCDOCUMENT.firstRow();//獲取第一行的對象(此處看sap端如何寫的,若是返回的可能有多行,那得循環) belnr=T_ACCDOCUMENT.getString("BELNR"); buzei=T_ACCDOCUMENT.getString("BUZEI"); System.out.println("會計憑證號--->"+belnr+";會計憑證行項目--->"+buzei); T_ACCDOCUMENT.clear();//清空本次條件,若是要繼續傳入值去或者還要循環,那得將以前的條件清空 }catch (Exception e) { e.printStackTrace(); } } }