我有一个名为ZRFC_BOM_005的SAP RFC。执行RFC函数后,我尝试从返回的表中获取字段的值,但它只显示字段的名称,但没有字段的值。但是,函数“printJCoTable(JCoTable jcoTable)”可以与其他RFC一起使用。我不知道这里有什么问题。
这是我的代码:
执行SAP RFC:
JCoFunction function = destination.getRepository().getFunction("ZRFC_BOM_005");
JCoParameterList input = function.getImportParameterList();
input.setValue("DATE_FROM", datefrom);
input.setValue("DATE_TO", dateto);
input.setValue("I_CAPID", i_capid);
input.setValue("I_MEHRS", i_mehrs);
input.setValue("I_MTNRV", i_mtnrv);
input.setValue("I_STLAN", i_stlan);
input.setValue("I_WERKS", i_werks);
if (function == null)
throw new RuntimeException("ZRFC_BOM_005 not found in SAP.");
try {
function.execute(destination);
} catch (AbapException e) {
System.out.println(e.toString());
}
JCoTable table = function.getTableParameterList().getTable("T_BOMITEM");
printJCoTable(table);
使用printJCoTable打印表的字段和表的值:
public static List<List<String>> printJCoTable(JCoTable jcoTable) {
List<List<String>> listData = new ArrayList<List<String>>();
// header
// JCoRecordMeataData is the meta data of either a structure or a table.
// Each element describes a field of the structure or table.
JCoRecordMetaData tableMeta = jcoTable.getRecordMetaData();
for (int i = 0; i < tableMeta.getFieldCount(); i++) {
System.out.print(String.format("%s\t\t", tableMeta.getName(i)));
}
System.out.println(); // new line
// line items
for (int i = 0; i < jcoTable.getNumRows(); i++) {
// Sets the row pointer to the specified position(beginning from zero)
jcoTable.setRow(i);
// Each line is of type JCoStructure
List list = new ArrayList<>();
for (JCoField fld : jcoTable) {
list.add(fld.getValue());
System.out.print(String.format("%s\t", fld.getValue()));
}
listData.add(list);
System.out.println();
}
return listData;
}
但事实证明只有字段的名称,但没有字段的值。
PS:我确定返回的字段值与我输入的相同参数存在,因为我已经通过另一个链接到SAP的软件进行了检查。
可能是超时问题吗?因为当我执行这个RFC时,运行大约需要10分钟。
然后我该如何解决这个问题?
答案 0 :(得分:1)
正如您评论jcoTable.getNumRows()
返回0:
这意味着如果您尝试访问此表的任何内容字段,该表为空并且JCo异常错误消息是正确的。
因此,您的RFC调用返回此空表,这意味着您的输入参数值似乎不包含您期望的数据。再次检查它们。
我猜您的DATE_FROM和DATE_TO参数设置错误。要么将java.util.Date
个对象放在那里,要么dateto
和datefrom
必须是字符串,那么请为其内容选择日期格式yyyyMMdd
或yyyy-MM-dd
,即今日的“20180319”或“2018-03-19”。
如果不是那么容易,它也可能是EXTERNAL到INTERNAL表示转换出口例程的事情,它们被事务SE37自动调用和使用,但是如果直接从外部调用启用RFC的功能模块则不行。有关此领域以及此领域其他问题的更多详细信息,我建议您研究SAP说明206068。
您可以使用ABAP调试器工具检查这两种情况,以便查看通过SE37调用功能模块时实际传递的输入参数值,而不是通过JCo程序调用。