ITPub博客

首页 > 数据库 > Oracle > OAF学习笔记-JAVA Entity Object 之 Delete Data(深入EO系列)

OAF学习笔记-JAVA Entity Object 之 Delete Data(深入EO系列)

Oracle 作者:贾三灌汤包 时间:2014-04-03 15:12:27 0 删除 编辑
Delete data(删除数据)

FORM里面删除记录相当的容易,因为FORM可以根据你光标所在的行来删除当前记录,只要简单的在Trigger里面写上delete_record 就可以了.

但在OAF,目前我所知道的删除都有些麻烦(不排除有方便的方法,有待研究).

为什么麻烦呢? OAF,似乎不是根据你光标所在的行来删除对应的记录,而是根据记录指针来删除,而这个指针又与你的光标位置无关,

需要用代码来精确的定位.因此我们在删除记录时,需要编写一定的代码来实现.

User’s Guide中提供了一种标准的删除方法,通过在在当前记录集中用指针进行循环来定位需要删除的记录(例子提供的是只删一条).

我觉得挺麻烦,又找了找,总结了几种方法.

  1. 单记录删除:  不需要用循环处理,结合SPEL ("Simplest Possible Expression Language")语言即可实现.
  2. 批量记录删除: 方法有好几种,觉得User’s Guide中的最麻烦(也许是最严谨的).

不管如何删除,总的实现思路如下:

  1. 首先给需要删除的记录做标记:  要么打勾选上,要么在行上放个图标按钮来点火,总之,方法很多.
  2. 其次根据标记来精确定位记录指针: 单个删除一定性定位,多条记录需定位多次.
  3. 最好弹出确认,以便防止误删除.
  4. 执行删除并提交.

,下面先来看看单记录的删除吧:

实现方法:

  1. PageLayout上建立一个FormParameter. 名为” WantToDeleteId”. 将要用来存放需要删除的行的主键ID.
  2. VO中建个伪列, 值为Null, 名称定为Deleteflag. 用来生成删除按钮.
  3. 在记录行上加一个图标按钮,用来触发删除动作,并提取所要删除行的Primary Key.如下:

ID:                    DeleteFlag

Item Style.:        Image

Image Url:         deleteicon_enabled.gif (就是那个经典的小垃圾筒)

View Instance: 

View Attribute:  Deleteflag

Action Type:     FireAction

Event:              delete (名称自定)

Submit:             True

Parameters:    

                         Name:   “ WantToDeleteId”

                         Value:  ${oa. . }  例如: ${oa.OrderLineVO.LineId}   这就是SPEL语言

当点击这个图标时,OAF会提取Primary Key的值,并传给Form. parameter.

  1. AM中编写删除记录的代码,如下:

             import oracle.jbo.Row;

             ...

             public void removedata(String deleteId)

  {

    OAViewObjectImpl vo1 = this.getOrderLineVO1(); //实例化VO

    int  delid = Integer.parseInt(deleteId); // 转换传入的主键IDint

    Row row = vo1.getFirstFilteredRow("LineId",new Number(delid)); //获取根据ID所查询出的行.

    row.remove(); //删除

    getTransaction().commit(); //提交

}

请注意,一般主键都为Number,而通过CO传过来的参数一般都为String, 所以需要进行转换.

  1. 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方法并传入参数

         

     }

执行效果就是当用户点击某行的删除图标,该行即被删除。

再来看看批量记录的删除吧。

实现方法:

  1. VO中建个伪列, 值为Null, 名称定为Deleteflag. 用来生成复选框。
  2. AM中建立代码,用来删除用户选中的记录,代码如下:
    1. 方法1 参照User’s Guide,利用RowIndex来遍历
    2. 方法2 利用记录的筛选功能实现,利用数组指针遍历
    3. 方法3 利用记录指针的位移来遍历
  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

    {

      Row row = vo1.getCurrentRow(); //取得当前记录

      if ("Y".equals(row.getAttribute("Deleteflag"))) //判断是否可删除

      {

        row.remove();

        getTransaction().commit();

        rowcount = rowcount-1; //删除后,记录数减1

      }

      else

      {

      vo1.next(); //移动指针(如果删除成功,后面记录补上来的话,应不用移用指针

     

      }

    }

  }


 














来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22816976/viewspace-1135456/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-11-03

  • 博文量
    128
  • 访问量
    222993