OAF_开发系列10_实现OAF动态LOV设定

简介: 20150712 Created By BaoXinjian 一、摘要 要在OAF中动态创建LOV的功能是很复杂的一件事,本文所讲述的动态LOV创建场合用于事先不能知道页面上会有多少个LOV,而且LOV所使用的SQL查询,也是由用户交互而获得的。

20150712 Created By BaoXinjian

一、摘要


要在OAF中动态创建LOV的功能是很复杂的一件事,本文所讲述的动态LOV创建场合用于事先不能知道页面上会有多少个LOV,而且LOV所使用的SQL查询,也是由用户交互而获得的。

思路如下:

首先创建一个通用的LOV Region,建立一个查询的视图对象(Select ... From Dual),这个LOV并不能查出任何内容,在运行时我们会动态更改视图对象的定义。

 

二、锁定统计信息


Step1,创建LOV

首先在使用LOV的页面的控制器的processRequest方法中创建一个LOV

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,

那么LOV就会用原始定义的SQL去拼页面上的值组成SQL查询,而不会使用我们设置的动态SQL去查询。

(顺便提一下,对于不是动态创建的LOV,而需要动态修改LOV对应的视图对象定义的情况,因为LOV基本的对应项必须设置成criteria item,

为了防止LOV的自动查询,可以设置lovMAP的Programmatic QueryTrue,这样就不会把页面上的值自动加到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) {
    }
} 

 

三、运行测试


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/

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
SwiftUI—使用TabView包含和切换多个页面
SwiftUI—使用TabView包含和切换多个页面
817 0
SwiftUI—使用TabView包含和切换多个页面
动态切换 web 报表中的统计图类型
统计图在浏览器端展现时,不同的使用人员对图形的展现形式会有不同的要求,有的需要柱形图、有的想看折线图等,报表支持用户在浏览器端动态的选择统计图类型,关注乾学院,查看具体实现方法<a href="http://c.raqsoft.com.cn/article/1542008169051?r=IBelieve" target="_blank" rel="nofollow">动态切换 web 报表中的统计图类型</a> 作者:gxy 链接:http://c.raqsoft.com.cn/article/1542008169051 来源:乾学院 著作权归作者所有。
971 0
|
Oracle 关系型数据库
OAF_开发系列20_实现OAF打印功能
ddddd   添加一个页面级的button区域:pagebuttonBar,在之下添加button item ,这里主要设置的参数有:采用默认的oaf的打印按钮的id名称: IcxPrintablePageButton,设置属性集为:/oracle/apps/fnd/attributesets...
1136 0
OAF_开发系列21_实现OAF事物控制TransactionUnitHelper(案例)
20150716 Created By BaoXinjian 一、摘要 TransactionUnitHelper用以创建一个被标记的Transaction,个人感觉类似PLSQL SavePoint用以Commit和Rollback特定交易的作用 主要用法 1.
1088 0
|
Oracle 关系型数据库
OAF_开发系列18_实现OAF页面跳转setForwardURL / forwardImmediately(案例)
20150716 Created By BaoXinjian 一、摘要 setForwardURL()与forwardImmediately() 1. forwardImmediately会停止当前页面的请求,直接跳转到新的页面; 2.
1531 0
|
关系型数据库 Oracle
OAF_开发系列14_实现OAF代码动态新增控件
dERP技术讨论群: 288307890 技术交流,技术讨论,欢迎加入 Technology Blog Created By Oracle ERP - 鲍新建
1017 0
|
关系型数据库 测试技术
OAF_开发系列13_实现OAF通过Vector动态查询设置(案例)
20150715 Created By BaoXinjian 一、摘要 Oracle OAF Guide上介绍的标准客制化查询的方式,在多条件下进行查询 具体实现步骤如下 Step1.在controler中的processRequest 的方法中调用 (1).
1602 0
|
Web App开发
OAF_开发系列09_实现OAF预提取LOV设定(案例)
20150712 Created By BaoXinjian 一、摘要 1. 预取LOV(Look Ahead LOV) (1). 预取LOV最大的特点就是再也不需要每次都要烦人的弹出一个窗口让人选择了。
1117 0
|
测试技术
OAF_开发系列04_实现OAF查询4种不同的实现方式的比较和实现(案例)
2014-06-02 Created By BaoXinjian 一、摘要 OAF实现查询功能或需求,一般都会采用以下四种方式 (1). ResultBasedSearch 最简单的实现方式,将结果中某些栏位需要查询的栏位的属性search设定为true即可 (2).
1712 0

热门文章

最新文章