概念的标准queryAction里面不支持group by,需要自定义action实现group by,但是自定义action之后,数据的分页需要自己实现。
下面介绍一种方法,使用系统提供的分页能力,分页显示group by的数据
系统在实现分页的时候,是在调用queryAction的时候,传入了两个参数,分别是offset和limit,这两个参数说明了从第几条记录开始取几条数据。
例如,分页取数据,每页显示20条数据
取第一页数据,offset=0,limit=20
取第二页数据,offset=20,limit=20
取第三页数据,offset=40,limit=20
系统提供的工具条可以获得正确的offset和limit,有了这两个参数就可以实现分页了。这两个参数,系统会传给bizdata组件reader属性对应的action,因此,还是要使用这里的action,只是这个action不再使用bizQueryProcedure,而是使用自定义的procedure,这样就可以既接收到offset和limit参数,也可以通过自己写java实现group by了。注意,这个action的参数必须包含bizQueryProcedure里面的全部参数,当然还可以增加新的参数。
特别说明,group by之后的数据一般情况下只做浏览用,不能修改。如果需要修改,不能使用系统提供的bizSaveProcedure,需要使用自定义的procedure,自己写java实现保存。
一个简单的例子
在ontology文件中,添加一个queryAction,例如:queryER_WPXX1Action,保存后点生成按钮,再点代码按钮
下面是具体的代码,这里的参数虽然多,但是,最主要是要使用offset和limit
public static Table queryER_WPXX1(String concept,String select,String from,String aggregate,String dataModel, String fnModel,String condition,List range,Boolean distinct,String idColumn,String filter,Integer limit, Integer offset,String columns,String orderBy,String aggregateColumns,Map<String, Object> variables){ //将UI传过来的过滤条件放入ksql String where = ""; if(filter != null && !"".equals(filter)){ where = " where " + filter; } String sql = " from ER_WPXX ER_WPXX " + where + " group by ER_WPXX.fWPMC"; //计算出总记录数 int cnt = 0; Table tCount = KSQL.select("select count(a.fWPMC) as cnt from (select ER_WPXX.fWPMC " + sql + ") a", variables, dataModel, null); Iterator<Row> it1 = tCount.iterator(); if(it1.hasNext()){ Row r = it1.next(); cnt = r.getInt("cnt"); } //加上offset和limit实现分页 Table table = KSQL.select("select ER_WPXX.fWPMC,sum(ER_WPXX.fGG) as fGG " + sql + " limit "+Integer.toString(offset)+","+Integer.toString(limit), variables, dataModel, null); //不需要设置主键 //table.getProperties().put(Table.PROP_NAME_ROWID, "ER_WPXX"); //设置总记录数 table.getProperties().put(Table.PROP_DB_COUNT, cnt); return table; }
说明:
1、要想实现分页,还必须让系统知道总记录数,这样才能计算出一共要显示多少页,因此,上面代码中的总记录数必须计算。计算总记录数和返回数据是两个sql,要保证它们是等效的,否则总记录数不准确。
2、在js中写setFilter,实际上就是给filter参数赋值,所以,上面的代码将filter参数的值放入了ksql,这样写,就可以在js中写setFilter过滤数据了
本文由WeX5君整理,WeX5一款开源免费的html5开发工具,H5 App开发就用WeX5!
阅读其他app 开发相关文章:http://doc.wex5.com/?p=3443
评一波