中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OAF開發中LOV相關技巧有哪些

發布時間:2022-01-10 18:07:22 來源:億速云 閱讀:129 作者:柒染 欄目:數據庫

小編今天帶大家了解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. 

三、動態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[ ];  

  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[ ])){  

  19.             types = Types.VARCHAR;  

  20.         }  

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

  22.             types = Types.NUMERIC;  

  23.         }  

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

  25.             types = Types.DATE;  

  26.         }  


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

  28.             viewDef.addSqlDerivedAttrDef(   attribute[ ],   

  29.                                             attribute[ ],   

  30.                                             attribute[ ],   

  31.                                             types,  

  32.                                              false ,  

  33.                                              true ,  

  34.                                             AttributeDef.UPDATEABLE,  

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

  36.         }  

  37.          else {  

  38.             viewDef.addSqlDerivedAttrDef(   attribute[ ],  

  39.                                             attribute[ ],   

  40.                                             attribute[ ],   

  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[ ];  

  8.    int  dispalyIndex    =  ;  

  9.    int  hideIndex       =  ;  


  10.    //關聯VO 

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


  12.    //將Region中的MessageStyledText都設置為不顯示 

  13.    for int  i= ; i<= ; i++){  

  14.     OAMessageStyledTextBean displayItem =  

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

  16.     displayItem.setRendered( false );  

  17.   }  


  18.    //將Region中的FormValue都設置為不顯示 

  19.    for int  i= ; i<= ; 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[ ] !=  null  && "Display".equals(attribute[ ])){  

  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[ ])){  

  33.               displayItem.setDataType("VARCHAR2");  

  34.           }  

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

  36.               displayItem.setDataType("NUMBER");  

  37.           }  

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

  39.               displayItem.setDataType("DATE");  

  40.           }  

  41.            //設置顯示 

  42.           displayItem.setRendered( true );  


  43.            //是否可查詢 

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

  45.               displayItem.setQueryable( true );  

  46.           }  


  47.           dispalyIndex++;  

  48.       }  

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

  50.           OAFormValueBean hideItem =   

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


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

  53.           hideItem.setViewAttributeName(attribute[ ]);  


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

  55.               hideItem.setDataType("VARCHAR2");  

  56.           }  

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

  58.               hideItem.setDataType("NUMBER");  

  59.           }  

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

  61.               hideItem.setDataType("DATE");  

  62.           }  


  63.           hideItem.setRendered( true );  


  64.           hideIndex++;  

  65.       }  

  66.   }  

  67. }   

<p style="margin-top:0px;margin-bottom:18px;padding:0px;font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hi

感謝大家的閱讀,以上就是“OAF開發中LOV相關技巧有哪些”的全部內容了,學會的朋友趕緊操作起來吧。相信億速云小編一定會給大家帶來更優質的文章。謝謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湖南省| 河北区| 乳源| 阿拉善盟| 礼泉县| 元江| 澄城县| 武宁县| 西乌珠穆沁旗| 翁牛特旗| 济源市| 高尔夫| 泸州市| 宜君县| 克什克腾旗| 福安市| 宿松县| 安义县| 漠河县| 泗阳县| 景谷| 探索| 县级市| 工布江达县| 长春市| 昌平区| 西畴县| 广丰县| 沙湾县| 阳东县| 铁岭县| 弥勒县| 武邑县| 北安市| 中方县| 临洮县| 商水县| 阿瓦提县| 连平县| 通化市| 海丰县|