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

时间: 2024-08-04 05:09:03

OAF通过Iterator标准遍历各行的相关文章

Struts迭代器(iterator)遍历List常用的4种例子 - 冯世杰

[摘要]本文主要介绍及演示了Struts迭代器(iterator)遍历List常用的4种例子,基于MyEclipse开发环境,重点关注前后端代码的实现,给出后端java代码.前段struts标签代码,主要有如下4个例子: 1. 遍历List<String> 2. 遍历List<List<String>> 3. 遍历UserEntity 4. 遍历List<UserEntity> 例子的详细代码请参考附件1,给出两个4个例子的运行截图(如下图1):      

使用Struts2的iterator标签遍历复杂的Map类型

1.创建一个Web工程,添加Struts2支持. 2.创建两个实体类: a). Mother(母亲)的Java类. package struts.map.entity; import java.io.Serializable; public class Mother implements Serializable { private static final long serialVersionUID = 1L; private int motherId;        //母亲ID priva

跟王老师学集合(三):使用Iterator接口遍历集合元素

使用Iterator接口遍历集合元素 主讲人:王少华  QQ群号:483773664 学习目标: 1 掌握使用Iterator接口遍历集合元素 一.Iterator概述 Iterator接口主要用于遍历,因此Iterator对象也被称为迭代器.Iterator接口里定义了如下三个方法: boolean hasNext():如果被迭代的集合元素还没有被遍历,则返回true Object next():返回集合里下一个元素 void remove():删除集合里上一次next方法返回的元素 二.利用

源码剖析Iterator接口遍历和直接for-get组合遍历的区别

经常使用ArrayList遍历,尝试总结一下for配合get()的遍历和Iterator配合next()遍历的区别,进入Java的JDK源码中进行深度剖析一下 这里参考一下http://bbs.csdn.net/topics/250025827论坛的测试程序: import java.util.Iterator; import java.util.List; import java.util.ArrayList; import java.util.LinkedList; /** * Iterat

使用Struts2的iterator标签遍历复杂Map种类

1.建一个Webproject.加入Struts2支持. 2.创建两个实体类: a). Mother(母亲)的Java类. package struts.map.entity; import java.io.Serializable; public class Mother implements Serializable { private static final long serialVersionUID = 1L; private int motherId;        //母亲ID p

struts s:iterator循环遍历数据 自动生成序号

如题:想自动生成序号:利用status参数即可. <s:iterator value="#session.Wbook_list" var="ib" status="status"> <tr align="center" class="list"> <td><input readonly="readonly" style="width:

JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和ArrayList.HashSet.LinkedList等等.根据核心框架图,相信我们都已经对Collection这个JavaSE中最常用API之一有一个较为全面的认识. 这个学习过程,还可以推及到其他常用开源框架和公司项目的学习和熟悉上面.借助开发工具或说明文档,先是对项目整体有一个宏观的认识,再根

struts标签iterator遍历非属性数据

·iterator标签遍历属性数据 比如:一个java类工单Business,它里面有一个属性businessLog public Class Business{ private List<BusinessLog> businessLog; //get  .set其他省略 } 那我们遍历的时候可以 <s:iterator value="businessLog" var="item" status="st"> <s:p

Iterator接口(遍历器)和for/of循环

只要某个数据结构部署了Iterator接口,就可以使用拓展运算符将其转化为数组. let arr = [...iterator]; var str = 'hello'; [...str] //["h", "e", "l", "l", "o"] yield* 后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口. let generator = function* (){ yield 1; yield* [