20150712 Created By BaoXinjianweb
1、摘要oracle
要在OAF中動態建立LOV的功能是很複雜的一件事,本文所講述的動態LOV建立場合用於事先不能知道頁面上會有多少個LOV,並且LOV所使用的SQL查詢,也是由用戶交互而得到的。app
思路以下:post
首先建立一個通用的LOV Region,創建一個查詢的視圖對象(Select ... From Dual),這個LOV並不能查出任何內容,在運行時咱們會動態更改視圖對象的定義。測試
2、鎖定統計信息ui
Step1,建立LOV spa
首先在使用LOV的頁面的控制器的processRequest方法中建立一個LOVcode
OAMessageLovInputBean lovItem = (OAMessageLovInputBean)createWebBean(pageContext,LOV_TEXT,null ); region.addIndexedChild(lovItem); lovItem.setAttributeValue(REGION_CODE, "/xxx/oracle/apps/cux/lov/webui"); lovItem.setAttributeValue(REGION_APPLICATION_ID, new Integer(pageContext.getResponsibilityApplicationId())); addLovItem.setLovRegion(pageContext,"/xxx/oracle/apps/cux/lov/webui/CommonLovRN"); lovItem.setUnvalidated(false); lovItem.addLovRelations(pageContext,lovItem.getID(),,LOV_RESULT,LOV_REQUIRED_NO); lovItem.setPrompt();
須要注意的是動態創建LOV時,不要使用addLovRelations去增長LOV_CRITERIA(criteria item),若是設置了criteria item,orm
那麼LOV就會用原始定義的SQL去拼頁面上的值組成SQL查詢,而不會使用咱們設置的動態SQL去查詢。對象
(順便提一下,對於不是動態建立的LOV,而須要動態修改LOV對應的視圖對象定義的狀況,由於LOV基本的對應項必須設置成criteria item,
爲了防止LOV的自動查詢,能夠設置lovMAP的Programmatic Query爲True,這樣就不會把頁面上的值自動加到WHERE子句後查詢。)
Step2,修改視圖對象的查詢
在LOV的控制器類的processRequest中動態修改視圖對象的查詢,由於咱們屏蔽了LOV的自動查詢,因此在processRequest中還必須處理自動查詢的狀況
(自動查詢的狀況是由於用戶輸入了值或以前已經選擇了,從新打開LOV),這裏不給出具體的代碼。在LOV控制器的processFormRequest方法中必須作如下處理
由於儘管咱們更改了視圖對象的定義,可是當點查詢按鈕時,LOV仍是按最原始定義的SQL綁定條件來查詢,因此這裏的操做是不讓LOV執行查詢,而進入processRequest從新更改視圖的定義:
if ("lovFilter".equals(pageContext.getParameter("event"))) { try { String strRedirectUrl = pageContext.getRequestUrl(); int intIndex = strRedirectUrl.indexOf("&"); strRedirectUrl = strRedirectUrl.substring(0, intIndex + 1) + "searchText=" + URLEncoder.encode(pageContext.getParameter("searchText")) +
"&" + "FormRequest=Y&" + strRedirectUrl.substring(intIndex + 1); pageContext.sendRedirect(strRedirectUrl); } catch (Exception expt) { } }
3、運行測試
1
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
super.processRequest(pageContext, webBean);
// Get the list of items configured as "passive criteria" for the LOV.
Dictionary passiveCriteriaItems = pageContext.getLovCriteriaItems();
String sourceType = (String)passiveCriteriaItems.get("SourceType");
if (sourceType == null || "".equalsIgnoreCase(sourceType))
{
throw new OAException("必須先選擇覈算項目類別");
}
String voName = null;
if ("H0001供應商".equals(sourceType)){
voName = "AccountSourceVendorVO1";
}
else if ("H0002銀行帳戶".equals(sourceType)){
// Sinolee added on 2013/3/12 for REQ124-支付模塊-付款簽收財務總帳中核算項目類別選擇「銀行帳戶」
//voName = "AccountSourceBankVO1";
voName = "XvkAccountSourceBankVO1";
}
else if ("H0003公司".equals(sourceType)){
voName = "AccountSourceOrgVO1";
}
else if ("WK006合同編號".equals(sourceType)){
voName = "AccountSourcePoVO1";
}
else if ("H0007工程項目".equals(sourceType)){
voName = "AccountSourceProjectVO1";
}
else if ("H0008產品類型".equals(sourceType)){
voName = "AccountSourceItemCateVO1";
}
else {
voName = "AccountSourceTempVO1";
throw new OAException(sourceType + "直接輸入,無須要選擇值列表");
}
((OAWebBeanData)webBean).setViewUsageName(voName);
}
SELECT 'H0007工程項目' source_type,
ppa.org_id
,ppa.project_id source_id
,ppa.attribute2 source_code
,ppa.attribute1 source_name
FROM pa_projects_all ppa
,pa_project_set_lines ppsl
WHERE ppa.project_id = ppsl.project_id
SELECT 'H0003公司' source_type
,paorg.org_id
,hrorg.organization_id source_id
,hrorg.attribute1 source_code
,hrorg.NAME source_name
FROM hr_organization_units hrorg
,pa_all_organizations paorg
WHERE paorg.organization_id = hrorg.organization_id
AND paorg.pa_org_use_type = 'PROJECTS'
AND paorg.inactive_date IS NULL
AND hrorg.attribute1 IS NOT NULL
AND org_id = fnd_global.org_id
select 'WK006合同編號' source_type,
ph.org_id,ph.po_header_id source_id
,ph.attribute3 source_code
,ph.comments source_name
FROM po_headers_all ph
Thanks and Regards
參考:張禮軍 - http://oracleseeker.com/2008/12/16/dynamic_create_lov_in_oracle_ebs/