zoukankan      html  css  js  c++  java
  • 在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
  • 相关阅读:
    LeetCode 295. Find Median from Data Stream (堆)
    LeetCode 292. Nim Game(博弈论)
    《JavaScript 模式》读书笔记(4)— 函数2
    《JavaScript 模式》读书笔记(4)— 函数1
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数3
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数2
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数1
    《JavaScript 模式》读书笔记(2)— 基本技巧3
    《JavaScript 模式》读书笔记(2)— 基本技巧2
    《JavaScript 模式》读书笔记(2)— 基本技巧1
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/6840443.html
Copyright © 2011-2022 走看看