OAF中VO(缓存技术)问题

本文介绍了Oracle ADF中的VO(Value Object)缓存技术,包括如何清除VO缓存,如何在给row时间控件赋值时操作,以及在绑定子单VO和ViewLink时的操作。特别是对于新增数据,文章详细阐述了如何将其置于页面最后或最前。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**VO杂谈*/
/**1、所有VO的父类为 OAViewObjectImpl*/

/**2、VO占位符介绍http://www.cnblogs.com/eastsea/p/4618449.html*/

VO中的行数

/**获取当前已从数据库读取到VO的记录数(Row Set Size),要显示调用first()、next()后才会真正读取到VO(正是要统计这部分数据)*/
vo.getFetchedRowCount();
/***设置Row Set的范围大小:从数据库读取全部数,
vo.getRowCount():统计Row Set的记录数
在vo.executeQuery执行后执行vo.getRowCount,可以在上下页地方展示全部数据量***/
vo.setRangeSize(vo.getRowCount());
/**获取当前RowSet 范围的Row(如果不执行上面语句,默认rows.length为1)*/
Row[] rows = vo.getAllRowsInRange();
/**rows[i]即vo的当前行信息XXXVORowImpl row = (XXXVORowImpl)rows[i]*/
/**返回内存中,符合指定属性和属性值的VO的Row Set的Row数组
第一个参数:列名 第二个参数:列对应需要过滤的值*/
Row[] rows = vo.getFilteredRows("SelectFlag", new String("Y"));
/**根据VO获取全部row*/
vo.setRangeStart(0);
vo.setRangeSize(vo.getRowCount());
Row[] rows = vo.getAllRowsInRange();

//VO清除缓存操作

vo.clearCache(); //这个要放在前
vo.setMaxFetchSize(0);

vo.executeQuery();

//***给row时间控件赋值时***

Calendar calendar = Calendar.getInstance();
row.setAttribute(9,new Timestamp(calendar.getTimeInMillis()));
/*和表关联建VO时,rows[i].setAttribute(att1,para)执行后,对应表里的数据变成临时态(数据已修改,但未提交)。所以上述方法执行后从数据库中查询时,查到的是更改后的数据。
**/

//绑定子单VO操作ViewLink:

SelectDailyVO1此为子表table名字

OATableBean innerTable = 

              (OATableBean)webBean.findChildRecursive("SelectDailyVO1");


// create an enumerator
OAInnerDataObjectEnumerator oaenum = 
new OAInnerDataObjectEnumerator(pageContext, innerTable);
//oaenum 可以放到HashMap中从CO传到AM中
while (oaenum.hasMoreElements()) {
RowSet innerRowSet = (RowSet) oaenum.nextElement();
//这样才能修改全部的数据
innerRowSet.setRangeStart(0);
innerRowSet.setRangeSize(innerRowSet.getRowCount());
// get all rows 

Row[] rowsInRange = innerRowSet.getAllRowsInRange();


for (int i = 0; i < rowsInRange.length; i++) {
Row nextRow = (Row)rowsInRange[i];
if (!dailyId.equals(nextRow.getAttribute("SelectDailyId").toString())){
nextRow.setAttribute("Selectflag", "N");
}
}
}


//查询VO展示值两种方法 1、自带方法2、结果集的方式

简单方式:

setWhereClause(null);

setWhereClauseParams(null);

setWhereClause(sql);//此sql只要是VO的字段值即可

//特殊方式

FeedCheckAndDetVOImpl vo = getFeedCheckAndDetVO1();
StringBuffer sql = new StringBuffer();
sql.append("SELECT trunc(m.plandate, 'MM') AS plandate,trunc(m.checkdate, 'dd') AS checkdate,m.txstatus tstatus,\n" + 
" getvaluedesct(m.txstatus, 'CUX_INV_SCSYsendflg') AS txstatus,m.markname,\n" + 
" d.prodarea AS prodareas,d.prodcategory AS prodcategory,d.formstatus AS formstatus,\n" + 
" d.gradelevel AS gradelevel,d.lotcode AS lotcode,d.yeartime,d.pack AS pack,\n" + 
" SUM(d.realnum) AS realnum,SUM(d.requestweight) AS requestweight,\n" + 
" SUM(d.realweight) AS realweight,SUM(m.rotleafweight) AS rotleafweight\n" + 
" FROM cux_inv_feed_check m, cux_inv_feed_detail d WHERE m.feed_check_id = d.feed_check_id\n" + 
" AND nvl(m.useflag, 'y') <> 'd' AND nvl(d.useflag, 'y') <> 'd' " + 
  getWhereSql(params) + " \n" + 
" GROUP BY ROLLUP(cux_common_utils_pkg.getbigprodareavalue(d.prodarea),\n" + 
" (trunc(m.plandate, 'MM'), trunc(m.checkdate, 'dd'),m.sumstatus,m.txstatus, m.markname,\n" + 
" d.prodarea, d.prodcategory, d.formstatus,d.gradelevel, d.lotcode, d.yeartime, d.pack))\n");
//1、自带方法
vo.setQuery(sql.toString());//此sql里查询字段值名称和VO字段名称对应且个数相同
vo.executeQuery();

public String getWhereSql(HashMap params) {
StringBuffer sql = new StringBuffer();
//计划日期
if (params.containsKey("planDateTxt")) {
sql.append(" and trunc(m.planDate,'MM') = to_date('" + 
          params.get("planDateTxt") + "','yyyy-MM')");
}
//审核日期
if (params.containsKey("checkDate1")) {
sql.append(" AND ");
sql.append(" to_char(m.checkDate,'yyyy-MM-dd') >='" + 
  params.get("checkDate1") + "'");
}
return sql.toString();
}
//2、结果集的方式
OADBTransaction txn = getOADBTransaction();
CallableStatement cs = txn.createCallableStatement(sql.toString(), 1);
//利用结果集这个中介进行操作
ResultSet rs = null;
//处理结果集中数据元
try {
//cs.setString(1, wcids);//如果有需要传入的参数值         
rs = cs.executeQuery();
while (rs.next()) {
if (null != rs.getObject(1)) {
rs.getObject(1);//结果集从1开始  VO从0开始
}
if (null != rs.getObject(2)) {
rs.getObject(2);
}
}
rs.close();
cs.close();
   } catch (SQLException e) {
  e.printStackTrace();
}

//对新增VO,把新增数据放到最一页的最下面(上面)

//页面新增一行数据,如果行集设成10行翻页.当前页只有5行,那么会新增到第6行.如果当前页有10行,
//那么第10行滚动到下一页,新增行在第10行.
//indexForRowInserts:你指定要插入哪行
//如果最新的数据行要插入到最下面,则必须要修改vo.setRangeSize(num)中num的大小
int indexForRowInserts = getStartIndexForMultiInsert(vo, 1);
vo.insertRowAtRangeIndex(indexForRowInserts,row);
//vo.setCurrentRowAtRangeIndex(i1);
//其中RowIteraotr可以为VO(OAViewObjectImpl),numRowsToAdd为要插入几行数据
 public static int getStartIndexForMultiInsert(RowIterator rowIt, int numRowsToAdd)
  {
    int numRowsInRange = rowIt.getRowCountInRange();//获取当前RowSet的range大小(size)20 rowIt.setRangeSize(rowIt.getRowCount());
    int rangeSize = rowIt.getRangeSize();//获取所有RowSet的range大小21(之前是20,增加一个)
    int firstIndexAtWhichToAdd = 0;
    int numOpenSlotsInRange = (rangeSize - numRowsInRange);1
    //这一步的意思应该是如果新增的话,设置rowIt.setRangeSize(rowIt.getRowCount()+1);要变大
    if (rowIt.getRangeSize() < rangeSize)
    {
      rowIt.setRangeSize(rangeSize);
    }
    if (numOpenSlotsInRange < numRowsToAdd)
    {
      firstIndexAtWhichToAdd = rangeSize - numRowsToAdd;
    }
    else
    {
      firstIndexAtWhichToAdd = numRowsInRange;
    }
    return firstIndexAtWhichToAdd;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值