天天看點

OAF_OAF控件系列9 - Description Flexfiled描述性彈性域的實作(案例)

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. 說明性彈性域必須設定的四個屬性

View Instance:EmpFullVO1

Appl Short Name: AK 

Name:FWK_TBX_EMPLOYEES

Type:descriptive

否則系統會找不到該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. 建立測試描述性彈性域表

2. 通過ad_dd.register系統資料庫和欄位

3. 在應用中檢視和确認系統資料庫和欄位是否成功

4. 通過Register注冊描述性彈性域,通過Segment定義描述性彈性域結構

5. 在OAF PG頁面中新增一個Flex Type的Item如下

三、案例測試

1. 檢視彈性域已正常顯示,輸入值後儲存

2.  檢視表中的彈性域欄位的值,确認無誤

Thanks and Regards

<b>ERP技術讨論群: 288307890</b>

<b>技術交流,技術讨論,歡迎加入</b>

<b>Technology Blog Created By Oracle ERP - 鮑建立</b>

繼續閱讀