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还得继续研究下。

 

   

 

posted @ 2015-03-10 22:27  JOKER-ZHAO  阅读(685)  评论(0编辑  收藏  举报