OAF中Delete、Update表内容方法小结

8 篇文章 0 订阅

OAF做更新和删除之前都需要先查询,并且通过VO来操作,VO内部会调用EO,EO主要用于数据验证 

 

按照BC4J的架构,通常是使用CO调用AM,在AM中操作VO以删除或跟新数据,但是当处理具有关联关系的数据时,例如删除一个PoHeader,那么则应该重写PoHeaderEO的remove()方法,以删除PoLine数据.

 

首先放AM删除/更新代码

 

[java]  view plain copy
  1. /**删除单个分类代码示例(官方版)*/      
  2.     OAViewObject vo = (OAViewObject)getCategoryVO1();  
  3.         CategoryVORowImpl row = null;  
  4.         int fetchedRowCount = vo.getFetchedRowCount();  
  5.   
  6.         RowSetIterator deleteIter = vo.createRowSetIterator("deleteIter");  
  7.         if (fetchedRowCount > 0) {  
  8.             deleteIter.setRangeStart(0);  
  9.             deleteIter.setRangeSize(fetchedRowCount);  
  10.             for (int i = 0; i < fetchedRowCount; i++) {  
  11.                 row = (CategoryVORowImpl)deleteIter.getRowAtRangeIndex(i);  
  12.                 Number primaryKey = row.getCategoryId();  
  13.                 if (primaryKey.compareTo(category_id) == 0) {  
  14.                     row.remove();  
  15.                     apply();  
  16.                     break// only one possible selected row in this case  
  17.                 }  
  18.             }  
  19.         }  
  20.         // Always close the iterator when you're done.  
  21.         deleteIter.closeRowSetIterator();  

 

使用这份代码有两个限制:

1.只能删除单行,如果去掉"break"来删除多行,迭代器返回会越界返回NULL值

2.如果数据没有绑定到WebBean控件,那么fetchedRowCount=0;删除不成功

 

仅仅是针对页面的单个绑定行,不知道ORACLE为什么还要把它作为示例代码。

 

为了消除第二条限制,需要做一点修改

[java]  view plain copy
  1. int RowCount = vo.getRowCount();  

这样就可以以纯代码方式操作。

 

如果要删除多行,那么就不能用上面的代码了,我自己写了一段如下

 

[java]  view plain copy
  1. private void deleteComment(int article_id)  
  2. {  
  3. CommentVOImpl vo=(CommentVOImpl)getCommentVO1();  
  4.     CommentVORowImpl row = null;  
  5.        row=(CommentVORowImpl)vo.first();  
  6.     while(row!=null){  
  7.         Number primaryKey = row.getArticleId();  
  8.         if (primaryKey.compareTo(article_id) == 0) {  
  9.         }  
  10.         row.remove();  
  11.         if(vo.hasNext()) row=(CommentVORowImpl)vo.next();  
  12.         else break;  
  13.     }      
  14. }  

这段代码可以使用适用多种情况。

 

当然也可以针对具体情况再做点优化,例如,如果代码中用到的VO没有绑定页面控件,那么可以简单写成

[java]  view plain copy
  1. private void deleteFavorite(int article_id) {  
  2. FavoriteVOImpl vo=(FavoriteVOImpl)getFavoriteVO1();  
  3.     vo.setWhereClause("FavoriteEO.article_id= :1");  
  4.     vo.setWhereClauseParams(null); // Always reset  
  5.     vo.setWhereClauseParam(0new Number(article_id));  
  6.     vo.executeQuery();  
  7.     while(vo.hasNext())  
  8.     {  
  9.     Row row=vo.next();  
  10.     row.remove();  
  11.     }  
  12. }  

 

 

这里主要是涉及迭代器初始位置的问题。

 

 

下面贴一段关联删除的代码,首先要为两个关联的EO创建关系,然后把这段代码用于EO的remove

 

删除一个PoHeader,重写PoHeaderEO的remove()方法,以删除PoLine数据.还限制了可以删除的订单类型哦!

 

[java]  view plain copy
  1. public void remove()  
  2. {  
  3. String status = getStatusCode();  
  4. if (("IN_PROCESS"Equals(status)) || ("REJECTED"Equals(status)))  
  5. {  
  6. // Note this is a good use of the header -> lines association since we  
  7. // want to call remove( ) on each line.  
  8. RowIterator linesIterator = getPurchaseOrderLineEO();  
  9. if (linesIterator != null)  
  10. {  
  11. PurchaseOrderLineEOImpl line = null;  
  12. while (linesIterator.hasNext())  
  13. {  
  14. line = (PurchaseOrderLineEOImpl)linesIterator.next();  
  15. line.remove();  
  16. }  
  17. }  
  18. super.remove(); // Must be called last in this case.  
  19. }  
  20. else  
  21. {  
  22. throw new OARowValException(OARowValException.TYP_ENTITY_OBJECT,  
  23. getEntityDef().getFullName(),  
  24. getPrimaryKey(),  
  25. "ICX"// Message product short name  
  26. "FWK_TBX_T_PO_NO_DELETE"); // Message name  
  27. }  
  28. // end remove()  

 

做更新的话,就把remove()换成setAttribute或setxxxx()就好了

这两个方法和删除都会改变VO状态为modify,如果不提交事务的话会被认为是脏数据的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值