OAF_OAF控件系列8 - 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. 创建测试描述性弹性域表

 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.  查看表中的弹性域栏位的值,确认无误

时间: 2024-08-29 09:49:49

OAF_OAF控件系列8 - Description Flexfiled描述性弹性域的实现(案例)的相关文章

OAF_OAF控件系列 - Key Flexfield键值弹性域的实现(案例)

2014-06-17 BaoXinjian 一.摘要 OAF的弹性域的实现基本和Form的弹性域实现的大体思路是一致的,在注册Table和弹性域完全一样,之后通过控件去实现具体的弹性域显示 Form的弹性域初始化基本都在trigger when-new-form-instance中 OAF的弹性域初始化基本都在processRequest中,或者在processRequest调用AM中的初始化方法 1. 网上的一个例子 新建一个EO,其中需要有相关的CCID字段.这里,如果在EO的Dynamic

OAF_OAF控件系列 - Description Flexfiled描述性弹性域的实现(案例)

2014-06-17 BaoXinjian 一.摘要 OAF的弹性域的实现基本和Form的弹性域实现的大体思路是一致的,在注册Table和弹性域完全一样,之后通过控件去实现具体的弹性域显示 Form的弹性域初始化基本都在trigger when-new-form-instance中 OAF的弹性域初始化基本都在processRequest中,或者在processRequest调用AM中的初始化方法 1. 网上的一个例子 根据表FWK_TBX_EMPLOYEES生成实体对象EmployeeEO以后

C#控件系列--文本类控件

C#控件系列--文本类控件 文本类控件主要包括Label.LinkLabel.Button.TextBox以及RichTextBox. Label 功能 Label用来显示用户不能直接改变的文本信息. 属性 Image--指定标签上显示的图像. Text--此属性是与文件相关联的文本. Name--标识对象的名称. AutoSize--如果此属性为true,则启用了根据字号自动调整大小.请注意,这只对文本不换行的标签控件有效. Enabled--是否启用该控件. Visible--可见还是隐藏.

C#控件系列--选择类控件

C#控件系列--选择类控件 选择类控件主要包括:ComboBox.CheckBox.CheckedListBox.RadioButton.NumericUpDown以及ListBox. ComboBox 功能 ComboBox控件用于在下拉组合框中显示数据,它结合了TextBox控件和ListBox控件的功能. 属性

C#控件系列--容器控件

C#控件系列--容器控件 容器控件主要包括:FlowLayoutPanel.GroupBox.Panel.SplitConTainer.TabControl和TableLayoutPanel等. Panel 功能

C#控件系列--组件

C#控件系列--组件 WinForms提供了若干标准组件,包括BackGroundWorker.DirectoryEntry.DirectorySearcher.ErrorProvider.EventLog.FileSystemWatcher.HelpProvider.ImageList.MessageQueue.Process.PerformanceCounter.Serialport.ServiceController.Timer等. ErrorProvider 功能 ErrorProvid

C#控件系列--其他常用控件

C#控件系列--其他常用控件 其他一些常用控件有ListView.TreeView.PictureBox.NotifyIcon.DateTimePicker.MonthCalendar.ToolTip以及ProcessBar等. ListView 功能 ListView控件可以显示带图标的项列表,用户可使用该控件创建类似Windows资源管理器那样的用户界面.有4中视图模式:

Android控件系列之RadioButton&RadioGroup

学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握RadioGroup选中状态变换的事件(监听器) RadioButton和CheckBox的区别: 1.单个RadioButton在选中后,通过点击无法变为未选中 单个CheckBox在选中后,通过点击可以变为未选中 2.一组RadioButton,只能同时选中一个 一组CheckBox,能同时选中多个

Android控件系列之RadioButton&RadioGroup 【转】

学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握RadioGroup选中状态变换的事件(监听器) RadioButton和CheckBox的区别: 1.单个RadioButton在选中后,通过点击无法变为未选中 单个CheckBox在选中后,通过点击可以变为未选中 2.一组RadioButton,只能同时选中一个 一组CheckBox,能同时选中多个