2014-06-26 Created By BaoXinjian
一、摘要
在OAF的开发中,可能有这样的需求,在选择保存按钮时,如果存在改动的数据,则提交事务,保存到数据库中;
如果不存在改动的数据,就提示用户当前没有数据可更改;
解决时需要判断页面中所使用的视图对象是否发生过改动,存在多种方法
1. 调用OADBTransaction.isDirty()方法
此方法用于判断当前事务中,视图对象是否发生过变更。但是此方法只对基于实体对象的视图对象有效,如果存在基于查询的视图对象,需要调用PL/SQL来改变数据库的就不行了。
2. 调用OAViewObject.isDirty()方法
此方法可以判断单个视图对象是否发生过变更,无论是基于实体对象的视图对象还是基于查询的视图对象。
3. 调用实体对象的getPostState()方法来判断
有时使用OAViewObject.isDirty()也有一定的限制。如果重新执行了查询,则视图对象的Dirty标志被重置,此时不可以使用该方法来判断是否存在变更,而需要使用下面所说的方法或第四种方法。
调用ViewRowImpl.getEntity(0).getPostState()可以判断视图行对应的实体对象是否发生过变更,这样就可以不顾是否重新查询导致Dirty标志重置。
4. 使用数据缓存
进入页面前把数据缓存到Transaction中,在保存按钮事件时,比较Transaction保存的实体对象行的每个属性是否和当前视图对象行属性一致。
使用方法四的理由是,如果存在insertRow(),然后又删除了新建的行row.remove(),此时系统就会认为视图对象存在未保存的变更。而使用第四种方法可以避免这种情况(一般情况下,应该也能说服客户接受这种情况)。
另外如果是基于查询建立的视图对象(使用PL/SQL保存到数据库中),并且存在临时属性的变更的情况(调用过row.setAttribute(),即使属性是不需要保存到数据库),就只能使用第四种方法。
二、案例
需求: 在Create Expense时,判断数据是否被修改,如没有修改,跳出提示信息,提示用户数据未被修改是否需要保存
1. 在AM中调用createExpense新增判断Transaction是否被修改
2. 测试时,未修改数据,系统会跳出提示框提示用户
Thanks and Regards
参考: http://blog.csdn.net/cunxiyuan108/article/details/8800690
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建