下拉列表的級聯顯示是非常常用的一種界面顯示效果,在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