"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
"在ManagedBean中调用AppModuleImpl中自定义方法的两种方式"
平台: Jdev11.1.1.7.0
- *AM*中创建自定义方法sayHello
{% codeblock lang:java %}
public void sayHello(String value){
System.out.println("hello world..."+value);
}
-
暴露该方法以便在ManagedBean中调用
-
从Data Controls中将该方法拖到页面生成Bindings或者手工添加该Bindings。
-
为了测试方便,创建了一个inputText,并绑定该inputText的valueChangeListener为ManagedBean中的valueChange方法.
{% codeblock lang:java %}
public void valueChange(ValueChangeEvent valueChangeEvent) {
String newValue = valueChangeEvent.getNewValue().toString();
//方法一:调用bindings
BindingContainer bindings = ADFUtils.getBindingContainer();
OperationBinding refreshChecklist = bindings …
Read More
"关于ApplicatoinModule类型总结"
平台:Jdev11.1.2.3.0
AM的类型
1. Root AM
2. Nested AM
3. Shared AM
三种类型AM的比较
首先谈谈RootAM的数量,RootAM原则上来说越少越好,因为当用户访问工程的时候数据库连接数量会根据RootAM的数量成倍增加极大地增加了数据库的压力。但是很多时候由于业务的复杂性,单一的AM无法满足实际开发的需求,所有的业务逻辑都写在一个AM里极不利于多个团队的协同开发。
这个时候NestedAM就发挥其作用了,NestedAM是共享其父类RootAM的数据库连接的,所以不会额外增加连接数量,利用NestedAM可以将业务逻辑拆分开来,每个团队都可以使用自己单独的NestedAM,团队之间彼此冲突地可能性大大减少。
再说SharedAM,大型项目中很多模块的功能是通用的,比如LOV或者一些在使用中基本不需要改变的固定配置数据等,这类数据对项目所有访问用户都是固定的,可以使用SharedAM来维护这类型数据。
三种类型的AM的创建方法
- RootAM,默认创建的AM即是RootAM
-
NestedAM创建方法
先创建两个RootAM(deptAm,empAm),分别拥有VO instance(DeptVO,EmpVO);
再创建一个RootAM(rootAM),双击该rootAM,在Data Model标签页中 …
Read More
"ADF类似心跳程序实现"
使用ADF框架开发WEB应用时,其中令人苦恼的一个需求就是:在两个页面同时展示一个数据源时,如果其中一个页面对数据源作了变更操作,另外一个页面没办法自动获得变更后的数据,需要手工刷新页面才能得到变更后的新数据源。
其实ADF自带的<af:poll/>
组件即可实现此需求。
例子:
- 创建一个可更新的af:table 基于HR的Department表
可以更改表数据并提交,用多浏览器窗口打开该页面来模拟多用户操作。
将<af:poll/>
控件拖入到页面中,控件属性设置如下:
设置间隔为1分钟,并绑定PollListener
- 给该页面绑定ManagedBean,并添加PollListener,方法内容如下:
{% codeblock lang:java %}
public void heartBeat(PollEvent pollEvent) {
System.out.println("start poll...");
DCIteratorBinding it = ADFUtils.findIterator("Departments1Iterator");
ViewObject vo = it.getViewObject();
vo.executeQuery …
Read More
"ADF学习总结(一)"
改变VO查询条件
- 使用WhereClause改变查询条件
- 使用Criteria改变查询条件
- 使用Bind Variables改变查询条件
使用WhereClause改变查询条件
通过VO对象的setWhereClause方法改变查询条件
{% codeblock lang:java %}
DCIteratorBinding dc = ADFUtils.findIterator("DepartmentsView1Iterator");
ViewObject vo = dc.getViewObject();
vo.setWhereClause(" 1=1 ");
vo.executeQuery();
addWhereClause是在原有whereClause基础上添加新的查询条件;
跟setWhereClause替换原有whereClaue不同;
使用ViewCriteria改变查询条件
事先在创建VO的时候,定义好几种Criteria:DepartmentsViewCriteria
{% codeblock lang:java %}
DCIteratorBinding dc = ADFUtils.findIterator("DepartmentsView1Iterator");
ViewObject vo = dc.getViewObject();
ViewCriteriaManager vcm=vo.getViewCriteriaManager …
Read More
"OAF中创建LOV"
环境:Oracle9i Jdeveloper+R11i
首先创建AM
创建一个LovAM,默认配置即可。
创建VO
创建LovVO,不需要基于EO,输入查询SQL如下:
{% codeblock lang:sql %}
select distinct INVENTORY_ITEM_ID,concatenated_segments
from MTL_SYSTEM_ITEMS_KFV where organization_id=85
将创建好的VO添加到AM的data module中
创建RN
右键工程,创建一个RN,Scope设置为public.
选中创建好的LovRN.xml,在structure Window窗口中选中LovRN右建New Region Using Wizard.找到之前创建的LovVO.
修改字段属性如下:
Search Allowed : true
Selective Search Criteria : true
创建PG页面引用LOV
创建一个PG页面LovPG.xml,AM Definition设置为之前创建的LovAM路径 …
Read More
"配置OAF开发环境"
查看EBS系统OA版本信息
方法一:使用OPERATIONS用户登陆EBS系统,选择“Diagnostics”后,在页下脚选择“About this Page”后选择“Technology Components”标签可查看相应版本信息。
方法二:访问URI:R12不可用
{% codeblock lang:java %}
http://:/OA_HTML/OAInfo.jsp
查看OAF版本下载相应JDEV开发工具
metalink document id: 787209.1 & 416708.1
例如:p4141787_11i_GENERIC.zip
解压缩后把“/jdevhome/jdev”路径加到系统变量中,变量名: JDEV_USER_HOME=F:\p4141787_11i_GENERIC\jdevhome\jdev
配置DBC文件
确认当前EBS系统使用的dbc文件.
连接EBS数据库,执行以下SQL查询:
{% codeblock …
Read More
"getRowAtRangeIndex(int)方法的局限性"
导出VO中的数据到EXCEL中时,循环VO中的Row,写入HSSFRow,是通过getRowAtRangeIndex(int)方法循环取Row,代码如下:
{% codeblock lang:java %}
ViewObject vo8=am.findViewObject("ChReport1VO1");
if(vo8!=null)
{
int rowcount8=vo8.getRowCount();
for(int i=0;i<rowcount8;i++)
{
Row vo_row8=vo8.getRowAtRangeIndex(i);
//...TODO
}
}
这样如果VO里有300条数据,但是pageRange设置为100,这里其实只能取到第一页的100条数据,想要导出所有300条数据则需要一页一页导出,很麻烦。于是考虑不用getRowAtRangeIndex方法取ROW数据,改用RowSetIterator。
{% codeblock lang:java %}
ViewObject vo8=am.findViewObject("ChReport1VO1 …
Read More
"OAF上传大批量EXCEL文件"
客户有个需求:大量数据通过EXCEL导入系统表,并能提供效验及去重功能。
设计思路
- 采用POI解析EXCEL文件;
- bulk insert 插入数据到临时表
- 临时表结合正式表去除重复
POI解析EXCEL
在CO的processFormRequest
方法中添加如下:
{% codeblock lang:java %}
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
super.processFormRequest(pageContext, webBean);
OAApplicationModule am = pageContext.getApplicationModule(webBean);
if (pageContext.getParameter("uploadBtn") != null)
{
DataObject fileUploadData = (DataObject)pageContext.getNamedDataObject("uploadFile");
String fileName = null;
try {
fileName = (String)fileUploadData …
Read More