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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值