OAF通过Iterator标准遍历各行

这两天本人接到客户反映的bug:oaf的采购订单页面,在添加超过10行提交后,会出现空指针异常。原来,oaf的默认显示行数为10行,超过10行,页面会分页。报空指针异常,就是因为没有取到分页的行。之前的代码(AM里的某个方法),我是这样写的:

        ZReqLinesVOImpl zreqVO = this.getZReqLinesVO();
int rowCount = zreqVO.getRowCount();
OAException rowException = null;
for (int i = 0; i < rowCount; i++) {
ZReqLinesVORowImpl vendorRow = (ZReqLinesVORowImpl) zreqVO
.getRowAtRangeIndex(i);
if (vendorRow.getCate1() != null
&& vendorRow.getVendorName() == null)// 当一二级不为空,供应商名称为空时,提示。
{
...
}
}

可以看到,第五行的vendorRow我是通过VO来创建的,这就是问题的所在。不知为啥,VO创建的vendorRow只能取到当前页面的行,分页的行取不到。

 解决方案:

 在我一筹莫展之时,一位功能顾问告诉我,系统中有类似的代码,可以参考下。于是我根据他给我找的页面,查看到代码。原来,标准的遍历行,是通过创建一个Iterator来遍历的,可参见博文:http://blog.csdn.net/vslkyjnew/article/details/4552317  。于是修改代码如下:

         import oracle.jbo.RowSetIterator;// 首先要引包,不然报错! 

         //方法实现如下:
ZReqLinesVOImpl zreqVO = this.getZReqLinesVO();
OAException rowException = null;
int fetchedRowCount = zreqVO.getFetchedRowCount();
RowSetIterator Iter = zreqVO.createRowSetIterator("Iter");// 创建Iterator,用于遍历
int l_setRangeStart = Iter.getRangeStart();
int l_setRangeSize = Iter.getRangeSize();
int l_noEmptyRowCount = 0;
if (fetchedRowCount > 0) {
Iter.setRangeStart(0);
Iter.setRangeSize(fetchedRowCount);
for (int i = 0; i < fetchedRowCount; i++) {
ZReqLinesVORowImpl vendorRow = (ZReqLinesVORowImpl) Iter
.getRowAtRangeIndex(i);
if (vendorRow.getCate1() != null
&& vendorRow.getVendorName() == null)// 当一二级不为空,供应商名称为空时,提示。
{// 当填写一二级时,供应商为必填项。请输入第i+1行的供应商。
Iter.setRangeStart(l_setRangeStart);
Iter.setRangeSize(l_setRangeSize);
Iter.closeRowSetIterator();//抛异常前要及时关闭Iterator,否则会出现类命名冲突异常
rowException = new OAException(
"\u5f53\u586b\u5199\u4e00\u4e8c\u7ea7\u65f6\uff0c\u4f9b\u5e94\u5546\u4e3a\u5fc5\u586b\u9879\u3002"
+ "\u8bf7\u8f93\u5165\u7b2c"
+ (i + 1)
+ "\u884c\u7684\u4f9b\u5e94\u5546\u3002",
OAException.INFORMATION);
throw rowException;
}
if (vendorRow.getVendorName() != null)// 当供应商名称不为空时,判断所填的值是否为数据库里存在的供应商
{
。。。。
Iter.setRangeStart(l_setRangeStart);
Iter.setRangeSize(l_setRangeSize);
Iter.closeRowSetIterator();// 抛异常前要及时关闭Iterator,否则会出现类命名冲突异常 rowException = new OAException(
"\u586b\u5199\u7b2c"
+ (i + 1)
+ "\u884c\u4f9b\u5e94\u5546\u9519\u8bef\uff0c\u8bf7\u4fee\u6539",
OAException.INFORMATION);
throw rowException; }
}
}
// 最后也要初始化并关闭Iterator
Iter.setRangeStart(l_setRangeStart);// 需要研究下
Iter.setRangeSize(l_setRangeSize);// 需要研究下
Iter.closeRowSetIterator(); }

总结:这次修改bug让我学到了不少,关于OAF的Iterator还得继续研究下。

上一篇:LogMiner详细讲解


下一篇:servlet_3