起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9569|回复: 6

group by的数据分页显示

  [复制链接]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
发表于 2013-12-20 15:49:55 | 显示全部楼层 |阅读模式
概念的标准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实现保存。

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2013-12-20 16:12:02 | 显示全部楼层

一个简单的例子

在ontology文件中,添加一个queryAction,例如:queryER_WPXX1Action,保存后点生成按钮,再点代码按钮
2.png

下面是具体的代码,这里的参数虽然多,但是,最主要是要使用offset和limit
  1.         public static Table queryER_WPXX1(String concept,String select,String from,String aggregate,String dataModel,
  2.                         String fnModel,String condition,List range,Boolean distinct,String idColumn,String filter,Integer limit,
  3.                         Integer offset,String columns,String orderBy,String aggregateColumns,Map<String, Object> variables){
  4.                 //将UI传过来的过滤条件放入ksql
  5.                 String where = "";
  6.                 if(filter != null && !"".equals(filter)){
  7.                         where = " where " + filter;
  8.                 }
  9.                 String sql = " from ER_WPXX ER_WPXX " + where + " group by ER_WPXX.fWPMC";

  10.                 //计算出总记录数
  11.                 int cnt = 0;
  12.                 Table tCount = KSQL.select("select count(a.fWPMC) as cnt from (select ER_WPXX.fWPMC " + sql + ") a", variables, dataModel, null);
  13.                 Iterator<Row> it1 = tCount.iterator();
  14.                 if(it1.hasNext()){
  15.                     Row r = it1.next();
  16.                         cnt = r.getInt("cnt");
  17.                 }        

  18.                 //加上offset和limit实现分页
  19.                 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);
  20.                 //不需要设置主键
  21.                 //table.getProperties().put(Table.PROP_NAME_ROWID, "ER_WPXX");
  22.                 //设置总记录数
  23.                 table.getProperties().put(Table.PROP_DB_COUNT, cnt);
  24.                 return table;
  25.         }
复制代码
说明:
1、要想实现分页,还必须让系统知道总记录数,这样才能计算出一共要显示多少页,因此,上面代码中的总记录数必须计算。计算总记录数和返回数据是两个sql,要保证它们是等效的,否则总记录数不准确。
2、在js中写setFilter,实际上就是给filter参数赋值,所以,上面的代码将filter参数的值放入了ksql,这样写,就可以在js中写setFilter过滤数据了
远程的联系方法 QQ 728094812。添加好友时,需要填写论坛账号
发远程时同时也发一下帖子的地址,方便了解要解决的问题

如按照该方法解决,请及时跟帖,便于版主结贴

89

主题

448

帖子

1354

积分

金牌会员

Rank: 6Rank: 6

积分
1354
QQ
发表于 2013-12-22 17:08:12 | 显示全部楼层
分享一下Oracle  sql分页
public static Table eQueryPM_PointsForMain1(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 variables) {
    String sql = "copy代码换成自己的sql就行";
    if (filter != null) {
    sql += " where 1=1 and " + filter;
    }
    String offSql = "select * from (select rownum rn,A.* from (" + sql+ ") A where rownum <= " + (offset + limit) + ") where rn >="
    + (offset + 1) + "";
    Map<String, String> map = new HashMap<String, String>();
    map.clear();
    map.put("ORACLE", offSql);
    t = SQL.select(map, null, "/PMS/subcontractorsmanager/negotiatingChanges/data");
    // 设置table的rowid属性
    t.getProperties().put(Table.PROP_NAME_ROWID, "FID");
    // 设置table的count属性,总记录数,用于分页
    String countNum = "select count(*) as FNUM from  ( " + sql + " )";
    Map<String, String> map1 = new HashMap<String, String>();
    map1.clear();
    map1.put("ORACLE", countNum);
    Table countTable = SQL.select(map1, null, "/PMS/subcontractorsmanager/negotiatingChanges/data");
    BigDecimal num = countTable.iterator().next().getDecimal("FNUM");
    t.getProperties().put(Table.PROP_DB_COUNT, num);
    return t;
}

3

主题

39

帖子

182

积分

初级会员

Rank: 2

积分
182
发表于 2013-12-26 22:25:48 | 显示全部楼层
谢谢。正是我要的。

50

主题

337

帖子

422

积分

中级会员

Rank: 3Rank: 3

积分
422
QQ
发表于 2014-9-28 16:54:21 | 显示全部楼层
ksql的分页语句怎么写
X5

0

主题

14

帖子

70

积分

初级会员

Rank: 2

积分
70
QQ
发表于 2019-1-8 16:49:17 | 显示全部楼层
梦毁夕颜 发表于 2013-12-22 17:08
分享一下Oracle  sql分页
public static Table eQueryPM_PointsForMain1(String concept, String select,
  ...

你好!请问下  后台返回去的table 到前端grid也分页了吗? 按照你这个pagerbar 倒是有效果,但是

0

主题

14

帖子

70

积分

初级会员

Rank: 2

积分
70
QQ
发表于 2019-1-8 16:49:53 | 显示全部楼层
grid显示却不正确  没有分页效果
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2020-2-26 11:41 , Processed in 0.069274 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表