在EORow或者VORow中对数据进行重复性校验
需求:在设置付款条件时不允许账期+付款方式重复。
由于本次需求仅需要对VO缓存中的数据进行重复性校验,所以仅需进行缓存遍历即可,不需要校验数据库。
方式1,在EORow的进行数据校验。
public void setPaymentTermsId(Number value) {if(value!=null && !"".equals(value) && this.getPaymentMethod()!=null && !"".equals(getPaymentMethod()) ){validateRepeat(value, getPaymentMethod(), "TERMS");}setAttributeInternal(PAYMENTTERMSID, value);}public void setPaymentMethod(String value) {if(value!=null && !"".equals(value) && this.getPaymentTermsId()!=null && !"".equals(getPaymentTermsId()) ){validateRepeat(getPaymentTermsId(), value, "METHOD");}setAttributeInternal(PAYMENTMETHOD, value);}public void validateRepeat(Number payTerms,String payMethod,String cloumn){com.sun.java.util.collections.Iterator payIterator = getEntityDef().getAllEntityInstancesIterator(getDBTransaction());String currentStr = payTerms+"-"+payMethod;while(payIterator.hasNext()){CuxPoPayProvisionTempEOImpl cachePay = (CuxPoPayProvisionTempEOImpl)payIterator.next();String validationStr = cachePay.getPaymentTermsId()+"-"+cachePay.getPaymentMethod();if(currentStr.equals(validationStr)){if("TERMS".equals(cloumn)){//发生重复异常时,设置选择值为空,避免选择后提示了异常,选择值仍然放置到了Poplist中setPaymentTermsId(null); }if("METHOD".equals(cloumn)){//发生重复异常时,设置选择值为空,避免选择后提示了异常,选择值仍然放置到了Poplist中setPaymentMethod(null);}throw new OAAttrValException(OAException.TYP_ENTITY_OBJECT, getEntityDef().getFullName(), getPrimaryKey(), "PayProvisionTempId", currentStr, "CUX", "CUX_PO_PAY_PROVI_VALIDATION"); // Message name }}}
2.在VORow中进行校验,
public void setPaymentTermsId(Number value) { if(value!=null && !"".equals(value) && this.getPaymentMethod()!=null && !"".equals(getPaymentMethod()) ){validateRepeat(value, getPaymentMethod(), "TERMS");}setAttributeInternal(PAYMENTTERMSID, value);}public String getPaymentMethod() {return (String) getAttributeInternal(PAYMENTMETHOD);}public void validateRepeat(Number payTerms,String payMethod,String cloumn){CuxPoPayProvisionTempEOImpl tempEO =(CuxPoPayProvisionTempEOImpl)this.getEntity(0);com.sun.java.util.collections.Iterator payIterator = tempEO.getDefinitionObject().getAllEntityInstancesIterator(tempEO.getDBTransaction()); String currentStr = payTerms+"-"+payMethod;while(payIterator.hasNext()){CuxPoPayProvisionTempEOImpl cachePay = (CuxPoPayProvisionTempEOImpl)payIterator.next();String validationStr = cachePay.getPaymentTermsId()+"-"+cachePay.getPaymentMethod();if(currentStr.equals(validationStr)){if("TERMS".equals(cloumn)){setPaymentTermsId(null); }if("METHOD".equals(cloumn)){setPaymentMethod(null);}throw new OAAttrValException(OAException.TYP_VIEW_OBJECT, getViewObject().getFullName(), getKey(), "PayProvisionTempId", currentStr, "CUX", "CUX_PO_PAY_PROVI_VALIDATION"); // Message name }}}
在实际的使用中存在以下需求,不仅要对VO中未提交的缓存进行校验,同时要校验数据库中已存在的值。
方法1.使用标准的同时扫描EORow和TABLE的方式,如果存在结果集,则说明该值已存在。
参考:同时查询数据库和缓存中的数据
public boolean attachmentExistsInCacheOrDb( String entityName, String[] pkValues){boolean atchExists = false;if ( pkValues != null ){if ( pkValues.length > 5 )throw new OAException("FND", "ATTCH_TOO_MANY_PKVALUES");ViewObject vo = null;vo = this.findViewObject("CheckFndAttachedDocumentsVO");if ( vo == null ){vo = this.createViewObject("CheckFndAttachedDocumentsVO","oracle.apps.fnd.server.FndAttachedDocumentsVO");}vo.addQueryMode(vo.QUERY_MODE_SCAN_DATABASE_TABLES | vo.QUERY_MODE_SCAN_ENTITY_ROWS);ViewCriteria vc = vo.createViewCriteria();ViewCriteriaRow vcr = vc.createViewCriteriaRow();//设定标准查询参数,可以多个,参数与Attribute类型一定要一致vcr.setAttribute("EntityName", entityName);vcr.setAttribute("Pk1Value", pkValues[0]);vcr.setConjunction(ViewCriteriaRow.VCROW_CONJ_AND);vc.addElement(vcr);vc.setCriteriaMode(ViewCriteria.CRITERIA_MODE_QUERY | ViewCriteria.CRITERIA_MODE_CACHE);vo.applyViewCriteria(vc); vo.clearCache(); vo.reset(); vo.setWhereClause(null); vo.setWhereClauseParams(null); vo.setMaxFetchSize(-1); vo.executeQuery(); if(vo.hasNext()){atchExists = true; } } else {throw new OAException("FND", "ATTCH_PKVALUES_CANNOT_NULL"); } return atchExists; }
方法二:在EO或者VO缓存中进行校验之后再调用查询方法查询数据库中是否已存在值
EORowImpl
public void setItemCategoryId(Number value) {if (value != null) {//此部分与缓存中的行进行校验//具体实现参考前文 OADBTransaction transaction = getOADBTransaction();CategoryEntityExpert expert = getCategoryEntityExpert(transaction);if (expert.categoryExists(posMappingId,orgId,orgType, value, orgDepartment)){ throw new OAAttrValException(OAException.TYP_ENTITY_OBJECT, getEntityDef().getFullName(), getPrimaryKey(), "ItemCategoryId", value, "CUX", "CUX_SUP_PERMIT_001"); // Message name }}setAttributeInternal(ITEMCATEGORYID, value);}public static CategoryEntityExpert getCategoryEntityExpert(OADBTransaction txn){return (CategoryEntityExpert)txn.getExpert(CuxSuppItemCateMappingEOImpl.getDefinitionObject());}public static CategoryEntityExpert getCategoryEntityExpert(OADBTransaction txn){return (CategoryEntityExpert)txn.getExpert(CuxSuppItemCateMappingEOImpl.getDefinitionObject());}
CategoryEntityExpert类
mport oracle.jbo.domain.Number;import oracle.apps.fnd.common.VersionInfo; import oracle.apps.fnd.framework.server.OAEntityExpert;public class CategoryEntityExpert extends OAEntityExpert {public boolean categoryExists(Number posMappingId, Number orgId, String orgType, Number categoryId, String orgDepartment) {boolean exists = false;CategoryIdVVOImpl vvo = (CategoryIdVVOImpl)findValidationViewObject("CategoryIdVVO1");vvo.initQuery(posMappingId, orgId, orgType, categoryId, orgDepartment);if (vvo.hasNext()) {exists = true;}return exists;}}
CategoryIdVVO1是在AM中实例化的ValidateVO,通常VVO就是用于验证的VO
在EORow或者VORow中对数据进行重复性校验相关推荐
- 用java向mysql数据库中插入数据为空
利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util ...
- 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析
前言 上篇文章中讲到,在智能电网的控制与管理侧中,数据的分析和挖掘.可视化等工作属于核心环节.除此之外,二次侧中需要对数据进行采集,数据共享平台的搭建显然也涉及到数据的管理.那么在智能电网领域中,数据 ...
- 取出json中的数据php,怎么从Json中取出数据放到一个新组中
如何从Json中取出数据放到一个新组中 JSON数据如下: { "CommunityModel": [ { " UUID ": "xxxxxx-xxx ...
- 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...
注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格
最近因为需要学习了一下使用C#操作Excel表格,现在把我使用C#如何定制表格的过程提供给需要的兄弟: /*从数据库提取数据*/ string strconn="packet size=40 ...
- C#中读取数据库中Image数据
作者:未知 请与本人联系 DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据.但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据, ...
- linux数据库什么意思,Linux系统中的数据库命令是什么
Linux系统中难免会跟数据库打交道的时候,掌握数据库相关命令是很重要的.下面由学习啦小编为大家整理了Linux系统中数据库命令是什么的相关知识,希望对大家有帮助! Linux系统中的数据库命令是什么 ...
- 怎样在表格中选出同一类_3分钟教会你如何将不同表格中的数据关联在一起
原标题: 3分钟教会你如何将不同表格中的数据关联在一起 版权声明:本文为博主原创文章,未经博主允许不得转载. 智能输入 超级表格 微视频 关键词: 智能输入 关联不同表格 逻辑输入 「超级表格微视频」 ...
- Vue中组件数据的传递
Vue中组件的作用域是隔离的,父组件中的数值子组件看不到!也就是说,用angular作比喻,组件的scope天生是scope:()的! 如果父组件需要往子组件中传数据,此时应该使用标签属性: < ...
最新文章
- 新版蚂蚁网有抄袭怪兽吗?
- 字符串插入_动态规划----字符串编辑最小距离
- GoogLeNet(从Inception v1到v4的演进)
- 程序员食品营养(1)-面包基础
- mysql如何删除列中的约束_我们如何从现有MySQL表的列中删除NOT NULL约束?
- JAVA多线程中wait()方法的详细分析
- ORACLE常用命令【转】
- 【antd】输入控件的思想
- 台达b2伺服modbus通讯_台达C2000促进油毛毡切割包装机的发展
- [c#]获取exchange中的图片
- 一个Maven工程中,不同的模块需要不同的JDK进行编译的解决方案
- Linux安装搜狗拼音和谷歌拼音输入法
- TCP/IP重传超时--RTO - SRTT (Smoothed Round Trip Time)
- 公众号被封小感:你是否拥有绝地反击的能量?
- iOS锁屏界面音频播放控制
- mac checkra1n越狱14.0-14.8
- 流体机械原理及设计08
- 9大论坛、多项AI创新成果,Imagination邀您共聚 AIIA2020人工智能开发者大会
- python处理pdf文件
- linux服务器强行删除隐藏文件
热门文章
- c语言非线程安全函数引发的BUG一列
- 隐藏文件或文件夹属性无法修改解决方案
- 用jquery选取表行
- C++ Under the Hood
- ORA-00972: identifier is too long问题解决
- jQuery教程07-内容筛选选择器
- js删除数组中指定元素_js中数组操作详解
- pwm波如何控制电机代码_PWM波控制720电机
- echarts3 graph java_Echarts中graph类型的运用求教
- java 自定义解码_[求助],java如何使用自定义注解对入参进行解密?