标签:
2014-06-17 Created By BaoXinjian
一、摘要
OAF的弹性域的实现基本和Form的弹性域实现的大体思路是一致的,在注册Table和弹性域完全一样,之后通过控件去实现具体的弹性域显示
Form的弹性域初始化基本都在trigger when-new-form-instance中
OAF的弹性域初始化基本都在processRequest中,或者在processRequest调用AM中的初始化方法
1. 网上的一个例子
根据表FWK_TBX_EMPLOYEES生成实体对象EmployeeEO以后,
设置EmployeeEO的动态属性组(Dynamic Attribute Groups),添加一个说明性弹性域的值,Application Sort Name值为AK,FlexField Name值为FWK_TBX_EMPLOYEES,其他值保持默认即可,
点 击确定,然后可以在Custom Properties里查看到多了几个属性和值:DFF1_DESCRIPTIVE_FLEXFIELD_NAME、 DFF1_APPLICATION_NAME、DFF1_DAG_NAME、DFF1_CONTEXT_ATTRIBUTE_NAME这几个属性,保持默 认,点击确定。
根据EmployeeEO生成一个视图对象EmpFullVO,除了要在页面上填写的一些字段外,还必须包括AttributeCategory和Attribute1…Attribute15这几个字段。
新 建一个页面,把需要通过页面录入值的字段添加了页面上。然后在页面上添加一个item,设置其ID为DF,Item Style为flex。(值得注意的是,在messageComponentLayout里是不能添加flex项的,所以要先添加一个 messageLayout,然后在messageLayout里添加flex项)设置View Instance:EmpFullVO1, Appl Short Name: AK , Name:FWK_TBX_EMPLOYEES, Type:descriptive。如果只是显示的话,设置Read Only:true。如果要指定说明性弹性域的上下文和段,可以在Segment List里设置:上下文|段1|段2。
2. 说明性弹性域必须设定的四个属性
否则系统会找不到该flex定义
3. 代码完全定义
如果不用手工添加flex控件的方式,也可以通过代码实现完全弹性域的代码控制,主要用与根据条件动态设定弹性域的相关属性和出现与否
public void processRequest()
{
OADescriptiveFlexBean dffBean = (OADescriptiveFlexBean)
createWebBean(pageContext, DESCRIPTIVE_FLEX_BEAN, null, "DescFF");
webBean.addIndexedChild(dffBean);
dffBean.setAttributeValue(OAWebBeanConstants.VIEW_USAGE_NAME,"FlextestVO1");
dffBean.setAttributeValue(OAWebBeanConstants.FLEXFIELD_APPLICATION_SHORT_NAME, "FND");
dffBean.setAttributeValue(OAWebBeanConstants.REGION_APPLICATION_ID, new Integer(0));
dffBean.setAttributeValue(OAWebBeanConstants.FLEXFIELD_NAME,"SimpleFlex");
OADescriptiveFlexBean dffBean = (OADescriptiveFlexBean)webBean.findIndexedChildRecursive("DescFF");
flexBean.mergeSegmentsWithParent(pageContext);
}
4. 注意点:
只说明了关于说明性弹性域的地方。
运行页面,当更换说明性弹性域的上下文时,页面会刷新,这样会导致am.invoke(“createEmployee”)被调用一次,这样我们点击保存按钮时,后台会多生成一条记录。
(即当前页面上的内容被缓存到服务器,然后再在页面上生成一个初使化的记录)为了防止这种情况发生,需要在调用am.invoke(“create_employee”)的代码时多添加一个判断,如下:
if(!pageContext.isFormSubmission() && pageContext.getParameter(FLEX_FORM_EVENT) == null)
am.invoke(“createEmployee”);
二、案例实现
需求: 在Expense页面中新增一个描述性弹性域
1. 创建测试描述性弹性域表
1 CREATE TABLE ap.bxj_apexp_report_header_all
2 (
3 REPORT_HEADER_ID NUMBER PRIMARY KEY,
4 REPORT_NAME VARCHAR2 (240),
5 EMPLOYEE_ID NUMBER,
6 DESCRIPTION VARCHAR2 (240),
7 APPROVE_ID NUMBER,
8 APPROVE_STATUS VARCHAR2 (25),
9 APPROVE_WF_ID NUMBER,
10 REJECT_CODE VARCHAR2 (25),
11 CREATION_DATE DATE,
12 CREATED_BY NUMBER,
13 LAST_UPDATE_DATE DATE,
14 LAST_UPDATE_LOGIN NUMBER,
15 LAST_UPDATED_BY NUMBER,
16 TOTAL NUMBER,
17 INVOICE_NUM VARCHAR2 (50),
18 ATTRIBUTE_CATEGORY VARCHAR2 (150),
19 ATTRIBUTE1 VARCHAR2 (150),
20 ATTRIBUTE2 VARCHAR2 (150),
21 ATTRIBUTE3 VARCHAR2 (150),
22 ATTRIBUTE4 VARCHAR2 (150),
23 ATTRIBUTE5 VARCHAR2 (150),
24 CHART_OF_ACCOUNTS_ID NUMBER,
25 SEGMENT1 VARCHAR2 (150),
26 SEGMENT2 VARCHAR2 (150),
27 SEGMENT3 VARCHAR2 (150),
28 SEGMENT4 VARCHAR2 (150),
29 SEGMENT5 VARCHAR2 (150),
30 ORG_ID NUMBER,
31 REQUEST_ID NUMBER,
32 COMMENTS VARCHAR2 (240)
33 )
2. 通过ad_dd.register注册表和栏位
1 BEGIN
2 ad_dd.register_table(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘T‘,8,10,90);
3
4 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘ATTRIBUTE_CATEGORY‘,1,‘VARCHAR2‘,150,‘Y‘,‘N‘);
5 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘ATTRIBUTE1‘,2,‘VARCHAR2‘,150,‘Y‘,‘N‘);
6 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘ATTRIBUTE2‘,3,‘VARCHAR2‘,150,‘Y‘,‘N‘);
7 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘ATTRIBUTE3‘,4,‘VARCHAR2‘,150,‘Y‘,‘N‘);
8 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘ATTRIBUTE4‘,5,‘VARCHAR2‘,150,‘Y‘,‘N‘);
9 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘ATTRIBUTE5‘,6,‘VARCHAR2‘,150,‘Y‘,‘N‘);
10
11
12 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘CHART_OF_ACCOUNTS_ID‘,7,‘NUMBER‘,38,‘Y‘,‘N‘);
13 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘SEGMENT1‘,8,‘VARCHAR2‘,150,‘Y‘,‘N‘);
14 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘SEGMENT2‘,9,‘VARCHAR2‘,150,‘Y‘,‘N‘);
15 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘SEGMENT3‘,10,‘VARCHAR2‘,150,‘Y‘,‘N‘);
16 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘SEGMENT4‘,11,‘VARCHAR2‘,150,‘Y‘,‘N‘);
17 ad_dd.register_column(‘SQLAP‘,‘BXJ_EXP_REPORT_HEADER_ALL‘,‘SEGMENT5‘,12,‘VARCHAR2‘,150,‘Y‘,‘N‘);
18
19
20 DBMS_OUTPUT.PUT_LINE(‘Sucessfully Loading‘);
21 COMMIT;
22 EXCEPTION WHEN OTHERS THEN
23 DBMS_OUTPUT.PUT_LINE(‘SQLCode=‘||sqlcode);
24 DBMS_OUTPUT.PUT_LINE(‘SQLErrm=‘||sqlerrm);
25 ROLLBACK;
26 END;
3. 在应用中查看和确认注册表和栏位是否成功
4. 通过Register注册描述性弹性域,通过Segment定义描述性弹性域结构
5. 在OAF PG页面中新增一个Flex Type的Item如下
三、案例测试
1. 查看弹性域已正常显示,输入值后保存
2. 查看表中的弹性域栏位的值,确认无误
OAF_OAF控件系列8 - Description Flexfiled描述性弹性域的实现(案例)
标签:
原文地址:http://www.cnblogs.com/eastsea/p/4195631.html