OAF―动态LOV的实现

首先创建一个通用的LOV Region,建立一个查询的视图对象(Select ... From Dual),这个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 Query为True,这样就不会把页面上的值自动加到WHERE子句后查询。)
��
�� 然后在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)
�� {}
�� }

你可能感兴趣的:(职场,休闲,oaf)