(二)通過JAVA調用SAP接口 (增加一二級參數)


(二)通過JAVA調用SAP接口 (增加一二級參數)

一、建立sap連接

請參考我的上一篇博客
JAVA連接SAP

二、測試項目環境准備

  1. 在上一篇操作下已經建好的環境后,在上面的基礎上新增類即可

三、源碼編寫及測試

首先建立用來傳遞數據的實體類SapData,方便直接取出數據進行下一步處理
SapData

/**
 * Created by gang.xu01@hand-china.com on 2018/12/5
 */
public class SapData {

    // 列數
    private int fieldCount;

    // 列的具體名稱
    private String[] fieldNames;

    // 全部數據
    private List<Map<String, String>> data;

    public SapData(int fieldCount, String[] fieldNames, List<Map<String, String>> data) {
        this.fieldCount = fieldCount;
        this.fieldNames = fieldNames;
        this.data = data;
    }

    public SapData() {

    }

    public int getFieldCount() {
        return fieldCount;
    }

    public void setFieldCount(int fieldCount) {
        this.fieldCount = fieldCount;
    }

    public String[] getFieldNames() {
        return fieldNames;
    }

    public void setFieldNames(String[] fieldNames) {
        this.fieldNames = fieldNames;
    }

    public List<Map<String, String>> getData() {
        return data;
    }

    public void setData(List<Map<String, String>> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "SapData{" +
                "fieldCount=" + fieldCount +
                ", fieldNames=" + Arrays.toString(fieldNames) +
                ", data=" + data +
                '}';
    }
}

 

然后編寫用來從sap連接中獲取數據的工具類 MultiFromSAP

編寫連接類 MultiFromSAP 下面是源碼

/**
 * Created by gang.xu01@hand-china.com on 2018/12/4
 */
public class MultiFromSAP {

    /**
     * description: 從sap獲取數據的工具類
     *
     * @date 2018/12/6 10:17 AM
     * @author gang.xu01@hand-china.com
     * @param sapConn sap連接
     * @param interfaceName 接口名稱
     * @param firstParamKey 一級參數key 用逗號分隔
     * @param firstParamValue 一級參數value 用逗號分隔
     * @param secondParamKey 二級參數key 用逗號分隔
     * @param secondParamValue 二級參數value 用逗號分隔
     *
     * @return List
     */
    public static List<SapData> getSapData(SapConn sapConn, String interfaceName,
                                           String firstParamKey, String firstParamValue,
                                           String secondParamKey, String secondParamValue) {
        List<SapData> returnList = new ArrayList<SapData>();
        JCoFunction function;
        JCoDestination destination = SAPConnUtils.connect(sapConn);
        System.out.println("正在從SAP獲取數據");
        try {
            // 調用interface函數
            function = destination.getRepository().getFunction(interfaceName);



            // 遍歷全部得到的table並處理
            for (JCoField field : function.getTableParameterList()) {

                // 按照需求可以整理出一條一條的數據以便插入數據庫
                JCoTable responseTable = field.getTable();
                // 一級參數
                if("".equals(firstParamKey) || "".equals(firstParamValue)) {
                    // 不需要參數
                }else {
                    String[] paramKeys = firstParamKey.split(",");
                    String[] paramValues = firstParamValue.split(",");
                    for (int i = 0; i < paramKeys.length; i++) {
                        function.getImportParameterList().setValue(paramKeys[i],
                                "null".equals(paramValues[i]) ? "" : paramValues[i]);
                    }
                }

                // 二級參數
                if("".equals(secondParamKey) || "".equals(secondParamValue)) {
                    // 不需要參數
                }else {
                    responseTable.appendRow();
                    String[] paramKeys = secondParamKey.split(",");
                    String[] paramValues = secondParamValue.split(",");
                    for (int i = 0; i < paramKeys.length; i++) {
                        responseTable.setValue(paramKeys[i],
                                "null".equals(paramValues[i]) ? "" : paramValues[i]);
                    }
                }
                // 調用函數得到返回結果(調用接口把值放到function中)
                function.execute(destination);

                // 獲取metaData(包含表的關鍵信息)
                JCoRecordMetaData metaData = responseTable.getRecordMetaData();
                SapData sapData = new SapData();
                sapData.setFieldCount(metaData.getFieldCount());
                String[] name = new String[sapData.getFieldCount()];
                List<Map<String, String>> sapList = new ArrayList<Map<String, String>>();
                // 獲取全部名稱
                for (int j = 0; j < sapData.getFieldCount(); j++) {
                    name[j] = metaData.getName(j);
                }
                sapData.setFieldNames(name);
                // 獲取全部數據
                for (int i = 0; i < responseTable.getNumRows(); i++) {
                    responseTable.setRow(i);
                    Map<String, String> sapMap = new HashMap<String, String>();
                    for (String fieldName : sapData.getFieldNames()) {
                        sapMap.put(fieldName, responseTable.getString (fieldName));
                    }
                    sapList.add(sapMap);
                }
                sapData.setData(sapList);
                returnList.add(sapData);
            }

        }catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        System.out.println("獲取成功");
        return returnList;
    }
}

 

接下來編寫一個簡單的測試類testData
/**
 * Created by gang.xu01@hand-china.com on 2018/12/9
 */
public class testData {

    public static void main(String[] args) {

        final String interfaceName = "xxx";
        // 一級參數
        final String firstParamKey = "xx";
        final String firstParamValue = "xx";
        // 二級參數
        final String secondParamKey = "xx";
        final String secondParamValue = "xx";

        SapConn con = new SapConn(
                "xx",
                "xx",
                "xx",
                "xxx",
                "xxx",
                "xx",
                "xx",
                "xx",
                "xxx"
        );

        // 測試數據
        MultiFromSAP.getSapData(con, interfaceName, firstParamKey, firstParamValue, secondParamKey, secondParamValue);
    }

}

 

如果出現空指針或者取到了結果但是是空值,那么表明取數為空或者不成功,請檢查一級參數或者二級參數是否正確。

此時如果調用結果如下則表明取數成功,此時全部數據封裝在實體中,直接操作實體便可以操作。


 


免責聲明!

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



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