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


由于本次需求仅需要对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. 在EO中对数据的重复性进行验证

    只有在数据提交到EO中的时候才会执行set方法进行验证. 如果想要实现实时验证,可以在输入参数的地方添加事件,但是无需为此事件创建方法. 我的理解: 1.我们在页面上对内容进行修改的时候,OAF框架仅 ...

  2. SpringMvc中的数据校验

    SpringMvc中的数据校验 Hibernate校验框架中提供了很多注解的校验,如下: 注解 运行时检查 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素 ...

  3. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  4. ASP.NET中后台数据和前台控件的绑定

    关于ASP.NET中后台数据库和前台的数据控件的绑定问题 最近一直在学习个知识点,自己创建了SQL Server数据库表,想在ASP.NET中连接数据库,并把数据库中的数据显示在前台,注意,这里的数据 ...

  5. SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据

    这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...

  6. 将Oracle数据库中的数据写入Excel

    将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...

  7. [数据科学] 从csv, xls文件中提取数据

    在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...

  8. 怎样简单灵活地将DataTable中的数据赋值给model

    最近在做的一个项目中,有13个方法都需要用到同一种处理方式:通过SQL语句从数据库获取一条指定的数据,并将该数据中的每个值都赋值给一个model,再将这个model中的数据通过微信发送出去.每个方法都 ...

  9. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

随机推荐

  1. Linux设置程序开机启动-tomcat开机启动

    假设我有一个tomcat应用需要开机启动. 前提你的JAVA环境变量已经配置好没有问题,检测方法如图 然后找到tomcat的目录,我的目录是 /home/yuqing_4.0/tomcat_share ...

  2. Mongo Rocks 在SSD盘上表现优秀,专门为SSD盘的优化

    2017 · MongoDB深圳用户组大会全记录 | MongoDB中文社区http://www.mongoing.com/2017/04/24/mongodb-shenzhen-user-group ...

  3. ES_DEVOPS-1

    When dealing with a large number of parallel operations in elasticsearch, such as search requests or ...

  4. C# WinForm实现任务栏程序图标闪烁

    相信大家在用QQ的时候都会知道,你打开了QQ聊天窗口,如果窗口不是当前激活的窗口的话,收到QQ消息时,任务栏(不是托盘图标)上的图标会闪一下变成黄色(Win7默认主题下),用以通知用户有消息进来了,之 ...

  5. nginx + ngx_lua安装测试

    nginx lua模块淘宝开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力.nginx以高并发而知名,lua脚本轻便,两者的搭配堪称完美. ...

  6. 以太坊api访问,区块同步监测

    以太坊geth api访问,区块同步监测 curl查询geth区块高度 supervisor管理以太坊geth进程 geth进程健康检查 # curl访问geth api #使用curl访问geth ...

  7. CF734F Anton and School 构造+数论

    正解:构造 解题报告: 先放下传送门QwQ 这题首先要知道一个结论:(x&y)+(x|y)=x+y 还是能理解的趴? 所以我们把bi+ci就能得到∑a+n*a[i] 然后我们就能成功求出∑a ...

  8. 【手机自动化测试】monkey测试

    1             概述 Monkey测试是Android自动化测试的一种手段.Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常. 当Mon ...

  9. vue基础篇(一)

    1.简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手 ...

  10. POJ2195:Going Home(费用流入门)

    http://poj.org/problem?id=2195 #include <iostream> #include <stdio.h> #include <strin ...