OAF—MessageChoice(Poplist)的級聯顯示

下拉列表的級聯顯示是非常常用的一種界面顯示效果,在FORMS中我常作,作法也很簡單,可OAF中顯然有點麻煩了…
現假定有張表,裏面有兩個字段,一個是Province(省),一個是City(市).
 
現需要在頁面上放置兩個下拉列表字段,一個選擇省,一個選擇市,當然,選擇市的下拉列表值需要根據省的下拉列表的選擇進行篩選.
 
實現思路:
實際上很簡單,與FORMS差不多,就是要動態的指定選擇市的下拉列表的查詢.當選擇完省後,立即更新市的查詢…
 
實現步驟如下:
新建一個Project(方法略):
Name : OAPoplist
Path:     abeam.oracle.apps.icx.poplist
新建一個Business Component Package(For AM and VO)
新建BC:
Package Name:  abeam.oracle.apps.icx.poplist.server
新建AM:
AM Name:         PoplistAM
AM Path:           abeam.oracle.apps.icx.poplist.server
新建省的VO(基於SQL):
VO Name:          ProvinceVO
VO Path:            abeam.oracle.apps.icx.poplist.server
SQL:                   selectdistinctt.province fromtest_lovlist t
新建市的VO(基於SQL):
VO Name:          CityVO
VO Path:             abeam.oracle.apps.icx.poplist.server
SQL:                    select t.city fromtest_lovlist t
關聯AM與VO(方法略)
新建Web Page及Item
新建Page:
Page Name:  PoplistPG
Page Path:     abeam.oracle.apps.icx.poplist.webui
Root Region: PageLayoutRN
Root Region Type: pagelayout
AM  Definition: PoplistAM
新建Item:
Provincelist :

 

Property

Value

Item style

MessageChoice

Required

Yes(optional)

Add blank value

False

Picklist view Definition

Abeam.oracle.apps.icx.poplist.server.ProvinceVO

Picklist display attribute

Province

Picklist value attribute

Province

 

 

 

Property

Value

Item style

MessageChoice

Required

Yes(optional)

Add blank value

False

Picklist view Definition

Abeam.oracle.apps.icx.poplist.server.CityVO

Picklist view instance

CityVO

Picklist display attribute

City

Picklist value attribute

City

 代碼
在AM中新建方法對CITY的VO進行動態查詢
     僞碼如下:
         public void setCondition (String p_cond)
 {  
   CityVOImpl empvo = this.getCityVO(); //實例化VO
          
   String whereclause = "province = '"+ p_cond +"'"; //組合條件語句
   注: 這裏的province 不能寫成 t.province,即使你的VO中有t, 我一開始加了這個t,總是報錯,後來才發現,如果動態設定這個SQL的話,
    JDEV會把原來的sql做成一個子查詢,然後定義一個系統別名,而這個t無法識別.
   empvo.setWhereClause(whereclause); //設置VO的條件
   empvo.executeQuery(); //重新查詢
 }
在CO中的ProcessFormRequest中調用上述方法
僞碼如下:
 import oracle.apps.fnd.framework.OAApplicationModule;
 import java.io.Serializable;
 public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
 {
   super.processFormRequest(pageContext, webBean); //系統黓認…
 
   OAApplicationModule am = pageContext.getApplicationModule(webBean); //實例化AM
   Serializable[] parameters = { pageContext.getParameter("Provincelist")}; //定義傳入參數並取得省的值.
   am.invokeMethod("setCondition", parameters); //調用方法,生成市的列表.
 
 }
 
完了,保存並運行,發現失敗了….原因是你選擇省後,並不能觸發頁面的POST動作.也就無法運行ProcessFormRequest方法.因此還需做如下設定,也是找了半天,無意中發現的…
設置省下拉列表ITEM的一個屬性:
Property Name: Action Type
Property Value: fireAction (點火)
 
Property Name: Event
Property Value: RefCity (用戶定義的EVENT名稱)
 
設完之後,成功運行…
 
但這有個明顯的BUG,即一旦點火,所有ProcessFormRequest中的代碼都將執行,這顯然是不行的.因此需要先判斷是由這個ITEM點的火,用如下語句判斷:
if ("RefCity".equals(pageContext.getParameter(EVENT_PARAM)))

 

作者“紅豆加奶”


文章原處:http://www.2cto.com/database/201109/102489.html

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