OAF学习笔记-JAVA Entity Object 之 Initialize data(深入EO系列)

Initialize data(数据初始化):

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

1.  Design time 时设定Page itemDefault value.

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

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

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

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

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

  1. DML Operation Class
  2. Set Attribute Value Class
  3. Get Attribute Value Class
  4. 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代表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语句,我们能实现更灵活的功能.

请使用浏览器的分享功能分享到微信等