需求:在设置付款条件时不允许账期+付款方式重复。


由于本次需求仅需要对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中对数据进行重复性校验相关推荐

  1. 用java向mysql数据库中插入数据为空

    利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util ...

  2. 第二篇:智能电网(Smart Grid)中的数据工程与大数据案例分析

    前言 上篇文章中讲到,在智能电网的控制与管理侧中,数据的分析和挖掘.可视化等工作属于核心环节.除此之外,二次侧中需要对数据进行采集,数据共享平台的搭建显然也涉及到数据的管理.那么在智能电网领域中,数据 ...

  3. 取出json中的数据php,怎么从Json中取出数据放到一个新组中

    如何从Json中取出数据放到一个新组中 JSON数据如下: { "CommunityModel": [ { " UUID ": "xxxxxx-xxx ...

  4. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...

    注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...

  5. 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格

    最近因为需要学习了一下使用C#操作Excel表格,现在把我使用C#如何定制表格的过程提供给需要的兄弟: /*从数据库提取数据*/ string strconn="packet size=40 ...

  6. C#中读取数据库中Image数据

    作者:未知 请与本人联系 DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据.但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据, ...

  7. linux数据库什么意思,Linux系统中的数据库命令是什么

    Linux系统中难免会跟数据库打交道的时候,掌握数据库相关命令是很重要的.下面由学习啦小编为大家整理了Linux系统中数据库命令是什么的相关知识,希望对大家有帮助! Linux系统中的数据库命令是什么 ...

  8. 怎样在表格中选出同一类_3分钟教会你如何将不同表格中的数据关联在一起

    原标题: 3分钟教会你如何将不同表格中的数据关联在一起 版权声明:本文为博主原创文章,未经博主允许不得转载. 智能输入 超级表格 微视频 关键词: 智能输入 关联不同表格 逻辑输入 「超级表格微视频」 ...

  9. Vue中组件数据的传递

    Vue中组件的作用域是隔离的,父组件中的数值子组件看不到!也就是说,用angular作比喻,组件的scope天生是scope:()的! 如果父组件需要往子组件中传数据,此时应该使用标签属性: < ...

最新文章

  1. 新版蚂蚁网有抄袭怪兽吗?
  2. 字符串插入_动态规划----字符串编辑最小距离
  3. GoogLeNet(从Inception v1到v4的演进)
  4. 程序员食品营养(1)-面包基础
  5. mysql如何删除列中的约束_我们如何从现有MySQL表的列中删除NOT NULL约束?
  6. JAVA多线程中wait()方法的详细分析
  7. ORACLE常用命令【转】
  8. 【antd】输入控件的思想
  9. 台达b2伺服modbus通讯_台达C2000促进油毛毡切割包装机的发展
  10. [c#]获取exchange中的图片
  11. 一个Maven工程中,不同的模块需要不同的JDK进行编译的解决方案
  12. Linux安装搜狗拼音和谷歌拼音输入法
  13. TCP/IP重传超时--RTO - SRTT (Smoothed Round Trip Time)
  14. 公众号被封小感:你是否拥有绝地反击的能量?
  15. iOS锁屏界面音频播放控制
  16. mac checkra1n越狱14.0-14.8
  17. 流体机械原理及设计08
  18. 9大论坛、多项AI创新成果,Imagination邀您共聚 AIIA2020人工智能开发者大会
  19. python处理pdf文件
  20. linux服务器强行删除隐藏文件

热门文章

  1. c语言非线程安全函数引发的BUG一列
  2. 隐藏文件或文件夹属性无法修改解决方案
  3. 用jquery选取表行
  4. C++ Under the Hood
  5. ORA-00972: identifier is too long问题解决
  6. jQuery教程07-内容筛选选择器
  7. js删除数组中指定元素_js中数组操作详解
  8. pwm波如何控制电机代码_PWM波控制720电机
  9. echarts3 graph java_Echarts中graph类型的运用求教
  10. java 自定义解码_[求助],java如何使用自定义注解对入参进行解密?