(二)通过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);
    }

}

 

如果出现空指针或者取到了结果但是是空值,那么表明取数为空或者不成功,请检查一级参数或者二级参数是否正确。

此时如果调用结果如下则表明取数成功,此时全部数据封装在实体中,直接操作实体便可以操作。


 

posted @ 2018-12-09 15:05  Hikari410  阅读(4540)  评论(1编辑  收藏  举报