/**VO杂谈*/
/**1、所有VO的父类为 OAViewObjectImpl*/
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.setMaxFetchSize(0);
row.setAttribute(9,new Timestamp(calendar.getTimeInMillis()));
/*和表关联建VO时,rows[i].setAttribute(att1,para)执行后,对应表里的数据变成临时态(数据已修改,但未提交)。所以上述方法执行后从数据库中查询时,查到的是更改后的数据。
**/
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 nextRow = (Row)rowsInRange[i];
if (!dailyId.equals(nextRow.getAttribute("SelectDailyId").toString())){
nextRow.setAttribute("Selectflag", "N");
}
}
}
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();
}
//那么第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;
}
/**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");
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();
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;
}