(二)通過JAVA調用SAP接口 (增加一二級參數)
一、建立sap連接
請參考我的上一篇博客
JAVA連接SAP
二、測試項目環境准備
- 在上一篇操作下已經建好的環境后,在上面的基礎上新增類即可
三、源碼編寫及測試
首先建立用來傳遞數據的實體類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); } }
如果出現空指針或者取到了結果但是是空值,那么表明取數為空或者不成功,請檢查一級參數或者二級參數是否正確。
此時如果調用結果如下則表明取數成功,此時全部數據封裝在實體中,直接操作實體便可以操作。