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


由于本次需求仅需要对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. Python的Flask框架应用调用Redis队列数据的方法

    转自:http://www.jb51.net/article/86021.htm 任务异步化 打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器, ...

  2. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  3. POJ3070:Fibonacci(矩阵快速幂模板题)

    http://poj.org/problem?id=3070 #include <iostream> #include <string.h> #include <stdl ...

  4. PAT 1137 Final Grading[一般][排序]

    1137 Final Grading(25 分) For a student taking the online course "Data Structures" on China ...

  5. [golang note] 工程组织

    golang项目目录结构 <golang_proj> ├─README                 ├─AUTHORS                 ├─<bin>    ...

  6. Java基础知识Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是相对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  7. Qt编译出错:“Cannot find file...... .pro."

    刚接触Qt,使用Qt5.7时,出现如下编译错误: 其实原因很简单,就是Qt工程目录不能有“中文”.“全角符字符”[暂时发现这两种情况].

  8. 正在尝试解析依赖项“MvvmLightLibs (≥ 5.2.0.0)”。 “MvvmLightLibs”已拥有为“CommonServiceLocator”定义的依赖项

    正在尝试解析依赖项"MvvmLightLibs (≥ 5.2.0.0)". "MvvmLightLibs"已拥有为"CommonServiceLoca ...

  9. 20145335郝昊《网络对抗》逆向及Bof基础实践

    20145335郝昊<网络对抗>逆向及Bof基础实践 1.实践说明 本次实践是对一个名为pwn1的可执行Linux文件进行操作.程序的执行流程是:主函数main调用foo函数,foo将函数 ...

  10. Makefile解析(最简单的LED)

    ①led_sp.bin: start.o led.o #led_sp.bin是由 start.o 和 led.o 生成 ②arm-linux-ld -Ttext 0x0 -o led_sp.elf $ ...