案例:通过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 };
am.invokeMethod("changePositionChoiceOption",params);
}
}
}
}
}
由于项目中多处使用这堆代码,就写了个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的查询方法,完成数据填充。