OAF―Entity Object之Initialize data(一)

2014-11-24 13:09:27 · 作者: · 浏览: 0

Initialize data(数据初始化):
主要用于新增记录,方法主要由两个:
1. 在Design time时设定Page item的Default value.
2. 在Run time时用编程方式设定.
Default value的设定这里不说.留待后面”深入UI item”时再说.
这里主要说说如何利用编程方式设定.

在建好EO后,如果你选择了生成JAVA文件及JAVA CLASS,我们在该EO下会发现有个EOImpl.java的节点,
双击打开后,里面已经有了一些方法了,主要有如下几类:
DML Operation Class
Set Attribute Value Class
Get Attribute Value Class
Validation Class
那我们要初始化,很明显是要用到其中的Set Attribute Value Class.这些方法名字都是set +.例如:
public void setHeaderId(Number value)
{
setAttributeInternal(HEADERID, value);
}
传入参数是value,然后利用setAttributeInternal方法把value赋给HEADERID(注意,
这个HEADERID是EO Attributes的别名.在EO中为Attribute赋值主要有如下两个方法:

setAttribute(int index, String lang , object val)
index代表Attribute在EO中的位置(注意,只在显示在Page上的Attribute中排序),也可用EO Attributes的别名代替.
val代表传入的值,lang代表语言,可省略。例如:

Number price = new Number(100);
setAttribute(5, price);
按照FORM的习惯,我们可能会写成 setAttribute(5,100),
请注意,这是错误的,因为JAVA会认为这个100是基本类型中int类型,而不是object类型。

setAttributeInternal(int index,Object val)
除了没有语言的区分外,与setAttribute一致.

这样,我们可以自已写个CLASS,把所有需要初始化的Attributes全部在里面设定好.如下:
public void setallAttribute()

{

Number v_id = new Number(100);

setLineId(v_id);

String v_desc = new String(“ABCD”);

setItemDesc(v_desc);

...

}

然后在其中的一个DML Operation class: create()中加入上述方法:
public void create(AttributeList attributeList)

{

super.create(attributeList);

setallAttribute();

}

这样,当你在Page上执行新增记录的动作时,你会发现有些字段就有了初始值了…
在初始值的定义中,有下面几个比较特殊的:

1. Primary Key的初始化

2. WHO字段的初始化

3. 需要动态指定字段的初始化

Primary Key的初始化

调用OADBTransaction来取得Sequence值,并通过SetAttribute( )方法赋予Primary Key即可.代码如下:

public void create(AttributeList attributeList)

{

super.create(attributeList);

OADBTransaction transaction = getOADBTransaction();

Number lineid = transaction.getSequenceva lue("xx_order_line_s");

setLineId(lineid);

}

上面的代码是写在EO的 create( )方法里的,这样的话,当你新增一个空记录时,在lineid字段上就有了一个初始值,即序列

取得的值,如果你不保存这条记录的话,就会出现跳号的情况,因此可把这个语句放在提交的方法里.


WHO字段的初始化


正常情况下,如果你的EO中包含了WHO字段的话,当你提交时,OAF会自动帮你初始化WHO字段,是不需要编写代码的,

如果你需要自已来获取WHO信息的话,仍可以利用OADBTransaction的方法来获取,主要有如下几个.

OADBTransaction transaction = getOADBTransaction();

transaction.getUserId()

transaction.getCurrentDBDate()

transaction.getResponsibilityApplicationId()

transaction.getResponsibilityId()

需动态赋值字段的初始化

这种情况我们在做FORM时经常遇到,即根据某一种情况需实时从数据库中提取某一信息做为字段的值.

如果提取不出来,还要报出错误信息来并拒绝保存记录.那么在OAF中如何实现呢

我想了一下,可能的实现手段包括:

1. 利用VO来实现(有时候,VO就相当于FORM中的Recordgroup),需动态的为VO定义WHERE条件,并获取VO的查询结果来实现.

2. 利用JDBC或SQLJ来实现,这两种模式均支持在JAVA中直接使用标准SQL语句.

VO的方式等到”深入VO”时再说,现在首先研究下如何用JDBC来实现.

http://download-uk.oracle.com/docs/cd/B10501_01/java.920/a96654/toc.htm Oracle的JDBC Developer’s guide.

前面我们已经知道如何利用OADBTransaction的方法executeCommand()去执行一个SQL语句,

但那仅限于DML语句,象Update, Delete, Insert等等.这里我们需要执行一个SQL查询,并有结果集返回.

然后把结果集中的某个字段赋给EO的某个Attribute.我想,这个在以后OAF开发中是非常有用的.

经研究,成功实现,伪码如下:

--------------------------------------------------------------------

import oracle.jdbc.OracleResultSet; //结果集

import oracle.jdbc.OracleConnection; //数据库联接

import oracle.jdbc.OracleStatement; //语句

import java.sql.SQLException; //例外

public void create(AttributeList attributeList)

{

super.create(attributeList);

try

{

Ora