OAF—Entity Object 之 Delete Data

在FORM里面删除记录相当的容易,因为FORM可以根据你光标所在的行来删除当前记录,只要简单的在Trigger里面写上delete_record就可以了.
但在OAF中,目前我所知道的删除都有些麻烦(不排除有方便的方法,有待研究).
为什么麻烦呢?在OAF中,似乎不是根据你光标所在的行来删除对应的记录,而是根据记录指针来删除,而这个指针又与你的光标位置无关,
需要用代码来精确的定位.因此我们在删除记录时,需要编写一定的代码来实现.
User’s Guide中提供了一种标准的删除方法,通过在在当前记录集中用指针进行循环来定位需要删除的记录(例子提供的是只删一条).
我觉得挺麻烦,又找了找,总结了几种方法.
单记录删除: 不需要用循环处理,结合SPEL ("Simplest Possible Expression Language")语言即可实现.
批量记录删除:方法有好几种,觉得User’s Guide中的最麻烦(也许是最严谨的).
 
不管如何删除,总的实现思路如下:
首先给需要删除的记录做标记: 要么打勾选上,要么在行上放个图标按钮来点火,总之,方法很多.
其次根据标记来精确定位记录指针:单个删除一定性定位,多条记录需定位多次.
最好弹出确认,以便防止误删除.
执行删除并提交.
 
好,下面先来看看单记录的删除吧:
实现方法:
在PageLayout上建立一个FormParameter.名为” WantToDeleteId”.将要用来存放需要删除的行的主键ID.
在VO中建个伪列,值为Null,名称定为Deleteflag.用来生成删除按钮.
在记录行上加一个图标按钮,用来触发删除动作,并提取所要删除行的Primary Key.如下:
ID:                    DeleteFlag
Item Style.:        Image
Image Url:         deleteicon_enabled.gif (就是那个经典的小垃圾筒)
View Instance: <your VO name>
View Attribute: Deleteflag
Action Type:    FireAction
Event:             delete (名称自定)
Submit:            True
Parameters:   
                        Name:  “ WantToDeleteId”
                        Value: ${oa.<your VO name> . <Primary Key name>}  例如: ${oa.OrderLineVO.LineId}   这就是SPEL语言
 
 
当点击这个图标时,OAF会提取Primary Key的值,并传给Form. parameter.
 
在AM中编写删除记录的代码,如下:
             import oracle.jbo.Row;
             ...
            public void removedata(String deleteId)
 {
   OAViewObjectImpl vo1 = this.getOrderLineVO1(); //实例化VO
   int delid = Integer.parseInt(deleteId); //转换传入的主键ID为int型
   Row row = vo1.getFirstFilteredRow("LineId",new Number(delid)); //获取根据ID所查询出的行.
   row.remove(); //删除
   getTransaction().commit(); //提交
}
 
请注意,一般主键都为Number型,而通过CO传过来的参数一般都为String,所以需要进行转换.
 
在CO中编写代码用来点火并调用AM的代码,如下:
                import java.io.Serializable;
                ...
                if ("delete".equals(pageContext.getParameter(EVENT_PARAM))) //识别事件名称
 
    {
        String aa =pageContext.getParameter("WantToDeleteId "); //获取Form. parameter的值
        Serializable[] parameters = {aa}; //定义参数
        am.invokeMethod("removedata",parameters); //调用AM方法并传入参数
        
    }
 
执行效果就是当用户点击某行的删除图标,该行即被删除。
 
再来看看批量记录的删除吧。
实现方法:
在VO中建个伪列,值为Null,名称定为Deleteflag.用来生成复选框。
在AM中建立代码,用来删除用户选中的记录,代码如下:
方法1:参照User’s Guide,利用RowIndex来遍历
方法2:利用记录的筛选功能实现,利用数组指针遍历
方法3:利用记录指针的位移来遍历
在CO中调用AM的方法,实现删除。
 
方法1:此方法利用RowIndex来遍历记录集,伪码如下:
import oracle.jbo.RowSetIterator;

public void deletedata()
 {
   OAViewObjectImpl vo1 = this.getOrderLineVO1(); //实例化VO
   OrderLineVORowImpl row = null; //这行有没有无所谓吧…
   int rowcount = vo1.getFetchedRowCount(); //取当前提取的记录集的记录数
   RowSetIterator deleteIter = vo1.createRowSetIterator("deleteIter"); //建立记录集的指示器
  
   if (rowcount > 0)
   {
     deleteIter.setRangeStart(0); //设置循环起点,相当于移动指针到第一条记录
     deleteIter.setRangeSize(rowcount); //设置循环次数
     for (int i = 0; i < rowcount; i++)
     {
       row = (OrderLineVORowImpl)deleteIter.getRowAtRangeIndex(i); //取得当前记录
       String primaryKey = (String)row.getDeleteflag(); //取得删除依据的主键值.
       if ("Y".equals(primaryKey)) //判断是否要删除
       {
      
         row.remove();
        
         getTransaction().commit();
         rowcount = rowcount-1; //这行很重要,因为删除一条后,总的循环次数要减1,否则会溢出
         i=i-1; //这行也很重要,因为删除一条后,原来后面的一条会补上来,index为删除了的记录的index.
        
       }
              
       }
     }
     deleteIter.closeRowSetIterator();
    
   }
个人感觉,这个方法有点烦,不知Oracle采用这个方法有什么样的考虑.因为经我测试,多记录的删除方法真的有很多.
 
方法2:此方法利用记录数组来遍历.伪码如下:
Import java.jbo.Row

public void deletedata()
 {
OAViewObjectImpl vo1 = this.getOrderLineVO1(); //实例化VO
   Row[] row = vo1.getFilteredRows("Deleteflag", new String(“Y”)); //生成要删除的记录集
 
   for (int i=1;i<=row.length;i++) //根据记录集的记录数进行循环
   {
     row[i].remove(); //删除
     getTransaction().commit(); //提交
   }
}
 
这个方法是根据删除标记来确定记录集,然后把这个集的所有记录删除,效果与上面差不多…
 
 
方法3:此方法利用记录的指针位移来遍历,伪码如下(还没测):
public void deletedata2()
 {
   OAViewObjectImpl vo1 = this.getOrderLineVO1(); //实例化VO
   vo1.first(); //定位记录指针到第一条
   int rowcount = vo1.getFetchedRowCount(); //取得记录数
   for (int i=0; i<rowcount; i++)
   {
     Row row = vo1.getCurrentRow(); //取得当前记录
     if ("Y".equals(row.getAttribute("Deleteflag"))) //判断是否可删除
     {
       row.remove();
       getTransaction().commit();
       rowcount = rowcount-1; //删除后,记录数减1
     }
     else
     {
     vo1.next(); //移动指针(如果删除成功,后面记录补上来的话,应不用移用指针
    
     }
   }
 }

 

作者“红豆加奶”


原文地址:http://www.2cto.com/database/201109/102496.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章