案例:通过Lov选择组织,然后自动筛选职位的记录,职位用Choice控制选择。而且还要实现回填(当修改记录时)
基本原理:当Lov回填事件触发时(isLovEvent=true),读取Lov的返回值列表,找出关联两个VO的键值,作为Choice对应的VO的查询条件,构建动态SQL,刷新VO
基本步骤:
1 为组织和职位创建VO,两个VO需要有一个外键关联,比如OrganizationId
2 为组织建立Lov(Lov region,本页上的MessageLovInput),LovMap是组织名称,和组织ID,注意组织ID(OrganizationId)的Return值选择一个控件,比如OrgId(我使用一个FormValue)
3 为职位建立Choice,注意:Instance必须要写,否则筛选不成功,该Instance就是注入到本页AM中的VO实例的名称。Definition,Display和Value都正常填写即可。
4 在本页的AM中添加组织和职位的VO,在本页的Controller中的processFormRequest中写下如下代码:
- if (pageContext.isLovEvent())
- {
-
- String lovInputSourceId = pageContext.getLovInputSourceId();
-
- if("OrganizationLovInput".equalsIgnoreCase(lovInputSourceId))
- {
- Hashtable lovResults =pageContext.getLovResultsFromSession(lovInputSourceId);
- if (lovResults != null)
- {
- Set entrySet=lovResults.entrySet();
- Iterator iteResult=entrySet.iterator();
- while(iteResult.hasNext())
- {
- Map.Entry me=(Map.Entry)iteResult.next();
- String key=(String)me.getKey();
- String value=(String)me.getValue();
-
-
- if("OrgId".equalsIgnoreCase(key))
- {
- Serializable[] params = { value };
-
- <span style="background-color: #ffff00;"> am.invokeMethod("changePositionChoiceOption",params);</span>
- }
- }
-
- }
- }
-
- }
-
由于项目中多处使用这堆代码,就写了个POJO:
- import oracle.apps.fnd.framework.webui.OAPageContext;
- import oracle.apps.fnd.framework.OAApplicationModule;
- import java.util.Hashtable;
- import java.util.Set;
- import java.util.Iterator;
- import java.util.Map;
- import java.io.Serializable;
-
- public class ChoiceOptionSelectorCommand
- {
- private OAPageContext pageContext;
- private OAApplicationModule am;
- public ChoiceOptionSelectorCommand()
- {
- }
-
- public ChoiceOptionSelectorCommand(OAPageContext pageContext,OAApplicationModule am)
- {
- this.pageContext=pageContext;
- this.am=am;
- }
-
- public void execute(String msgChoice,String criteria,String method)
- {
- System.out.println("execute");
- if (pageContext.isLovEvent())
- {
-
- String lovInputSourceId = pageContext.getLovInputSourceId();
-
-
- if(msgChoice.equalsIgnoreCase(lovInputSourceId))
- {
- Hashtable lovResults =pageContext.getLovResultsFromSession(lovInputSourceId);
- if (lovResults != null)
- {
- Set entrySet=lovResults.entrySet();
- Iterator iteResult=entrySet.iterator();
- while(iteResult.hasNext())
- {
- Map.Entry me=(Map.Entry)iteResult.next();
- String key=(String)me.getKey();
- String value=(String)me.getValue();
-
- if(criteria.equalsIgnoreCase(key))
- {
- Serializable[] params = { value };
- am.invokeMethod(method,params);
- }
- }
-
- }
- }
-
- }
- }
- }
可以在Controller里这样调用:
- ChoiceOptionSelectorCommand choiceSelector=new ChoiceOptionSelectorCommand(pageContext,am);
-
- choiceSelector.execute("Organization","OrgId","changePositionChoiceOption");
Organization是MessageLovInput的名字,OrgId是Lov中LovMap里的Return对应的Item的名字, changePositionChoiceOption是AM中改变Choice选项列表的方法。
5 在Am中添加changePositionChoiceOption方法,以OrgId作为参数,实际上是调用PositionVO的查询方法,完成数据填充。