在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中对数据进行重复性校验的更多相关文章
- 在EO中对数据的重复性进行验证
只有在数据提交到EO中的时候才会执行set方法进行验证. 如果想要实现实时验证,可以在输入参数的地方添加事件,但是无需为此事件创建方法. 我的理解: 1.我们在页面上对内容进行修改的时候,OAF框架仅 ...
- SpringMvc中的数据校验
SpringMvc中的数据校验 Hibernate校验框架中提供了很多注解的校验,如下: 注解 运行时检查 @AssertFalse 被注解的元素必须为false @AssertTrue 被注解的元素 ...
- Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数
11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...
- ASP.NET中后台数据和前台控件的绑定
关于ASP.NET中后台数据库和前台的数据控件的绑定问题 最近一直在学习个知识点,自己创建了SQL Server数据库表,想在ASP.NET中连接数据库,并把数据库中的数据显示在前台,注意,这里的数据 ...
- SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据
这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- [数据科学] 从csv, xls文件中提取数据
在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...
- 怎样简单灵活地将DataTable中的数据赋值给model
最近在做的一个项目中,有13个方法都需要用到同一种处理方式:通过SQL语句从数据库获取一条指定的数据,并将该数据中的每个值都赋值给一个model,再将这个model中的数据通过微信发送出去.每个方法都 ...
- DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)
/// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...
随机推荐
- tensorflow和python操作中的笔记
前一段时间做了一些项目,把一些笔记放在了txt中,现分享出来,自己也能够时长预习. 1) 读取文件时,将固定的文件地址,采用数组或者字符串的形式,提前表示出来,后期使用时候采用拼接操作 2) # 得到 ...
- HTML实例 - 购物商场页面
效果图 代码 https://coding.net/u/James_Lian/p/Shopping-page/git 示例 https://coding.net/u/James_Lian/p/Shop ...
- 双态运维:如何让CMDB配置维护更贴近人性
近来很多行业内的大佬关于CMDB连连发声,CMDB的关注度持续高涨,CMDB的前生就是长满雀斑的丑媳妇,扭扭捏捏不受待见这么多年,终于熬出头要见公婆了.哎,她的贤惠谁能懂? 言归正传,在拜读了多篇大牛 ...
- docker 离线环境安装oracle
因测试需要,需在内网的测试环境搭建一套docker Oracle 11g环境进行测试,测试环境为redhat 6.6 安装docker 1.7,本机windows 7 环境,安装docker 17.1 ...
- 【Loadrunner】使用LoadRunner上传及下载文件
使用LoadRunner上传及下载文件 1)LoadRunner上传文件 web_submit_data("importStudent.do", "Action=http ...
- Mysql中的auto_increment
Mysql中的auto_increment 1.创建 2.使用 [1]如果不写固定列,则必须要插入该列,可以直接写Null,否则会报错 [2]可以直接在auto_increment 列上直接插入显式值 ...
- C#基础笔记(第九天)
1.面向过程<-->面向对象面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 面向对象:找个对象帮你做事儿.意在写出一个通用的代码,屏蔽差异. 每个人都有姓名,性别,身高 ...
- Visual Studio 2017企业版 Enterprise 注册码 专业版Professional 激活码key
Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QFVisual Studio 2017(VS2017 ...
- java基础语法 数组
数组是相同数据类型元素的集合 数组本身是引用数据类型,即对象.但是数组可以存储基本数据类型,也可以存储引用数据类型. 在java中如果想要保存一组基本类型的数据,使用数组:如果想保存一组对象或者其 ...
- docker——三剑客之Docker Machine
Docker Machine是Docker官方三剑客项目之一,负责使用Docker的第一步,在多种平台上快速安装Docker环境.它支持多种平台,让用户在很短时间内搭建一套Docker主机集群. Ma ...