零雨其蒙's Blog

做优秀的程序员
随笔 - 59, 文章 - 13, 评论 - 58, 引用 - 0
数据加载中……

MessageLovInput级联MessageChoice

案例:通过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中写下如下代码:

 

Java代码 
  1. if (pageContext.isLovEvent())  
  2.     {  
  3.         
  4.         String lovInputSourceId = pageContext.getLovInputSourceId();  
  5.          
  6.        if("OrganizationLovInput".equalsIgnoreCase(lovInputSourceId))  
  7.        {  
  8.            Hashtable lovResults =pageContext.getLovResultsFromSession(lovInputSourceId);  
  9.             if (lovResults != null)  
  10.             {  
  11.                 Set entrySet=lovResults.entrySet();  
  12.                 Iterator iteResult=entrySet.iterator();  
  13.                while(iteResult.hasNext())  
  14.                {  
  15.                     Map.Entry me=(Map.Entry)iteResult.next();  
  16.                     String key=(String)me.getKey();  
  17.                     String value=(String)me.getValue();  
  18.                     
  19.                      
  20.                     if("OrgId".equalsIgnoreCase(key))  
  21.                      {                     
  22.                       Serializable[] params = { value };  
  23.                         
  24.                     <span style="background-color: #ffff00;">  am.invokeMethod("changePositionChoiceOption",params);</span>  
  25.                      }  
  26.                }                
  27.               
  28.             }  
  29.        }  
  30.         
  31.     }  
  32.       

 

      由于项目中多处使用这堆代码,就写了个POJO:

 

Java代码 
  1. import oracle.apps.fnd.framework.webui.OAPageContext;  
  2. import oracle.apps.fnd.framework.OAApplicationModule;  
  3. import java.util.Hashtable;  
  4. import java.util.Set;  
  5. import java.util.Iterator;  
  6. import java.util.Map;  
  7. import java.io.Serializable;  
  8.   
  9. public class ChoiceOptionSelectorCommand   
  10. {  
  11.   private  OAPageContext pageContext;  
  12.   private  OAApplicationModule am;  
  13.   public ChoiceOptionSelectorCommand()  
  14.   {  
  15.   }  
  16.   
  17.    public ChoiceOptionSelectorCommand(OAPageContext pageContext,OAApplicationModule am)  
  18.   {  
  19.     this.pageContext=pageContext;  
  20.     this.am=am;  
  21.   }  
  22.   
  23.   public  void execute(String msgChoice,String criteria,String method)  
  24.   {  
  25.     System.out.println("execute");  
  26.      if (pageContext.isLovEvent())  
  27.      {  
  28.         
  29.          String lovInputSourceId = pageContext.getLovInputSourceId();  
  30.           
  31.       
  32.         if(msgChoice.equalsIgnoreCase(lovInputSourceId))  
  33.         {  
  34.             Hashtable lovResults =pageContext.getLovResultsFromSession(lovInputSourceId);  
  35.              if (lovResults != null)  
  36.              {  
  37.                  Set entrySet=lovResults.entrySet();  
  38.                  Iterator iteResult=entrySet.iterator();  
  39.                 while(iteResult.hasNext())  
  40.                 {  
  41.                      Map.Entry me=(Map.Entry)iteResult.next();  
  42.                      String key=(String)me.getKey();  
  43.                      String value=(String)me.getValue();  
  44.                             
  45.                      if(criteria.equalsIgnoreCase(key))  
  46.                       {                     
  47.                        Serializable[] params = { value };                        
  48.                        am.invokeMethod(method,params);  
  49.                       }  
  50.                 }                
  51.                
  52.              }  
  53.         }  
  54.          
  55.      }  
  56.   }  
  57. }  

 

    可以在Controller里这样调用:

    

Java代码 
  1. ChoiceOptionSelectorCommand choiceSelector=new ChoiceOptionSelectorCommand(pageContext,am);  
  2.         
  3.     choiceSelector.execute("Organization","OrgId","changePositionChoiceOption");  

    Organization是MessageLovInput的名字,OrgId是Lov中LovMap里的Return对应的Item的名字, changePositionChoiceOption是AM中改变Choice选项列表的方法。

 

   5 在Am中添加changePositionChoiceOption方法,以OrgId作为参数,实际上是调用PositionVO的查询方法,完成数据填充。

posted on 2011-08-02 13:30 零雨其蒙 阅读(461) 评论(1)  编辑  收藏 所属分类: Oracle EBS

评论

# re: MessageLovInput级联MessageChoice  回复  更多评论   

Hashtable lovResults =pageContext.getLovResultsFromSession(lovInputSourceId);
Set entrySet=lovResults.entrySet();
Iterator iteResult=entrySet.iterator();
对于上面用lovResults获得集合Set我有新的见解,说出来与大家一起讨论。
因为选择LOV的值,只能选择一条记录,所以可以不用Set集合来取值,
用String orgID = lovResults.get("OrgId");
Serializable[] params = { orgID };
am.invokeMethod("changePositionChoiceOption",params);
2013-07-14 16:23 | 柳生

只有注册用户登录后才能发表评论。


网站导航: