Java連接Sap系統調並調用RFC函數


參考博客:https://blog.csdn.net/qq_36026747/article/details/81287462

                  https://www.cnblogs.com/jiangzhengjun/p/4291479.html     

 

 

安裝jco

鏈接:https://pan.baidu.com/s/1DclmG14bjAteTvUC7X-e9A
提取碼:ppg2

解壓之后,進入安裝目錄:執行cmd執行 java -jar sapjco3.jar ,顯示以下圖片,則安裝成功。

 

創建RFC函數:

 

編寫Java代碼:

配置好Jvm后,將剛才jco3目錄中的 sapjco3.jar 和 sapjco3.dll 放入lib 包中。

package sapConnection2;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;

import com.sap.conn.jco.ext.DestinationDataProvider;

public class ConnectPooled {// 連接池

    static String ABAP_AS_POOLED = "ConnectionPool";    //配置文件名
    static {

        Properties connectProperties = new Properties();
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxx.xxx.x.xxx"); // IP
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系統編號
        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // 客戶端編號
        connectProperties.setProperty(DestinationDataProvider.JCO_USER, "xxxx"); // 用戶名
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxxxxx"); // 密碼
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 語言// *********連接池方式與直接不同的是設置了下面兩個連接屬性*******
        // JCO_PEAK_LIMIT - 同時可創建的最大活動連接數,0表示無限制,默認為JCO_POOL_CAPACITY的值
        // 如果小於JCO_POOL_CAPACITY的值,則自動設置為該值,在沒有設置JCO_POOL_CAPACITY的情況下為0
        connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");
        // JCO_POOL_CAPACITY - 空閑連接數,如果為0,則沒有連接池效果,默認為1
        connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "2");
        createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
    }

    /* 創建連接池的配置文件 */
    static void createDataFile(String name, String suffix, Properties properties) {
        File cfg = new File(name + "." + suffix);
        if (!cfg.exists()) {
            try {
                FileOutputStream fos = new FileOutputStream(cfg, false);
                properties.store(fos, "for tests only !");
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }    
}

測試代碼:

package sapConnection2;

import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoRepository;

/*
 * JCoFunction包含importing參數,exporting參數,changing參數,table參數。
 * 分別使用getImportParameterList方法,getExportParameterList方法, getChangingParameterList方法和getTableParameterList獲得。
 * 這些方法的返回值都是JCoParameter類型
 */
public class ConnectPooledTest {

    public static void main(String[] args) throws JCoException {
        String bapiFunctionName = "ZPOP_NUMBER";
        JCoDestination destination = JCoDestinationManager.getDestination(ConnectPooled.ABAP_AS_POOLED);
        JCoRepository repository = destination.getRepository();                 //JCoFunction是一個接口,代表SAP系統的函數庫
        JCoFunction function = repository.getFunction(bapiFunctionName);     // 從這個函數模板獲得該SAP函數的對象        
        JCoParameterList input = function.getImportParameterList();         // 獲得函數的import參數列表
        input.setValue("INPUT_NUMB1", 2);
        input.setValue("INPUT_NUMB2", 2);        
        function.execute(destination);
        JCoParameterList output = function.getExportParameterList();         // 獲得Export變量列表。
        int value = output.getInt("OUTPUT_NUMB");
        System.out.println(value);    
    }
}

 

 

報錯:

Exception in thread "main" com.sap.conn.jco.JCoException: (102) JCO_ERROR_COMMUNICATION: Connect to SAP gateway failed
Connection parameters: TYPE=A DEST=ConnectionPool ASHOST=192.168.1.112 SYSNR=00 PCS=1

可能缺少路由器字符串,在ConnectPooled類中添加: 

connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, "xxxxxxxxx");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM