您好,登錄后才能下訂單哦!
小編今天帶大家了解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中得到驗證字段:
public void proce***equest(OAPageContext pageContext, OAWebBean webBean)
{
super .proce***equest(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事件的判斷并做相應處理。
/**Item版本控制,當選擇了有版本控制的Item,該行版本字段可修改,如果沒有版本控制,該Item版本字段為默認**/
super .processFormRequest(pageContext, webBean);
OAApplicationModule am = pageContext.getApplicationModule(webBean);
if ( "ItemCode" .equals(pageContext.getLovInputSourceId()))
{
/**lovUpdate是在Lov Region選擇了Item,lovValidate是在Lov MessageInput控件中輸入后觸發,在此事件中判斷Item是否具有版本控制**/
if ( "lovUpdate" .equals(pageContext.getParameter(EVENT_PARAM))
|| "lovValidate" .equals(pageContext.getParameter(EVENT_PARAM)))
{
/**對Revision字段進行控制**/
am.invokeMethod( "controlRevSwitcher" , new Serializable[]
{pageContext.getParameter(SOURCE_PARAM),
pageContext.getParameter( "OrganizationIdFV" )});
/**controlRevSwitcher方法是對版本控件的ReadOnly進行控制,但是頁面上不能馬上反應,需要使用局部刷新**/
OAAdvancedTableBean tableBean =
(OAAdvancedTableBean)webBean.findChildRecursive( "VenTrxLinesAdvTbl" );
tableBean.queryData(pageContext);
}
}
在上例的例子中,由于LOV字段是基于VO的,所以得到所選的LOV的值可以在VO中得到。但是對于不基于VO的LOV,如果需要在頁面事件發生的時候就得到選擇得到的LOV值,需要用以下方法來獲取:
// 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(lovInputSourceId);
if (lovResults != null )
{
System.out.println( "lovResults" +lovResults);
// 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。
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 proce***equest(OAPageContext pageContext, OAWebBean webBean)
{
super .proce***equest(pageContext, webBean);
OAApplicationModule am = pageContext.getApplicationModule(webBean);
/*--------------------------------------------------創建LOV Bean----------------------------------------------------*/
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" , );
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);
/*--------------------------------------------------創建LOV VO------------------------------------------------------*/
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().putTransientValue( "LovAttribute" , paramList);
}
這是AM中創建VO的方法:
import java.sql.Types;
import java.util.ArrayList;
import oracle.apps.fnd.framework.server.OAApplicationModuleImpl;
import oracle.apps.fnd.framework.server.OADBTransaction;
import oracle.apps.fnd.framework.server.OAViewDef;
import oracle.jbo.AttributeDef;
public void createVO(String voName, String sql, ArrayList list){
OADBTransaction dbtx = getOADBTransaction();
String[] attribute = new String[ 6 ];
int types = - 9999 ;
OAViewDef viewDef = dbtx.createViewDef();
viewDef.setSql(sql);
viewDef.setExpertMode( true );
viewDef.setViewObjectClass( "oracle.apps.fnd.framework.server.OAViewObjectImpl" );
viewDef.setViewRowClass( "oracle.apps.fnd.framework.server.OAViewRowImpl" );
for ( int i = ; i < list.size(); i++){
attribute = (String[])list.get(i);
if ( "java.lang.String" .equals(attribute[ 2 ])){
types = Types.VARCHAR;
}
else if ( "oracle.jbo.domain.Number" .equals(attribute[ 2 ])){
types = Types.NUMERIC;
}
else if ( "oracle.jbo.domain.Date" .equals(attribute[ 2 ])){
types = Types.DATE;
}
if ( "java.lang.String" .equals(attribute[ 2 ])){
viewDef.addSqlDerivedAttrDef( attribute[ ],
attribute[ 1 ],
attribute[ 2 ],
types,
false ,
true ,
AttributeDef.UPDATEABLE,
Integer.parseInt(attribute[ 3 ]));
}
else {
viewDef.addSqlDerivedAttrDef( attribute[ ],
attribute[ 1 ],
attribute[ 2 ],
types,
false ,
true ,
AttributeDef.UPDATEABLE); }
}
if (findViewObject(voName) != null ){
findViewObject(voName).remove();
}
createViewObject(voName, viewDef);
}
最后,在LOV Region的CO中,加入關聯的代碼。這里需要注意一點,由于我們的LOV VO是創建在主頁面的AM下的,所以LOV Region的AM必須和主頁面的AM一致。否則,在主頁面的變量就無法傳到LOV Region中。
public void proce***equest(OAPageContext pageContext, OAWebBean webBean)
{
super .proce***equest(pageContext, webBean);
OAApplicationModule am = pageContext.getApplicationModule(webBean);
String voInstance = (String)am.getOADBTransaction().getTransientValue( "LovVOInstance" );
ArrayList paramList = (ArrayList)am.getOADBTransaction().getTransientValue( "LovAttribute" );
String[] attribute = new String[ 6 ];
int dispalyIndex = 1 ;
int hideIndex = 1 ;
//關聯VO
((OAListOfValuesBean)webBean).setViewUsageName(voInstance);
//將Region中的MessageStyledText都設置為不顯示
for ( int i= 1 ; i<= 5 ; i++){
OAMessageStyledTextBean displayItem =
(OAMessageStyledTextBean)webBean.findChildRecursive("DisplayItem"+i);
displayItem.setRendered( false );
}
//將Region中的FormValue都設置為不顯示
for ( int i= 1 ; i<= 5 ; i++){
OAFormValueBean hideItem =
(OAFormValueBean)webBean.findChildRecursive("FormVal"+i);
hideItem.setRendered( false );
}
for ( int i= ; i<paramList.size(); i++){
attribute = (String[])paramList.get(i);
if (attribute[ 4 ] != null && "Display".equals(attribute[ 4 ])){
OAMessageStyledTextBean displayItem =
(OAMessageStyledTextBean)webBean.findChildRecursive("DisplayItem"+dispalyIndex);
//關聯View Attribute
displayItem.setViewAttributeName(attribute[ ]);
//設置Data Type
if ("java.lang.String".equals(attribute[ 2 ])){
displayItem.setDataType("VARCHAR2");
}
else if ("oracle.jbo.domain.Number".equals(attribute[ 2 ])){
displayItem.setDataType("NUMBER");
}
else if ("oracle.jbo.domain.Date".equals(attribute[ 2 ])){
displayItem.setDataType("DATE");
}
//設置顯示
displayItem.setRendered( true );
//是否可查詢
if (attribute[ 5 ] != null && "SearchAllow".equals(attribute[ 5 ])){
displayItem.setQueryable( true );
}
dispalyIndex++;
}
else if (attribute[ 4 ] != null && "Hide".equals(attribute[ 4 ])){
OAFormValueBean hideItem =
(OAFormValueBean)webBean.findChildRecursive("FormVal"+hideIndex);
//hideItem.setViewUsageName("FndUserLovVO2");
hideItem.setViewAttributeName(attribute[ ]);
if ("java.lang.String".equals(attribute[ 2 ])){
hideItem.setDataType("VARCHAR2");
}
else if ("oracle.jbo.domain.Number".equals(attribute[ 2 ])){
hideItem.setDataType("NUMBER");
}
else if ("oracle.jbo.domain.Date".equals(attribute[ 2 ])){
hideItem.setDataType("DATE");
}
hideItem.setRendered( true );
hideIndex++;
}
}
}
<p style="margin-top:0px;margin-bottom:18px;padding:0px;font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hi
感謝大家的閱讀,以上就是“OAF開發中LOV相關技巧有哪些”的全部內容了,學會的朋友趕緊操作起來吧。相信億速云小編一定會給大家帶來更優質的文章。謝謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。