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

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