`
dragonxiangfu
  • 浏览: 156745 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

OAF开发中一些LOV相关技巧

 
阅读更多

在OAF开发中,LOV的使用频率是很高的,它由两部分构成一是页面上的LOV输入框(如OAMessageLovInputBean),二是弹出的LOV模式窗口(OAListOfValueBean)。用户选择LOV的按钮就会弹出LOV窗口,用户在LOV窗口查询并选择了值,可以返回到页面上的LOV输入框。在这里就不赘述如何创建LOV,只说一些平时会碰到的应用:

  1. 控制LOV的查询结果
  2. LOV相关事件
  3. 动态LOV
  4. LOV Choice

<wbr></wbr>

<wbr></wbr>

一,控制LOV的查询结果

1,使用Criteria

很多种情况下都会用到用某一个Item或者某几个Item来控制LOV的结果,例如页面上有一个Item的LOV和一个Organization,因为Item是有库存组织的,所以就有这样的需求,我选择了某一个库存组织的时候,Item的LOV只显示该库存组织下面的Item。

要实现这个功能,首先需要将Organization放入LOV查询语句作为结果集(LOV的VO中加入Oraganization_Id这一列),然后在Item的LOV中新建一个Mapping,Mapping中LOV Region Item选择OrganizationId(LOV中的),而Criteria选择页面上的OrganizationId,注意,这两个不是同一个 Organization。一个是LOV中的,一个是页面上的。

Criteria设置了相应的Item时,在弹出LOV窗口时,会作为验证字段带入LOV窗口,LOV视图对象会自动绑定该值作为查询条件。因为这个自动绑定是对查询的结果集再进行一次条件查询,所以需要将Organization_Id作为查询结果集。

2,Passive Criteria

LOV的Criteria Item也可以手动绑定,也就是在主页面上的作为Criteria Item的字段在传入LOV Region后并不和LOV的查询自动绑定,而是由开发员动态去绑定。这种方法我认为是为了一些高级的查询所设的,例如需要根据传入的一个Flag字段,在查询条件中加入exists…这样的查询条件。

使用Passive Criteria,和LOV的普通Criteria Mapping一样,选择LOV Region Item以及Criteria Item,然后将Programmatic Query选择为True,这样,LOV就不会动态绑定查询条件了。之后,我们在LOV的Region上创建一个CO,在processRequest中得到验证字段:

public void processRequest(OAPageContext pageContext, OAWebBean webBean) {
 super.processRequest(pageContext, webBean);
 OAApplicationModule am = pageContext.getApplicationModule(webBean);
 Dictionary passiveCriteria = pageContext.getLovCriteriaItems(); //此处的LookupType指的是Mapping中的Lov Region Item的ID
String lovCriteria = (String)passiveCriteria.get("LookupType");
OAViewObject lovVO = (OAViewObject)am.findViewObject("FndLookupTypeLovVO1"); //根据得到的验证字段限定查询结果
lovVO.setWhereClause("");
lovVO.executeQuery(); } 

二、LOV事件

对于MessageTextInput,CheckBox等,可以使用Client Action来触发事件,假如一个CheckBox,可以为它做一个fireAction来控制比如打勾了以后改变某一个字段的值或者一些类似的控制。这些事件可以在页面CO中的processFormRequest中使用pageContext.getParameter(EVENT_PARAM)获得。但是MessageLovInput是没有fireAction事件的,实际上Lov操作的时候已经存在了一些事件,不需要我们去定义的,可以直接通过pageContext.getParameter(EVENT_PARAM)得到LOV事件。

LOV事件有三种,lovPrepare、lovUpdate、lovValidate(由 pageContext.getParameter(EVENT_PARAM)返回),它们都是在页面CO的processFormRequest中触发的。当点了Lov上的手电筒时,会触发事件lovPrepare。当选中了某一个Lov返回到本页面是,会在formRequest中触发事件 lovUpdate。当在Lov输入框中输入一个唯一的值时,此时会触发Lov验证,这里需要注意的是如果在输入框中输入一个不唯一的值,那么验证会自动的打开Lov窗口让你进行选择,此时在formRequest中是不会触发lovValidate事件的。当在选择了LOV选择的值进行相应的页面处理 (例如控制其他字段是否显示等),就可以在processFormRequest中通过对Lov事件的判断并做相应处理。

 super.processFormRequest(pageContext, webBean);
 OAApplicationModule am = pageContext.getApplicationModule(webBean);
if("ItemCode".equals(pageContext.getLovInputSourceId())) {
     if( "lovUpdate".equals(pageContext.getParameter(EVENT_PARAM)) || "lovValidate".equals(pageContext.getParameter(EVENT_PARAM))) {
am.invokeMethod("controlRevSwitcher", new Serializable[] {pageContext.getParameter(SOURCE_PARAM), pageContext.getParameter("OrganizationIdFV")}); OAAdvancedTableBean tableBean = (OAAdvancedTableBean)webBean.findChildRecursive("VenTrxLinesAdvTbl"); tableBean.queryData(pageContext); } } 

在上例的例子中,由于LOV字段是基于VO的,所以得到所选的LOV的值可以在VO中得到。但是对于不基于VO的LOV,如果需要在页面事件发生的时候就得到选择得到的LOV值,需要用以下方法来获取:

1 2 3 4 5 6 7 8 9 10 11 12 13
// Form was submitted because the user selected // a value from the LOV modal window, // or because the user tabbed out of the LOV input. // Find out which LOV input triggered the event. String lovInputSourceId = pageContext.getParameter(SOURCE_PARAM); // Find out the result values of the LOV. Hashtable lovResults = pageContext.getLovResultsFromSession<wbr></wbr>(lovInputSourceId); if (lovResults != null) { System.out.println("lovResults"+lovResults); // Update the page depending on the value chosen by the user. } 

<wbr></wbr>

三、动态LOV

动态LOV的应用一般很少。在之前沈辉写的一个文档中,是通过先创建一个LOV后,然后在页面事件发生时动态的去改变LOV的SQL实现的。而我的方法是用直接动态创建VO去和LOV Region中的Item进行关联来实现的。

LOV 是通过页面调用我们创建好的Region来实现的,所以这个LOV Region是LOV最为关键的部分,所以实际上,在LOV VO还不存在的时候,只要有Region,我们的LOV就可以创建起来。所以我们可以先创建一个空壳Region,然后在主页面打开的时候再动态的创建 LOV VO,最后将VO与Region中的Table关联。

clip_image002

首先,需要创建一个LOV Region,这个Region并不和任何VO关联,在我的例子中,我创建了5个MessageStyledText,5个FormValue。这些字段字段此时只是设置了Prompt属性,其他属性都是默认,包括Data Type。

clip_image002

接下来,在主页面的ProcessRequest创建LOV Bean(当然也可以在其他页面动作的时候创建LOV)。并且创建LOV VO。

<wbr></wbr>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
import java.io.Serializable; import java.util.ArrayList; import java.util.Hashtable; import oracle.apps.fnd.common.VersionInfo; import oracle.apps.fnd.framework.OAApplicationModule; import oracle.apps.fnd.framework.webui.OAControllerImpl; import oracle.apps.fnd.framework.webui.OAPageContext; import oracle.apps.fnd.framework.webui.beans.OAWebBean; import oracle.apps.fnd.framework.webui.beans.layout.OAHeaderBean; import oracle.apps.fnd.framework.webui.beans.message.OAMessageLovInputBean; public void processRequest(OAPageContext pageContext, OAWebBean webBean) { super.processRequest(pageContext, webBean); OAApplicationModule am = pageContext.getApplicationModule(webBean); OAHeaderBean headerBean = (OAHeaderBean)webBean.findChildRecursive("TestHdRN"); OAMessageLovInputBean lovInput = (OAMessageLovInputBean)createWebBean(pageContext, LOV_TEXT, null, "InputTest"); headerBean.addIndexedChild(lovInput); // Specify the path to the base page. lovInput.setAttributeValue(REGION_CODE, "/alther/oracle/apps/cux/checkboxtest/webui/CheckBoxTestPG"); // Specify the application id of the base page. lovInput.setAttributeValue(REGION_APPLICATION_ID, new Integer(30001)); //此处的Region就是刚才创建的Region lovInput.setLovRegion("/alther/oracle/apps/cux/lov/webui/CommonLovRN", 0); lovInput.setUnvalidated(false); lovInput.setPrompt("Dynamic Lov"); //增加Mapping关系,由于LOV的Mapping在主页面初始化时就会使用到,所以必须创建一些空的Item来做Mapping,否则会报错 lovInput.addLovRelations(pageContext, "InputTest", // base page item "DisplayItem1", // lov item LOV_RESULT, // direction LOV_REQUIRED_NO); lovInput.addLovRelations(pageContext, "InputTest", // base page item "DisplayItem1", // lov item LOV_CRITERIA, // direction LOV_REQUIRED_NO); lovInput.addLovRelations(pageContext, "TestItem", // base page item "DisplayItem2", // lov item LOV_PASSIVE_CRITERIA, // direction LOV_REQUIRED_NO); ArrayList paramList = new ArrayList(); String voName = "FndUserLovVO2"; String sql = "SELECT fu.user_id," + " fu.user_name," + " fu.start_date" + " FROM fnd_user fu"; //paramList是用来创建LOV并在关联时都会用到的每个Item的Attribute paramList.add(new String[]{"UserId", "USER_ID", "oracle.jbo.domain.Number", null, "Hide", null}); paramList.add(new String[]{"UserName", "USER_NAME", "java.lang.String", "100", "Display", "SearchAllow"}); paramList.add(new String[]{"StartDate", "START_DATE", "oracle.jbo.domain.Date", null, "Display", null}); //调用AM方法创建VO am.invokeMethod("createVO", new Serializable[]{voName, sql, paramList}, new Class[]{String.class, String.class, paramList.getClass()}); am.getOADBTransaction().putTransientValue("LovVOInstance", voName); am.getOADBTransaction().putTran
sientValue("LovAttribute", paramList); }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics