zoukankan      html  css  js  c++  java
  • OAF_开发系列10_实现OAF动态LOV设定

    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/

  • 相关阅读:
    电源
    SM2947
    网表
    cadence设计思路
    青山依旧在,几度夕阳红
    乐观锁与悲观锁
    笔记
    强弱软虚引用
    缓存相关
    dubbo
  • 原文地址:https://www.cnblogs.com/eastsea/p/4616955.html
Copyright © 2011-2022 走看看