在EORow或者VORow中对数据进行重复性校验
生活随笔
收集整理的這篇文章主要介紹了
在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中对数据进行重复性校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript事件代理和委托
- 下一篇: 第二次作业+105032014098