千家信息网

OAF开发中LOV相关技巧有哪些

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,小编今天带大家了解OAF开发中LOV相关技巧有哪些,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学
千家信息网最后更新 2024年11月20日OAF开发中LOV相关技巧有哪些

小编今天带大家了解OAF开发中LOV相关技巧有哪些,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习"OAF开发中LOV相关技巧有哪些"的知识吧。

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

1.控制LOV的查询结果
2.LOV相关事件
3.动态LOV
4.LOV Choice
一,控制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,在proce***equest中得到验证字段:

  1. public void proce***equest(OAPageContext pageContext, OAWebBean webBean)

  2. {

  3. super .proce***equest(pageContext, webBean);

  4. OAApplicationModule am = pageContext.getApplicationModule(webBean);

  5. Dictionary passiveCriteria = pageContext.getLovCriteriaItems();

  6. //此处的LookupType指的是Mapping中的Lov Region Item的ID

  7. String lovCriteria = (String)passiveCriteria.get( "LookupType" );


  8. OAViewObject lovVO = (OAViewObject)am.findViewObject( "FndLookupTypeLovVO1" );

  9. //根据得到的验证字段限定查询结果

  10. lovVO.setWhereClause( "" );

  11. lovVO.executeQuery();

  12. }

二、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事件的判断并做相应处理。

  1. /**Item版本控制,当选择了有版本控制的Item,该行版本字段可修改,如果没有版本控制,该Item版本字段为默认**/

  2. super .processFormRequest(pageContext, webBean);

  3. OAApplicationModule am = pageContext.getApplicationModule(webBean);

  4. if ( "ItemCode" .equals(pageContext.getLovInputSourceId()))

  5. {


  6. /**lovUpdate是在Lov Region选择了Item,lovValidate是在Lov MessageInput控件中输入后触发,在此事件中判断Item是否具有版本控制**/

  7. if ( "lovUpdate" .equals(pageContext.getParameter(EVENT_PARAM))

  8. || "lovValidate" .equals(pageContext.getParameter(EVENT_PARAM)))

  9. {

  10. /**对Revision字段进行控制**/

  11. am.invokeMethod( "controlRevSwitcher" , new Serializable[]

  12. {pageContext.getParameter(SOURCE_PARAM),

  13. pageContext.getParameter( "OrganizationIdFV" )});



  14. /**controlRevSwitcher方法是对版本控件的ReadOnly进行控制,但是页面上不能马上反应,需要使用局部刷新**/

  15. OAAdvancedTableBean tableBean =

  16. (OAAdvancedTableBean)webBean.findChildRecursive( "VenTrxLinesAdvTbl" );

  17. tableBean.queryData(pageContext);

  18. }

  19. }

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

  1. // Form was submitted because the user selected

  2. // a value from the LOV modal window,

  3. // or because the user tabbed out of the LOV input.

  4. // Find out which LOV input triggered the event.

  5. String lovInputSourceId = pageContext.getParameter(SOURCE_PARAM);

  6. // Find out the result values of the LOV.

  7. Hashtable lovResults =

  8. pageContext.getLovResultsFromSession(lovInputSourceId);

  9. if (lovResults != null )

  10. {

  11. System.out.println( "lovResults" +lovResults);

  12. // Update the page depending on the value chosen by the user.

  13. }

三、动态LOV

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

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

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

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

  1. import java.io.Serializable;


  2. import java.util.ArrayList;

  3. import java.util.Hashtable;


  4. import oracle.apps.fnd.common.VersionInfo;

  5. import oracle.apps.fnd.framework.OAApplicationModule;

  6. import oracle.apps.fnd.framework.webui.OAControllerImpl;

  7. import oracle.apps.fnd.framework.webui.OAPageContext;

  8. import oracle.apps.fnd.framework.webui.beans.OAWebBean;

  9. import oracle.apps.fnd.framework.webui.beans.layout.OAHeaderBean;

  10. import oracle.apps.fnd.framework.webui.beans.message.OAMessageLovInputBean;


  11. public void proce***equest(OAPageContext pageContext, OAWebBean webBean)

  12. {

  13. super .proce***equest(pageContext, webBean);

  14. OAApplicationModule am = pageContext.getApplicationModule(webBean);


  15. /*--------------------------------------------------创建LOV Bean----------------------------------------------------*/


  16. OAHeaderBean headerBean = (OAHeaderBean)webBean.findChildRecursive( "TestHdRN" );

  17. OAMessageLovInputBean lovInput = (OAMessageLovInputBean)createWebBean(pageContext, LOV_TEXT, null , "InputTest" );


  18. headerBean.addIndexedChild(lovInput);


  19. // Specify the path to the base page.

  20. lovInput.setAttributeValue(REGION_CODE, "/alther/oracle/apps/cux/checkboxtest/webui/CheckBoxTestPG" );

  21. // Specify the application id of the base page.

  22. lovInput.setAttributeValue(REGION_APPLICATION_ID, new Integer( 30001 ));


  23. //此处的Region就是刚才创建的Region

  24. lovInput.setLovRegion( "/alther/oracle/apps/cux/lov/webui/CommonLovRN" , );


  25. lovInput.setUnvalidated( false );

  26. lovInput.setPrompt( "Dynamic Lov" );


  27. //增加Mapping关系,由于LOV的Mapping在主页面初始化时就会使用到,所以必须创建一些空的Item来做Mapping,否则会报错

  28. lovInput.addLovRelations(pageContext, "InputTest" , // base page item

  29. "DisplayItem1" , // lov item

  30. LOV_RESULT, // direction

  31. LOV_REQUIRED_NO);

  32. lovInput.addLovRelations(pageContext, "InputTest" , // base page item

  33. "DisplayItem1" , // lov item

  34. LOV_CRITERIA, // direction

  35. LOV_REQUIRED_NO);


  36. lovInput.addLovRelations(pageContext, "TestItem" , // base page item

  37. "DisplayItem2" , // lov item

  38. LOV_PASSIVE_CRITERIA, // direction

  39. LOV_REQUIRED_NO);


  40. /*--------------------------------------------------创建LOV VO------------------------------------------------------*/

  41. ArrayList paramList = new ArrayList();

  42. String voName = "FndUserLovVO2" ;

  43. String sql = "SELECT fu.user_id," +

  44. " fu.user_name," +

  45. " fu.start_date" +

  46. " FROM fnd_user fu" ;


  47. //paramList是用来创建LOV并在关联时都会用到的每个Item的Attribute

  48. paramList.add( new String[]{ "UserId" , "USER_ID" , "oracle.jbo.domain.Number" , null , "Hide" , null });

  49. paramList.add( new String[]{ "UserName" , "USER_NAME" , "java.lang.String" , "100" , "Display" , "SearchAllow" });

  50. paramList.add( new String[]{ "StartDate" , "START_DATE" , "oracle.jbo.domain.Date" , null , "Display" , null });

  51. //调用AM方法创建VO

  52. am.invokeMethod( "createVO" , new Serializable[]{voName, sql, paramList},

  53. new Class[]{String. class , String. class , paramList.getClass()});


  54. am.getOADBTransaction().putTransientValue( "LovVOInstance" , voName);

  55. am.getOADBTransaction().putTransientValue( "LovAttribute" , paramList);


  56. }

这是AM中创建VO的方法:

  1. import java.sql.Types;


  2. import java.util.ArrayList;


  3. import oracle.apps.fnd.framework.server.OAApplicationModuleImpl;

  4. import oracle.apps.fnd.framework.server.OADBTransaction;

  5. import oracle.apps.fnd.framework.server.OAViewDef;


  6. import oracle.jbo.AttributeDef;


  7. public void createVO(String voName, String sql, ArrayList list){

  8. OADBTransaction dbtx = getOADBTransaction();

  9. String[] attribute = new String[ 6 ];

  10. int types = - 9999 ;

  11. OAViewDef viewDef = dbtx.createViewDef();


  12. viewDef.setSql(sql);

  13. viewDef.setExpertMode( true );

  14. viewDef.setViewObjectClass( "oracle.apps.fnd.framework.server.OAViewObjectImpl" );

  15. viewDef.setViewRowClass( "oracle.apps.fnd.framework.server.OAViewRowImpl" );


  16. for ( int i = ; i < list.size(); i++){

  17. attribute = (String[])list.get(i);

  18. if ( "java.lang.String" .equals(attribute[ 2 ])){

  19. types = Types.VARCHAR;

  20. }

  21. else if ( "oracle.jbo.domain.Number" .equals(attribute[ 2 ])){

  22. types = Types.NUMERIC;

  23. }

  24. else if ( "oracle.jbo.domain.Date" .equals(attribute[ 2 ])){

  25. types = Types.DATE;

  26. }


  27. if ( "java.lang.String" .equals(attribute[ 2 ])){

  28. viewDef.addSqlDerivedAttrDef( attribute[ ],

  29. attribute[ 1 ],

  30. attribute[ 2 ],

  31. types,

  32. false ,

  33. true ,

  34. AttributeDef.UPDATEABLE,

  35. Integer.parseInt(attribute[ 3 ]));

  36. }

  37. else {

  38. viewDef.addSqlDerivedAttrDef( attribute[ ],

  39. attribute[ 1 ],

  40. attribute[ 2 ],

  41. types,

  42. false ,

  43. true ,

  44. AttributeDef.UPDATEABLE); }

  45. }


  46. if (findViewObject(voName) != null ){

  47. findViewObject(voName).remove();

  48. }


  49. createViewObject(voName, viewDef);

  50. }

最后,在LOV Region的CO中,加入关联的代码。这里需要注意一点,由于我们的LOV VO是创建在主页面的AM下的,所以LOV Region的AM必须和主页面的AM一致。否则,在主页面的变量就无法传到LOV Region中。

  1. public void proce***equest(OAPageContext pageContext, OAWebBean webBean)

  2. {

  3. super .proce***equest(pageContext, webBean);

  4. OAApplicationModule am = pageContext.getApplicationModule(webBean);


  5. String voInstance = (String)am.getOADBTransaction().getTransientValue( "LovVOInstance" );

  6. ArrayList paramList = (ArrayList)am.getOADBTransaction().getTransientValue( "LovAttribute" );

  7. String[] attribute = new String[ 6 ];

  8. int dispalyIndex = 1 ;

  9. int hideIndex = 1 ;


  10. //关联VO

  11. ((OAListOfValuesBean)webBean).setViewUsageName(voInstance);


  12. //将Region中的MessageStyledText都设置为不显示

  13. for ( int i= 1 ; i<= 5 ; i++){

  14. OAMessageStyledTextBean displayItem =

  15. (OAMessageStyledTextBean)webBean.findChildRecursive("DisplayItem"+i);

  16. displayItem.setRendered( false );

  17. }


  18. //将Region中的FormValue都设置为不显示

  19. for ( int i= 1 ; i<= 5 ; i++){

  20. OAFormValueBean hideItem =

  21. (OAFormValueBean)webBean.findChildRecursive("FormVal"+i);

  22. hideItem.setRendered( false );

  23. }


  24. for ( int i= ; i<paramList.size(); i++){

  25. attribute = (String[])paramList.get(i);

  26. if (attribute[ 4 ] != null && "Display".equals(attribute[ 4 ])){

  27. OAMessageStyledTextBean displayItem =

  28. (OAMessageStyledTextBean)webBean.findChildRecursive("DisplayItem"+dispalyIndex);


  29. //关联View Attribute

  30. displayItem.setViewAttributeName(attribute[ ]);


  31. //设置Data Type

  32. if ("java.lang.String".equals(attribute[ 2 ])){

  33. displayItem.setDataType("VARCHAR2");

  34. }

  35. else if ("oracle.jbo.domain.Number".equals(attribute[ 2 ])){

  36. displayItem.setDataType("NUMBER");

  37. }

  38. else if ("oracle.jbo.domain.Date".equals(attribute[ 2 ])){

  39. displayItem.setDataType("DATE");

  40. }

  41. //设置显示

  42. displayItem.setRendered( true );


  43. //是否可查询

  44. if (attribute[ 5 ] != null && "SearchAllow".equals(attribute[ 5 ])){

  45. displayItem.setQueryable( true );

  46. }


  47. dispalyIndex++;

  48. }

  49. else if (attribute[ 4 ] != null && "Hide".equals(attribute[ 4 ])){

  50. OAFormValueBean hideItem =

  51. (OAFormValueBean)webBean.findChildRecursive("FormVal"+hideIndex);


  52. //hideItem.setViewUsageName("FndUserLovVO2");

  53. hideItem.setViewAttributeName(attribute[ ]);


  54. if ("java.lang.String".equals(attribute[ 2 ])){

  55. hideItem.setDataType("VARCHAR2");

  56. }

  57. else if ("oracle.jbo.domain.Number".equals(attribute[ 2 ])){

  58. hideItem.setDataType("NUMBER");

  59. }

  60. else if ("oracle.jbo.domain.Date".equals(attribute[ 2 ])){

  61. hideItem.setDataType("DATE");

  62. }


  63. hideItem.setRendered( true );


  64. hideIndex++;

  65. }

  66. }

  67. }

感谢大家的阅读,以上就是"OAF开发中LOV相关技巧有哪些"的全部内容了,学会的朋友赶紧操作起来吧。相信小编一定会给大家带来更优质的文章。谢谢大家对网站的支持!

0