1.首先需要在SAP事務碼SE37中新建一個可以被遠程調用的RFC
事務碼:SE37
新建一個函數組:輸入事務碼SE37回車后,來到函數構建器屏幕,到上面一排菜單欄:轉到 -> 函數組 -> 創建組
輸入描述信息,方便以后使用,以后功能相似的函數都可以放到該函數組下
函數組創建完畢后,回到SE37初始界面,創建函數,鍵入函數名后,點擊創建按鈕
在屬性頁簽下,輸入函數的描述,將遠程啟用的模塊選上
在導入導出參數頁簽下設置輸入輸出參數(遠程調用模塊的注入,輸出),要注意參考類型,可選性和傳遞值
在源代碼中
1 FUNCTION zchenh001. 2 *"---------------------------------------------------------------------- 3 *"*"局部接口: 4 *" IMPORTING 5 *" VALUE(P1) TYPE INT4 DEFAULT 0 6 *" VALUE(P2) TYPE INT4 DEFAULT 0 7 *" VALUE(OPERATOR) TYPE CHAR1 DEFAULT '+' 8 *" EXPORTING 9 *" VALUE(RESULT) TYPE INT4 10 *" VALUE(MSG) TYPE CHAR255 11 *"---------------------------------------------------------------------- 12 DATA:err_text TYPE string, 13 e TYPE REF TO cx_root. 14 TRY . 15 CASE operator. 16 WHEN '+'. result = p1 + p2. 17 WHEN '-'. result = p1 - p2. 18 WHEN '*'. result = p1 * p2. 19 WHEN '/'. result = p1 / p2. 20 WHEN OTHERS. 21 CONCATENATE '操作符' operator ',SAP無法識別' into msg. 22 ENDCASE. 23 CATCH cx_root INTO e. 24 err_text = e->get_text( ). 25 msg = err_text. 26 27 ENDTRY. 28 29 ENDFUNCTION.
在SAP中測試如下:
測試一:
測試二:
測試三:
測試四:
接下來需要下載連接SAP的驅動sapjco3.jar包,
本處提供下載:sapjco3.jar
解壓密碼:1187163927
激活后可以在SAP內部測試 ,至此SAP部分已完成
2在eclipse(myeclipse)新建的項目中將sapjco3.jar導入,記得build path.
打開該項目樹狀圖,將下載好的sapjco3.jar直接拖到該項目中,然后鼠標左鍵選中該文件,右鍵Build Path即可。
2.1 配置與SAP系統的連接(此處最好在SAP系統中新建一個RFC用戶)
1 package com.cee.conn; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.util.Properties; 6 import java.util.logging.Logger; 7 8 import com.sap.conn.jco.JCoDestination; 9 import com.sap.conn.jco.JCoDestinationManager; 10 import com.sap.conn.jco.JCoException; 11 import com.sap.conn.jco.ext.DestinationDataProvider; 12 13 /** 14 * 與SAP連接配置 15 * 16 * @author jay 17 */ 18 public class SAPConn { 19 private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL"; 20 static { 21 Properties connectProperties = new Properties(); 22 connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxx.xxxx.xxxx.xxxx");// 服務器 23 connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系統編號 24 connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // SAP集團 25 connectProperties.setProperty(DestinationDataProvider.JCO_USER, "xxxx"); // SAP用戶名 26 connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxxxx"); // 密碼 27 connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 登錄語言:ZH EN 28 connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); // 最大連接數 29 connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // 最大連接線程 30 31 createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties); 32 } 33 34 /** 35 * 創建SAP接口屬性文件。 36 * 37 * @param name 38 * ABAP管道名稱 39 * @param suffix 40 * 屬性文件后綴 41 * @param properties 42 * 屬性文件內容 43 */ 44 private static void createDataFile(String name, String suffix, Properties properties) { 45 File cfg = new File(name + "." + suffix); 46 if (cfg.exists()) { 47 cfg.deleteOnExit(); 48 } 49 try { 50 FileOutputStream fos = new FileOutputStream(cfg, false); 51 properties.store(fos, "for tests only !"); 52 fos.close(); 53 } catch (Exception e) { 54 System.out.println("Create Data file fault, error msg: " + e.toString()); 55 throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e); 56 } 57 } 58 59 /* 60 * * 獲取SAP連接 61 * 62 * @return SAP連接對象 63 */ 64 public static JCoDestination connect() { 65 JCoDestination destination = null; 66 try { 67 destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED); 68 } catch (JCoException e) { 69 System.out.println("Connect SAP fault, error msg: " + e.toString()); 70 } 71 return destination; 72 } 73 }
2.2 在java代碼中測試連接
1 package com.cee.test; 2 import java.io.ObjectInputStream.GetField; 3 import com.cee.conn.SAPConn; 4 import com.sap.conn.jco.JCoDestination; 5 import com.sap.conn.jco.JCoFunction; 6 import com.sap.conn.jco.JCoParameterList; 7 import com.sap.conn.jco.JCoTable; 8 9 public class CheckSnFromSAP { 10 public static void main(String[] args) { 11 JCoFunction function = null; 12 JCoDestination destination = SAPConn.connect(); 13 int result=0;//調用接口返回狀態 14 String message="";//調用接口返回信息 15 try { 16 //調用ZCHENH001函數 17 function = destination.getRepository().getFunction("ZCHENH001"); 18 JCoParameterList input = function.getImportParameterList(); 19 input.setValue("P1", 10); 20 input.setValue("P2", 2); 21 input.setValue("OPERATOR", "?"); // 輸入參數 22 function.execute(destination); 23 result= function.getExportParameterList().getInt("RESULT");//調用接口返回結果 24 message= function.getExportParameterList().getString("MSG");//調用接口返回信息 25 System.out.println("調用返回結果--->"+result+";調用返回狀態--->"+message); 26 }catch (Exception e) { 27 e.printStackTrace(); 28 } 29 } 30 }
運行結果如下:
測試一: 注入參數分別為:10,2,?
測試二: 注入參數分別為:10,2,/