下拉列表的级联显示是非常常用的一种界面显示效果,在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