OAF控件及常见问题使用总结.docx
《OAF控件及常见问题使用总结.docx》由会员分享,可在线阅读,更多相关《OAF控件及常见问题使用总结.docx(105页珍藏版)》请在冰豆网上搜索。
OAF控件及常见问题使用总结
OAF项目工程目录布局
Oracle.apps...webui
Usedfor:
PageandController
Oracle.apps...server
Usedfor:
AMandVOandVL
Oracle.apps...schema.server
Usedfor:
EOandAO
Oracle.apps..lov.server
Usedfor:
AMandVOforLOV
Oracle.apps..lov.webui
Usedfor:
PageandControllerforLOV
Oracle.apps..poplist.server
Usedfor:
AMandVOforPOPLIST
从这些路径我们可以得出如下几点:
Oracle.apps.是Oracle标准,所有的Project都必须用这样的路径来定义对象。
Componentname往往是我们所建的Project的名字,比如我做一个客户管理的应用,可定义名称为"ManageCust”。
webui一般放Clint端的东西,server一般放server端的东西。
LOV及POPLIST是可以共享给多个Projects的.所以目录层次与Componentname一致。
在Oracle.apps前是可以加入个性化的上层目录的,比如用公司名称,用来代替那个MyCompany。
举个例子:
假设我公司的名字叫Abeam,
Jdevhomepath为"C:
\OAF\jdevhome\jdev”,
我新建一个Project,功能是进行客户管理,名字为"ManageCust”
应用为ICX(这里的应用所发挥的作用还有待研究)
则你的目录结构会是如下:
myprojects
|____abeam
|__oracle
|__apps
|__icx
|__managecust
| |___webui
| |___server
| |___schema
| |___server
|__lov
| |__webui
| |__server
|__poplist
|__server
下拉框(MessageChoice)
控件展示如图:
方法一值集
路径:
ManufacturingandDestributionManagerInventory设置弹性域验证。
“值集”来定义展示(相当于代码类别(集)和代码定义(值))
值集的定义
1.首先登陆到:
8000/OA_HTML/OA.jsp?
OAFunc=OAHOMEPAGE#系统。
2.主菜单中选择ManufacturingandDestributionManagerInventory设置弹性域验证。
如图:
3.首先定义集,如图:
定义之后,点击工具栏的保存按钮,进行保存。
(如上值,该值集定义有10个值选项)
4.定义值集下面的值,点击值,如图:
点击名称弹出框,弹出查找窗口,在查找窗口中输入上一步新建的值集名(即INV_STATUS),点击查找,如图:
在值区域,新增要显示的显示列值。
如上图。
如何在OAF中调用定义的值集
值集定义数据库中保存的表如下:
fnd_flex_value_sets值集(ID:
FLEX_VALUE_SET_ID)
fnd_flex_values值集对应的值(ID:
FLEX_VALUE_ID;关联ID:
FLEX_VALUE_SET_ID)
fnd_flex_values_tl值集对应的值的说明(关联ID:
FLEX_VALUE_ID)
定义VO,如图:
选择如上图所示,下一步,如图:
在QueryStatement中输入一下语句:
SELECTtl.DESCRIPTION,//值说明
v.FLEX_VALUE//值定义
FROM
FND_FLEX_VALUE_SETSs,
FND_FLEX_VALUESv,
FND_FLEX_VALUES_TL
WHEREs.FLEX_VALUE_SET_ID=v.FLEX_VALUE_SET_ID
ANDv.FLEX_VALUE_ID=tl.FLEX_VALUE_ID
ANDs.FLEX_VALUE_SET_NAME='INV_STATUS'//INV_STATUS定义的值集名
ANDtl.LANGUAGE='ZHS'//中文
ANDv.ENABLED_FLAG='Y'//启用状态
ANDtrunc(sysdate)betweentrunc(nvl(v.start_date_active,sysdate-1))andtrunc(nvl(v.end_date_active,sysdate+1));
--有效日期([开始日期,结束日期])
下一步,完成VO的创建。
把VO加到对应的AM中,对绑定列选择VO字段,如图:
方法二代码
EBS上维护路径
英文路径:
ApplicationDeveloper-->Application-->Lookups-->Common
中文路径:
应用开发员-->应用产品-->代码--->公用
1、定义代码类型以及其代码定义,如下图所示:
路径见上面。
2、根据下面PLSQL语句建立VO视图
SELECTLOOKUP_CODE,MEANING
FROMFND_LOOKUP_VALUES_VL
WHERELOOKUP_TYPE='INV_NOTICE_TRANSPORT'ANDENABLED_FLAG='Y'
andtrunc(sysdate)betweentrunc(nvl(start_date_active,sysdate-1))and
trunc(nvl(end_date_active,sysdate+1))--有效日期
ORDERBYTAG
设置控件MessageChoice的属性如下:
注:
Meaning用于显示(即name),LookupCode用于存值(即code)
OAF下拉框缓存
在使用OAF开发功能时,经常会遇到下拉框组件,比如查询面板中的,下拉框组件默认是有缓存的,这会导致下拉框中的数据被增加、删除或者修改后,下拉框依然不会发生变化。
所以在开发的过程中一般要把下拉框组件的缓存去掉。
可以在页面对应的CO中的processRequest方法中去除下拉框缓存,代码如下:
publicvoidprocessRequest(OAPageContextpageContext,OAWebBeanwebBean){
super.processRequest(pageContext,webBean);
OAMessageChoiceBeansearchIncidentUrgency=
(OAMessageChoiceBean)webBean.findChildRecursive("SearchIncidentUrgency");
if(searchIncidentUrgency!
=null){
searchIncidentUrgency.setPickListCacheEnabled(false);
}
OAMessageChoiceBeansearchIncidentType=
(OAMessageChoiceBean)webBean.findChildRecursive("SearchIncidentType");
if(searchIncidentType!
=null){
searchIncidentType.setPickListCacheEnabled(false);
}
OAMessageChoiceBeansearchIncidentStatus=
(OAMessageChoiceBean)webBean.findChildRecursive("SearchIncidentStatus");
if(searchIncidentStatus!
=null){
searchIncidentStatus.setPickListCacheEnabled(false);
}
}
OAF中实现两个下拉选择框的联动
步骤:
1.创建两个VO:
ReportTypeVO和ReportVO(ReportVO中的ReportTypeId与ReportTypeVO中的ReportTypeId相关);将两个VO添加到AM中,其InstanceName分别为:
ReportTypeVO1和ReportVO1;
2.在页面中创建两个item,ItemStyle为messageChoice,ID分别为:
ParentChoice和ChildChoice,其PicklistViewInstance属性分别与第一步的ReportTypeVO和ReportVO相关联;指定各自的PicklistDisplayAttribute和PicklistValueAttribute属性;
3.设置ParentChoice的ActionType为fireAction,Event为changeList;
4.在CO.java中的processRequest()中处理ChildChoice列表初始化(初始列表值为空):
OAApplicationModuleam=
(OAApplicationModule)pageContext.getApplicationModule(webBean);
am.invokeMethod("handleListInitEvent");
5.在AMImpl.java中:
publicvoidhandleListInitEvent()
{
ReportVOImplvochild=(ReportVOImpl)findViewObject("ReportVO1");
//页面初始化,ParentChoice未选择值,ChildChoice值列表应为空
vochild.initQuery(newNumber(-1));
}
6.在CO.java中的processFormRequest()中处理ParentChoice的数据变化事件:
importoracle.apps.fnd.framework.webui.beans.message.OAMessageChoiceBean;
if("changeList".equals(event))
{
OAMessageChoiceBeanparentChoiceBean
=(OAMessageChoiceBean)webBean.findChildRecursive("ParentChoice");
StringselectValue=parentChoiceBean.getSelectionValue(pageContext);
Serializable[]parameters={selectValue};
am.invokeMethod("handleListChangeEvent",parameters);
}
7.在AMImpl.java中:
publicvoidhandleListChangeEvent(StringselectValue)
{
NumberreportTypeId=null;
try
{
reportTypeId=newNumber(selectValue);
}
catch(Exceptione){}
ReportVOImplvochild=(ReportVOImpl)findViewObject("ReportVO1");
vochild.initQuery(reportTypeId);
}
8.在ReportVOImpl.java中:
publicvoidinitQuery(NumberreportTypeId)
{
setWhereClause("REPORT_TYPE_ID=:
1");
setWhereClauseParams(null);//Alwaysreset
setWhereClauseParam(0,reportTypeId);
executeQuery();
}
多行文本输入
如上图,多行文本输入,设置如下:
控件类型为:
MessageTextInput
修改其高度height:
来控制多行输入。
例如:
日期控件格式设定
OADateValidaterformatter=newOADateValidater("yyyy-MM-dd","");
OAMessageDateFieldBeansendDateTxt1=
(OAMessageDateFieldBean)webBean.findChildRecursive("sendDateTxt1");//控件名称
sendDateTxt1.setAttributeValue(ON_SUBMIT_VALIDATER_ATTR,formatter);//控件格式属性
字符类型转换为时间类型
fnd_conc_date.string_to_date('2014-02-25')
设置弹出框提示信息
1.在程序的CO中的processRequest中注册js
//在html生产js函数名称为delAlert(注:
hideIsDel为隐藏控件来存放confirm返回值)
StringBufferjsString=newStringBuffer();
jsString.append("functiondelAlert(){");
jsString.append("varhideIsDel=document.getElementById('hideIsDel');");
jsString.append("hideIsDel.setAttribute('value','NO');");
jsString.append("if(confirm('\\u786e\\u8ba4\\u5220\\u9664\\u5417?
','提示!
')){hideIsDel.setAttribute('value','YES');}");
jsString.append("}");
pageContext.putJavaScriptFunction("delAlert",jsString.toString());
//例子给bodyonload事件注册delAlert函数
//OABodyBeanbB=(OABodyBean)pageContext.getRootWebBean();
//bB.setOnLoad("javascript:
delAlert()");
//给DelNoticeBtn删除按钮onClick事件注册delAlert函数
OASubmitButtonBeanregisterbutton=
(OASubmitButtonBean)webBean.findChildRecursive("DelNoticeBtn");
if(registerbutton!
=null){
registerbutton.setOnClick("javascript:
delAlert()");
};
2.在processFormRequest按钮提交中获取confirm返回值并执行删除后的相应代码:
OAWebBeanTextInputhideIsDel=
(OAWebBeanTextInput)webBean.findChildRecursive("hideIsDel");
StringisDel=(String)hideIsDel.getValue(pageContext);
if("YES".equals(isDel)){
//确认删除后需执行的代码在此添加
}
3.设置cssclass样式隐藏hideIsDel控件
开发工具jdeveloper的根地址\jdevhome\jdev\myhtml\OA_HTML\cabo\styles中
custom.xss文件添加
--Pleasestartyourcustomizationshere-->
none
--Pleaseendyourcustomizationshere-->
并在控件中设置cssclass样式
4.因oaf中文乱码所以必须转成Unicode类型
在线转换工具地址
OAF控制数据显示格式
importoracle.cabo.ui.validate.Formatter;
importoracle.apps.fnd.framework.webui.OADecimalValidater;
importoracle.apps.fnd.framework.webui.beans.OAWebBeanDataAttribute;
importoracle.apps.fnd.framework.webui.beans.message.OAMessageTextInputBean;
在processRequest中加入
Formatterformatter=newOADecimalValidater("#,###,###,##0;(#,###,###,##0)","#,###,###,##0;(#,###,###,##0)");
OAMessageTextInputBeanFare=
(OAMessageTextInputBean)webBean.findChildRecursive("Fare");
if(Fare!
=null)
Fare.setAttributeValue(ON_SUBMIT_VALIDATER_ATTR,formatter);
((OAWebBeanDataAttribute)tableBean.findIndexedChildRecursive("Fare")).setTabularFunctionCurrencyCode("CNY");或者
这个方法其实只要设置了币种就可以了,当然,需要在首选项里设置数字格式,同时这也是一个Profile,可以在系统管理员配置。
例如:
OAMessageStyledTextBeancost=
(OAMessageStyledTextBean)webBean.findIndexedChildRecursive("Cost");
cost.setAttributeValue(CURRENCY_CODE,"CNY");
做点补充:
需要导入的类都位于:
oracle.cabo.ui.validate
Formater的子类有ColorValidater,WMLPatternValidater,ByteLengthValidater,DecimalValidater,DateValidater
1、DateValidater:
验证日期格式。
不但可以用于“OAMessageDateFieldBean”,也可用于“OAMessageTextInputBean”。
例如:
OADateValidaterformatter=newOADateValidater("yyyyMMdd","");
2、WMLPatternValidater:
验证文本框的格式。
例如:
WMLPatternValidaterformatter=newWMLPatternValidater("8N");
3、ByteLengthValidater:
验证输入的byte长度。
例如:
ByteLengthValidaterformatter=newByteLengthValidater(10,"Windows-31J");
当输入的字符中有全角,超出规定的byte数后,会报出客户端的错。
与在画页面的时候,设置控件的长度效果一样。
4、DecimalValidater:
验证输入数字的大小。
例如:
DecimalValidaterformatter=newDecimalValidater();
formatter.setMaxValue(10);
formatter.setMinValue
(2);
(webBean.findChildRecursive("item1")).setAttributeValue(ON_SUBMIT_VALIDATER_ATTR,formatter);
5、若是需要自定义地、更复杂地属性验证,可以使用RegExpValidater。
例如:
(webBean.findChildRecursive("item