(二)通过JAVA调用SAP接口 (增加一二级参数)
在建立sap连接的基础上通过使用一级二级参数调用接口以获取sap接口中的数据
(二)通过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); } }
如果出现空指针或者取到了结果但是是空值,那么表明取数为空或者不成功,请检查一级参数或者二级参数是否正确。
此时如果调用结果如下则表明取数成功,此时全部数据封装在实体中,直接操作实体便可以操作。