尝试使用java.util.iterator迭代JCoTable时出错

时间:2013-04-22 21:36:07

标签: java sap jco

我试图针对JCo对象实现一些Java模式(Facade和Iterator)。

在这里,我试图在JCoTable上创建一个迭代器,就像我在Java中的任何集合一样。下面是我的课程片段。在MyClass中,我有一个执行迭代的内部类。

我正在使用table.getStructure(...)方法,但我遗漏了一些东西。我已经看到了一些片段,他们明确地使用元数据创建了一个结构,但老实说,代码并没有出现在那些例子中,我在那里挣扎了一些,担心我会为另一个复杂交易。

我的目标是简化其他Java程序员的SAP Bapi调用和表处理。这是一个重构练习。我的返回变量在迭代器中不兼容。

提前谢谢你。

我的课程:

class MyClass 
...
protected JCoTable table;
...

private class JCoTableIterator implements Iterator<JCoRecord> {

    public boolean hasNext() {
        return table.getRow() < table.getNumRows();
    }
    @Override
    public JCoRecord next() {
        return table.getStructure(table.getRow() + 1);
    }
    @Override
    public void remove() {
        table.deleteRow();
    }
}

我的实施:

Iterator<JCoRecord> it = table.iterator();
while(it.hasNext()) {
    JCoRecord record = it.next(); <<<<< *Exception
    logger.info(record.getString("WERKS"));
    ... other field procesing ... 
}  

但是在JCoRecord record = it.next()行上我收到以下错误。

com.sap.conn.jco.ConversionException: (122) JCO_ERROR_CONVERSION: Cannot convert field VBELN of type CHAR to StructureRecord
    at com.sap.conn.jco.rt.AbstractRecord.createConversionException(AbstractRecord.java:415)
    at com.sap.conn.jco.rt.AbstractRecord.createConversionException(AbstractRecord.java:410)
    at com.sap.conn.jco.rt.AbstractRecord.getStructure(AbstractRecord.java:2472)    

1 个答案:

答案 0 :(得分:1)

假设你想迭代表格的各行,我会说你使用JCoTable.getStructure()不合适。顾名思义,它需要当前所选记录的第n个字段,并尝试将其作为结构返回。这当然只有在单个列是结构化列的情况下才有可能 - 如果它是单个(原子)字段,那么我希望这个转换失败并且正好遇到您正在遇到的错误消息。