当前位置: 代码迷 >> Oracle管理 >> OAF透过Iterator标准遍历各行
  详细解决方案

OAF透过Iterator标准遍历各行

热度:150   发布时间:2016-04-24 04:07:06.0
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还得继续研究下。

 

   

 

  相关解决方案