ITPub博客

首页 > 数据库 > Oracle > OAF学习笔记-MessageChoice(Poplist)的级联显示

OAF学习笔记-MessageChoice(Poplist)的级联显示

Oracle 作者:贾三灌汤包 时间:2014-04-03 17:56:54 0 删除 编辑

下拉列表的级联显示是非常常用的一种界面显示效果,FORMS中我常作,作法也很简单,OAF中显然有点麻烦了

现假定有张表,里面有两个字段,一个是Province(),一个是City().

  

现需要在页面上放置两个下拉列表字段,一个选择省,一个选择市,当然,选择市的下拉列表值需要根据省的下拉列表的选择进行筛选.

实现思路:

实际上很简单,FORMS差不多,就是要动态的指定选择市的下拉列表的查询.当选择完省后,立即更新市的查询

实现步骤如下:

  1. 新建一个Project(方法略):

Name :  OAPoplist

Path:      abeam.oracle.apps.icx.poplist

  1. 新建一个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:                    select distinct t.province  from test_lovlist t

新建市的VO(基于SQL):

VO Name:           CityVO

VO Path:              abeam.oracle.apps.icx.poplist.server

SQL:                     select  t.city  from test_lovlist t

  1. 关联AMVO(方法略)
  2. 新建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

   :  蓝色的设置必须要用完整的VO名称.

Citylist:








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

    : 蓝色的设置是我在经历若干次失败后才发现的….请设置为需要进行筛选的VO的名字,注意,只是名称,不需路径

  1. 代码
    1. AM中新建方法对CITYVO进行动态查询

      伪码如下:

          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(); //重新查询

  }

    1. 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)))

总算搞掟了....

<!--
管理员在2009年8月13日编辑了该文章文章。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22816976/viewspace-1135639/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论