2014-06-14 BaoXinjian
一、摘要
在OAF中,似乎不是根据你光标所在的行来删除对应的记录,而是根据记录指针来删除,而这个指针又与你的光标位置无关
需要用代码来精确的定位.因此我们在删除记录时,需要编写一定的代码来实现.
User’s Guide中提供了一种标准的删除方法,通过在在当前记录集中用指针进行循环来定位需要删除的记录(例子提供的是只删一条).
不管如何删除,总的实现思路如下:
我觉得挺麻烦,又找了找,总结了几种方法.
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方法并传入参数
}
执行效果就是当用户点击某行的删除图标,该行即被删除。
此方法利用记录数组来遍历. 伪码如下:
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(); //提交
}
}
这个方法是根据删除标记来确定记录集,然后把这个集的所有记录删除,效果与上面差不多
二、案例1. 单记录删除
案例:选中一条Expense Line,点击Delete,删除该条记录
1. 选中需删除的该记录
2. 调用CO中的方法
3. 调用AM中的方法,对Row进行操作,删除选中的记录
4. 删除该记录后,系统不再显示
三、案例2 批量记录删除
案例:选中多条Expense Line,点击Delete,删除这多条条记录
1. 选中需删除的该记录
2. 调用CO中的方法
3. 调用AM中的方法,对Row进行操作,删除选中的记录
4. 删除该记录后,系统不再显示
参考: Tony Liu深入EO系列
Thanks and Regards
OAF_OAF EO系列增删改 - Delete详解和实现(案例),布布扣,bubuko.com
OAF_OAF EO系列增删改 - Delete详解和实现(案例)
原文:http://www.cnblogs.com/eastsea/p/3788577.html