这两天本人接到客户反映的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还得继续研究下。