OAF―Entity Object 之 Initialize data

Initialize data(数据初始化):

主要用于新增记录,方法主要由两个:

1. Design time时设定Page itemDefault value.

2. Run     time时用编程方式设定.

Default value的设定这里不说.留待后面深入UI item”时再说.

这里主要说说如何利用编程方式设定.

 

在建好EO,如果你选择了生成JAVA文件及JAVA CLASS,我们在该EO下会发现有个<Your EO name>EOImpl.java的节点,

双击打开后,里面已经有了一些方法了,主要有如下几类:

  1. DML Operation Class
  2. Set Attribute Value Class
  3. Get Attribute Value Class
  4. Validation Class

那我们要初始化,很明显是要用到其中的Set Attribute Value Class.这些方法名字都是set +<Attribute Name>.例如:  

public void setHeaderId(Number value)

 {

   setAttributeInternal(HEADERID, value);

                              }

传入参数是value,然后利用setAttributeInternal方法把value赋给HEADERID(注意,

这个HEADERIDEO Attributes的别名.EO中为Attribute赋值主要有如下两个方法:

 

setAttribute(int index, String lang , object val)

index代表AttributeEO中的位置(注意,只在显示在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.getSequenceValue("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.      利用JDBCSQLJ来实现,这两种模式均支持在JAVA中直接使用标准SQL语句.
 
VO的方式等到深入VO”时再说,现在首先研究下如何用JDBC来实现.
 
http://download-uk.oracle.com/docs/cd/B10501_01/java.920/a96654/toc.htm   OracleJDBC 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
{ 
   OracleConnection conn = (OracleConnection)transaction.getJdbcConnection(); //获取当前连接
  OracleStatement stmt = (OracleStatement)conn.createStatement(); //生成语句
  OracleResultSet rset = (OracleResultSet)stmt.executeQuery("select msi.segment1 from mtl_system_items_b msi"); //执行查询
  while (rset.next()) //向前转移指针
  {setItemDesc(rset.getString(1)); //获取结果集中的第一个字段
   break; //假定只取一条记录
  }
  rset.close(); //关闭结果集
}
catch(SQLException ex) {}
}
------------------------------------------------------------------------

      注意, JDBC的方法往往要抛出异常,java.sql.SQLException.如果不进行捕获,OAF会报错.

 

      通过调整里面的SQL语句,我们能实现更灵活的功能.

你可能感兴趣的:(职场,休闲,oaf,数据初始化)