对接sap导入嵌套表再嵌套表问题
问题描述
- 在对接出库单扫码接口的时候,出现了一种新的传参方式,它是在导入中放了一个structure,然后structure中还有表结构,这种情况是第一次见,之前遇到的情况有导入中有imports,表中有表结构,或者还有导入中有imports表中也有表结构三种情况。
导入中有imports
- 这种情况就是只有在导入中有字段,我们一般处理的方式就是把它需要的字段放进map里,然后调用一个工具方法,把这些字段put进imports中
1
2
3
4
5Map<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
9public 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
2String interfacename="ZFM_GPBX_MES_PP_CREATERUKU";
String response = esbUtils.postSapByTable(interfacename, list);1
2
3
4
5
6
7
8public 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
10public 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
18BapiRFC 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
20public 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;
}