问题描述

  • 在对接出库单扫码接口的时候,出现了一种新的传参方式,它是在导入中放了一个structure,然后structure中还有表结构,这种情况是第一次见,之前遇到的情况有导入中有imports,表中有表结构,或者还有导入中有imports表中也有表结构三种情况。

    导入中有imports

  • 这种情况就是只有在导入中有字段,我们一般处理的方式就是把它需要的字段放进map里,然后调用一个工具方法,把这些字段put进imports中

    1
    2
    3
    4
    5
    Map<String,Object> m = new HashMap<>();
    m.put("ZT","state");
    m.put("VBELN","outboundno");
    System.out.println("更改装车状态接口");
    String message = esbUtils.postSapByImports("ZFM_GP_SD_APP_CKDZTGX",m);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public  String postSapByImports(String functionName, Map<String, Object> params) {
    if (params==null) throw new RuntimeException("传递给SAP的数据为空!");
    BapiRFC bapiRFC = new BapiRFC(functionName);
    BapiRFC.Imports imports = bapiRFC.getImports();
    imports.putAll(params);
    String response = doPost(ESBAddress, null,bapiRFC.toString());
    System.out.println(response);
    return response;
    }

    导入中为空,表中有个表结构。

  • 这种情况就是导入中为空,然后表中有个IN_TAB这个就是入参的那个表结构,这种就是创建一个BapiRFC.Table类型的对象,然后把一个list放进table中

    1
    2
    String interfacename="ZFM_GPBX_MES_PP_CREATERUKU";
    String response = esbUtils.postSapByTable(interfacename, list);
    1
    2
    3
    4
    5
    6
    7
    8
    public  String postSapByTable(String functionName,  List<? extends Map<String, ?>> list) {
    if (list==null) throw new RuntimeException("传递给SAP的数据为空!");
    BapiRFC bapiRFC = new BapiRFC(functionName);
    BapiRFC.Table table = bapiRFC.getTable("IN_TAB");
    table.addRows(list);
    String response = doPost(ESBAddress, null,bapiRFC.toString());
    return response;
    }

    导入中有imports,表中也有表结构

  • 这种情况就是导入中有imports,表中也有表结构,这种处理的方式就是声明一个BapiRFC.Table和一个BapiRFC.Imports,然后把导入中的字段放进imports中把list放进table中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public  String postSapByTablegp(String functionName,  List<? extends Map<String, ?>> list) {
    if (list==null) throw new RuntimeException("传递给SAP的数据为空!");
    BapiRFC bapiRFC = new BapiRFC(functionName);
    BapiRFC.Table table = bapiRFC.getTable("IN_TAB_GP");
    table.addRows(list);
    BapiRFC.Imports imports =bapiRFC.getImports();
    imports.put("BS","GP");
    String response = doPost(ESBAddress, null,bapiRFC.toString());
    return response;
    }

    导入中有嵌套表

  • 这种导入中有表的这种,也是需要声明一个import,然后有一个imports.getTable(“INTAB”)方法,得到一个BapiRFC.Table,然后再往表里面放值即可。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    BapiRFC bapiRFC = new BapiRFC("ZFM_MM_MDM_002");
    Imports imports = bapiRFC.getImports();
    Table intab = imports.getTable("INTAB");
    Row row = intab.addRow();
    row.put("LIFNR", "DONGPZ")
    .put("NAME1", "XXX")
    .put("BPEXT", "XX")
    .put("EMNFR", "XXX")
    .put("STCD5", "AAAA")
    .put("KTOKK", "CCCC")
    .put("STREET", "")
    .put("REGIO", "XX")
    .put("LAND1", "")
    .put("TELF1", "XXXXXXXXXXXX")
    .put("SMTP_ADDR", "")
    .put("CITY", "");
    Table bank = row.getTable("BANK");
    bank.addRow().put("BANKS", "AD").put("BANKL", "WWW").put("BANKN", "EEE");

    只有导入中有个structure

  • 今天遇到一个新的方式,然后只有在导入中有个structure,我一开始以为是表结构,然后尝试最上面三种方式都不可以,后来问了滨哥,才知道这种方式的传值也已经解决了,需要使用到imports.getTable(“INTAB”)方法,需要拉一下最新的对接sap demo那个项目,然后复制BaPiRFC.java这个文件覆盖掉我们项目中这个文件,然后就有gettable这个方法。后来试了一下还是不行,原因是图中的INTAB并不是表,而是一个structure,所以我又尝试了一下import包含结构的那种方法,后来问题解决。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public  String postPushScan(String functionName, OutboundSuggestBale params, String outboundno, List<Map<String,Object>> listdata) {
    if (params==null) throw new RuntimeException("传递给SAP的数据为空!");
    BapiRFC bapiRFC = new BapiRFC(functionName);
    BapiRFC.Imports imports = bapiRFC.getImports();
    BapiRFC.Structure structure = imports.getStructure("INTAB");
    structure.put("VBELN", outboundno)
    .put("UECHA", params.getOutboundsummaryno())
    .put("POSNR", params.getOutboundsummaryno())
    .put("MATNR", params.getGcid())
    .put("ZBAOH", params.getPackno())
    .put("LGORT", params.getStorehouse())
    .put("CHARG", params.getPicino())
    .put("LFIMG", params.getQty())
    .put("VRKME", params.getUnit());
    BapiRFC.Table ZBHXX = structure.getTable("ZBHXX");
    ZBHXX.addRows(listdata);
    String response = doPost(ESBAddress, null,bapiRFC.toString());
    System.out.println(response);
    return response;
    }