在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