2009年9月12日星期六

ADF_013:ADF-BC 特色功能之一:级联式下拉列表

说明:本文最后一次修改时间:2011-11-05。
开发环境:JDeveloper 11.1.2.1.0。

完成《Examining ADF Business Components New Features》之 Cascading List of Values

在实际应用中,经常会使用两个级联式下拉列表的情况,比如先选择国家列表,再根据选择的国家显示城市列表。
也就是说城市下拉列表“依赖于”国家下拉列表。
你可以把View Object 某个Attribute定义成LOVs。这样,由于是定义在模型层上,UI界面无需做任何改动。

1. 定义 List of Values
一般来说,某个Attribute的取值范围是某个LOVs,一般来自某个View Object。
如果没有合适的View Object,就需要新定义一个View Object,专门获取这个LOVs。
这里我们专门为Mgr (manager) attribute创建一个VO作为LOV使用,
能够当某个employee的Manager候选范围是和该employee同一个部门的其它employee,或者是其他部门的没有Manager的employee。
Where条件语句如下:(DEPARTMENT_ID = :CurrentDept OR MANAGER_ID IS NULL) AND EMPLOYEE_ID ! = :CurrentEmp


创建View Object时,根据需要选择是否可以修改Entity Object。

2. 配置 List of Values
打开要设置的View Object的Attributes面板,选择Attribute,如DepartmentId。然后在“List of Values:DepartmentId”点击“+”,增加LOVs,名称为LOV_<Attribute_Name>。




注意,List Return Values 表明返回值可以是多个Attributes。比如,产品改变时,产品ID和产品单价都要改变。
而在UI界面上的样子则由UI Hints来决定。



两个级联式下拉列表之所以能够关联上,关键的原因是这里:ManagerListForDepartment1的两个参数CurrentDept和CurrentEmp 分别指向了EmpView中的DepartmentId和EmployeeId。
以此类推,你可以推广到多个级联式下拉列表。

注意返回值ManagerId指向EmployeeId。


在最终的界面上,会知道哪些Attributes是下拉列表,从而用相应的UI组件展示。

思考问题1:完成实验后,在网页上,当部门列表变化时,经理列表并没有变化。这是为什么?如何修改?
把部门列表组件的autoSubmit=true,并把经理列表组件的PPR指向部门列表组件的ID。

思考问题2:其它用户持有锁的问题。
当把Web界面和应用模型界面都打开时,操作应用模型界面的用户改变部门列表时会报如下错误:

右键点击application module,选择 Configurations,选择 Edit,选择Properties tab,选择Property:jbo.locking.mode,把pessimistic 改成optimistic。

重现该问题的另一个办法:在某个页面添加记录,添加未完成,切换到其他页面,然后再切换到这个页面,这时候再编辑记录,会提示“其他用户持有该锁”。

思考问题3:如果忘记为ManagerListForDepartment1的两个参数赋值,如何事后修改?
这个问题经常出现在Workshop中,一些用户忘了给ManagerListForDepartment1的两个参数赋值,想事后添加,却怎么也找不到添加的地方。
我开始在AM的Data Model中找,发现EmployeeView下面并没有ManagerListForDepartment1,见下图:

困惑了好久,只好去LOV的地方找,终于发现就是点击绿色的“+”,会弹出修改界面,见下图:
感觉这里少了一个修改按钮,新增和修改功能都是点击这个绿色的“+”。

选中ManagerListForDepartment1,点击Edit,会弹出参数设置界面,见下图:

也就是说,LOV是定义在VO上的,所以应该在VO的定义中找,而不是在AM的定义中找。

没有评论: