一, 建立 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);
- }
- }
如果出现空指针或者取到了结果但是是空值, 那么表明取数为空或者不成功, 请检查一级参数或者二级参数是否正确.
此时如果调用结果如下则表明取数成功, 此时全部数据封装在实体中, 直接操作实体便可以操作.
来源: https://www.cnblogs.com/hikarisama/p/10091253.html