动态改变LOV的值集
需求:
LOV的值集需要根据传入的用户角色类型(A,B,C)动态改变,A时查询所有,B时过滤字段1,C时过滤字段2.
基础VO的SQL如下:
SELECT DISTINCT U.USER_ID, U.USER_NAME, F.FULL_NAME AS DESCRIPTION
FROM FND_USER U, PO_HEADERS_ALL P, PO_VENDORS V, PER_PEOPLE_F F
WHERE U.EMPLOYEE_ID = P.AGENT_ID
AND P.VENDOR_ID = V.VENDOR_ID
AND F.PERSON_ID(+) = U.EMPLOYEE_ID
AND P.APPROVED_FLAG = 'Y'
AND ((P.VENDOR_ID = :VARVENDORID AND :VARUSERTYPE = 'B') OR
(:VARUSERTYPE = 'A') OR
(:VARUSERTYPE = 'C' AND U.USER_ID = :VARUSERID))
创建VARUSERTYPE VARUSERID VARVENDORID 三个绑定变量。
创建LOV VO
LVO的SQL如下:
SELECT NULL AS USER_ID,
NULL AS USER_NAME,
NULL AS DESCRIPTION,
:VARTYPE AS USERTYPE,
:VARVENDORID AS VENDORID,
:VARUSERID AS CURRENTUSERID
FROM DUAL
技巧在这里,LVO同样创建三个绑定变量,并把绑定变量作为VO的attribute暴露出来,然后通过view Accessors传递给基础VO
设置View Accessors
这样就可以实现动态切换LOV的基础数据源了。
"定制EL function"
实现方法
创建一个空的java Project:Taglib
{% codeblock lang:java %}
package cn.dengdezhao.taglib;
public class SplitString {
public static String getString(String string) {
String[] strings = string.split(":", 3);
if (strings.length > 2) {
return strings[2];
} else …
Read More
"控件af:iterator以及af:forEach的对比"
页面如下
分别绑定iterBean中的两个集合类型变量,将其中的值取出来。
{% codeblock lang:java %}
BackingBean内容如下:
{% codeblock lang:java %}
package cn.dengdezhao;
import java.util.ArrayList;
import java.util.List;
public class IteratorBean {
List list = new ArrayList();
String[] values=new String[]{"1","2","3"};
List testList=new ArrayList();
public void setTestList …
Read More
"如何在页面碎片加载前调用逻辑"
实现方法
重写RegionController方法可以达到以上需求。
- 重写 RegionController类,在refreshRegion方法中加入需要调用的逻辑即可在页面碎片加载之前调用。
{% codeblock lang:java %}
package cn.dengdezhao;
import oracle.adf.model.RegionContext;
import oracle.adf.model.RegionController;
public class myController implements RegionController {
public myController() {
super();
}
@Override
public boolean refreshRegion(RegionContext regionContext) {
// TODO Implement this method
int flag=regionContext …
Read More
"如何获取web.xml中的context-param参数"
通过EL表达试获取
以web.xml中的参数:javax.faces.FACELETS_VIEW_MAPPINGS为例,
可通过以下EL获取。
{% codeblock lang:java %}
${initParam['javax.faces.FACELETS_VIEW_MAPPINGS']}
如果参数名称很简单,比如:testParameter,EL表达式也可以写成以下方式:
{% codeblock lang:java %}
${initParam.testParameter}
通过JAVA代码获取
如果需要在MB方法中获取该参数值,可以参照以下代码:
{% codeblock lang:java %}
public String action() {
FacesContext fctx=FacesContext.getCurrentInstance();
ExternalContext ec=fctx.getExternalContext();
ServletContext servletContext=(ServletContext)ec.getContext();
String value=servletContext.getInitParameter …
Read More
"Attribute set for xxxAttribute in view object xxxVO failed问题解决"
平台:Jdeveloper 9i
异常描述:
在表增加单选checkbox时,在VO中创建transient属性selector,最终在页面中无法勾选checkbox,发现值没法保存到VO中,页面抛出该异常:
{% codeblock lang:java %}
null - Attribute set for Selector in view object employeeVO1 failed
解决方案:
- 检查VO中的transient属性selector是否设置为updatable
- 如果是在开发模式下,清空所有classes文件,重新编译;如果是在正式环境,删除该路径下的VO对象,可使用以下命令。
{% codeblock lang:java %}
exec jdr_utils.deletedocument('/oracle/apps/dengdezhao/test/server/employeeVO');
Read More
"从BackingBean中调用不带fragments的taskflow"
有时候需要在backingBean中调用某一taskflow, 可以使用以下代码调用。不过只适用于可单独运行的taskflow,含有page fragments的taskflow不在此范围。
代码如下:
{% codeblock lang:java %}
public String callTaskFlow() {
FacesContext fctx = FacesContext.getCurrentInstance();
ControllerContext cc = ControllerContext.getInstance();
String taskflowId = "btf_task";
String taskflowDocument = "/WEB-INF/btf_task.xml";
Map params = new HashMap();
TaskFlowId tid = new TaskFlowId(taskflowDocument, taskflowId);
String taskflowURL = cc.getTaskFlowURL(false, tid, params);
ExtendedRenderKitService …
Read More
"分页栏出现3个问号BUG解决"
平台:Jdeveloper 11.1.1.7.0
BUG描述
标准控件af:table,“页”字前后出现三个问号。
原因分析
查看LOG文件
{% codeblock lang:java %}
无法从外观 mySkin.desktop 获取资源关键字 页
可见是RenderingContext类中getTranslatedString方法发生异常。
查看源代码分析:
找到源代码所在位置:
将JAR包解压得到RenderingContext类,反编译查看
结果如下RenderingContext.class:
{% codeblock lang:java %}
public String getTranslatedString(String key)
{
if (key == null)
return null;
try
{
return getSkin().getTranslatedString(getLocaleContext(), key);
}
catch …
Read More
"Groovy在ADF中的应用"
使用Groovy脚本,在开发ADF应用中可以极大地提高开发效率,实现某些看似很复杂的功能。
比如在empVO中获取sequence值:
{% codeblock lang:java %}
db = adf.object.getDBTransaction()
sq = new oracle.jbo.server.SequenceImpl("EMPLOYEES_SEQ",db)
sq.getSequenceNumber()
在empVO中获取Salary字段最大值max:
{% codeblock lang:java %}
adf.object.getRowSet().max("Salary")
在empVO中获取Salary字段最小值min:
{% codeblock lang:java %}
adf.object.getRowSet().min("Salary")
在empVO中获取Salary字段合计sum:
{% codeblock lang:java %}
adf.object.getRowSet().sum("Salary")
在empVO中获取Salary字段均值avg:
{% codeblock …
Read More
"利用contextual event刷新Region"
平台: Jdev 11.1.1.7.0
需求:两个region,其中一个region对数据进行修改后,需要刷新另外一个region显示
创建bound taskflow: btf_form
taskflow只包括一个页面碎片empForm.jsff,拖入employeeVO生成af:Form。
创建bound taskflow: btf_table
同上,只有一个页面碎片empTable.jsff,拖入employeeVO生成af:table。
以上两个taskflow皆使用No Controller Transaction.
添加contextual event
需要在empTable.jsff页面中修改数据,单击commit按钮时,让empForm.jsff页面中的数据即时更新。因此,给commitbutton添加contextual event: saveEvent。
创建mainPG页面引入以上taskflow生成region
创建一个两栏jspx页面mainPG.jspx, 分别拖入以上两taskflow生成region。
给contextual event 绑定consumer。
切换到mainPG.jspx页面的pagedef页面,从structure窗口中执行以下操作 …
Read More