OAF_EO系列6 - Delete详解和实现(案例)

简介: 2014-06-14 Created By BaoXinjian 一、摘要 在OAF中,似乎不是根据你光标所在的行来删除对应的记录,而是根据记录指针来删除,而这个指针又与你的光标位置无关 需要用代码来精确的定位.

2014-06-14 Created By BaoXinjian

一、摘要


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

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

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

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

Step1. 首先给需要删除的记录做标记:  要么打勾选上,要么在行上放个图标按钮来点火,总之,方法很多.

Step2. 其次根据标记来精确定位记录指针: 单个删除一定性定位,多条记录需定位多次.

Step3. 最好弹出确认,以便防止误删除.

Step4. 执行删除并提交.

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

 

二、单记录删除


单记录删除:

不需要用循环处理,结合SPEL ("Simplest Possible Expression Language")语言即可实现.

具体实现方式

Step1. 在PageLayout上建立一个FormParameter. 名为” WantToDeleteId”. 将要用来存放需要删除的行的主键ID.

在VO中建个伪列, 值为Null, 名称定为Deleteflag. 用来生成删除按钮.

在记录行上加一个图标按钮,用来触发删除动作,并提取所要删除行的Primary Key.如下:

Action Type:     FireAction

Event:              delete (名称自定)

Submit:             True

Parameters:  Name:   “ WantToDeleteId”

Value:  ${oa.<your VO name> . <Primary Key name>}  例如: ${oa.OrderLineVO.LineId}   这就是SPEL语言

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

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

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, 所以需要进行转换.

Step3. 在CO中编写代码用来点火并调用AM的代码, 如下:

if ("delete".equals(pageContext.getParameter(EVENT_PARAM)))  //识别事件名称{

         String aa =pageContext.getParameter("WantToDeleteId ");  //获取Form. parameter 的值

         Serializable[] parameters = {aa}; //定义参数

         am.invokeMethod("removedata",parameters);  //调用AM方法并传入参数

     }

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

 

三、批量记录删除


批量记录删除: (Tony大神介绍了跟多的方法,在此引用了其中三种)

Step1. 在VO中建个伪列,值为Null,名称定为Deleteflag,用来生成复选框。

Step2. 在AM中建立代码,用来删除用户选中的记录,代码如下:

方法1:参照User’s Guide,利用RowIndex来遍历

方法2:利用记录的筛选功能实现,利用数组指针遍历

方法3:利用记录指针的位移来遍历

Step3. 在CO中调用AM的方法,实现删除。

 

方法1:此方法利用RowIndex来遍历记录集,伪码如下:

个人感觉,这个方法有点烦,不知Oracle采用这个方法有什么样的考虑.因为经我测试,多记录的删除方法真的有很多.

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();
}

 

方法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(); //移动指针(如果删除成功,后面记录补上来的话,应不用移用指针 } } }

 

四、案例1. 单记录删除


案例:选中一条Expense Line,点击Delete,删除该条记录

1. 选中需删除的该记录

2. 调用CO中的方法

3. 调用AM中的方法,对Row进行操作,删除选中的记录

4.  删除该记录后,系统不再显示

 

三、案例2 批量记录删除


案例:选中多条Expense Line,点击Delete,删除这多条条记录

1. 选中需删除的该记录

2. 调用CO中的方法

3. 调用AM中的方法,对Row进行操作,删除选中的记录

4.  删除该记录后,系统不再显示

 

Thanks and Regards

参考: Tony Liu深入EO系列

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
MybatisPlus-标准CRUD制作,新增boolean save(T t),删除 ~ delete(int id),修改 ~ update(T t),根据id查询,T getById....
|
前端开发
Ember Data 之记录操作:创建、更新和删除
前面在《Ember.js 项目开发之 Ember Data》介绍了Ember Data 和 《Ember Data 之模型定义》、《Ember Data 之记录查询》,本文将继续介绍记录操作:创建、更新和删除。
142 0
|
测试技术
OAF_开发系列24_实现OAF更新记录显示Record History(案例)
20150716 Created By BaoXinjian 一、摘要 OAF页面控件中显示记录历史信息有如下的限制: 1. 首先当然是后台的表结构中必须包含WHO字段列了 2. 基于的视图对象必须是非PL/SQL的可更新VO 3.
1062 0
|
Oracle 关系型数据库
OAF_开发系列20_实现OAF打印功能
ddddd   添加一个页面级的button区域:pagebuttonBar,在之下添加button item ,这里主要设置的参数有:采用默认的oaf的打印按钮的id名称: IcxPrintablePageButton,设置属性集为:/oracle/apps/fnd/attributesets...
1183 0
|
关系型数据库
OAF_开发系列19_实现OAF对话框提示dialogPage(案例)
20150716 Created By BaoXinjian 一、摘要 Oracle dialogPage是OAF提示框的一种用法,具体应用例如在删除数据时,提示用户进行确认是否可以删除   二、实现方法 在CO中添加如下方法 public void processFormR...
1523 0
|
关系型数据库 测试技术
OAF_开发系列13_实现OAF通过Vector动态查询设置(案例)
20150715 Created By BaoXinjian 一、摘要 Oracle OAF Guide上介绍的标准客制化查询的方式,在多条件下进行查询 具体实现步骤如下 Step1.在controler中的processRequest 的方法中调用 (1).
1634 0
OAF_开发系列06_实现OAF属性集的介绍和开发Attribute Set(案例)
20150705 Created By BaoXinjian 一、摘要 EBS OAF开发中属性集(Attribute Set)的介绍和手工实现。 在OAF开发中就和Form开发中一样,有时也要给一些对象设置统一的特定属性。
1425 0
|
测试技术
OAF_开发系列04_实现OAF查询4种不同的实现方式的比较和实现(案例)
2014-06-02 Created By BaoXinjian 一、摘要 OAF实现查询功能或需求,一般都会采用以下四种方式 (1). ResultBasedSearch 最简单的实现方式,将结果中某些栏位需要查询的栏位的属性search设定为true即可 (2).
1774 0