案例:通過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的查詢方法,完成數據填充。