gridpanel分组汇总

[ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总

2015-05-31     86

本文地址:http://blog.csdn.net/sushengmiyan/article/details/42240531

本文作者:sushengmiyan

------------------------------------------------------------------------------------------------------------------------------------

本文以一个实际例子,使用了extjs的gridpanel中的分组统计显示功能,涉及知识点:

Ext.grid.Panel  model/store store中的data grid中的features以及其中ftype: ‘groupingsummary‘等

一、先看效果图:

可以看到图片显示的安装月份进行了分组显示 在每个分组下面会有合计和平均值显示。我这个例子在IE8和谷歌浏览器以及火狐浏览器下均正常显示。

二、贴上所有的代码(其实就只有一个jsp页面就足够了)

<%@ page contentType="text/html; charset=UTF-8" %>
<%
	String context = request.getContextPath();
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>报表</title>
	<script type="text/javascript">
	  window.context = "<%=context%>";
    </script>
    <script type="text/javascript" src="<%=context %>/extjs5/include-ext.js"></script>
	<script type="text/javascript" src="<%=context %>/extjs5/packages/ext-locale/build/ext-locale-zh_CN.js"></script>
	<script type="text/javascript" src="<%=context %>/app/ux/Month.js"></script>
</head>
<body>
<script type="text/javascript" >

   Ext.onReady(function(){
	   var data = [{
		             factory:‘第一家维修公司‘, date:‘2014-05‘, cost:52492.0, costav:52492.0
			      },{
					 factory:‘第二家维修公司‘, date:‘2014-05‘, cost:760.0, costav:760.0
				  },{
					 factory:‘第三家维修公司‘, date:‘2014-05‘, cost:1807.0, costav:1807.0
				  },{
					 factory:‘第一家维修公司‘, date:‘2014-06‘, cost:4921.0, costav:4921.0
				  },{
					 factory:‘第二家维修公司‘, date:‘2014-06‘, cost:1020.0, costav:1020.0
				  },{
					 factory:‘第三家维修公司‘, date:‘2014-06‘, cost:1637.0, costav:1637.0
				  },{
					 factory:‘第一家维修公司‘, date:‘2014-07‘, cost:48150.0, costav:48150.0
				  },{
					 factory:‘第二家维修公司‘, date:‘2014-07‘, cost:7940.0, costav:7940.0}];

	   var store = Ext.create(‘Ext.data.Store‘, {
				   fields: [{name: ‘date‘}, {name: ‘cost‘},{name: ‘costav‘},{name: ‘factory‘}],
                   groupField: ‘date‘,
				   data: data
	   });

	   var grid = Ext.create(‘Ext.grid.Panel‘, {
			frame: true,
			height: 800,
			columnLines: true, // 加上表格线
			features: [{
				id: ‘group‘,
				ftype: ‘groupingsummary‘,
				groupHeaderTpl: ‘{name}‘+‘月份车辆美容及维修费用‘,
				hideGroupedHeader: false,
				enableGroupingMenu: false
			}, {
				ftype: ‘summary‘,
				summaryType: ‘average‘,
				dock: ‘bottom‘
			}],
		   renderTo: Ext.getBody(),
           columns: [{
			             text: ‘维修时间‘, dataIndex: ‘date‘,width:100,
					        summaryRenderer: function(value, summaryData, dataIndex) {
						      return ‘合计‘}
			        },{
					     text: ‘维修费用(元)‘, dataIndex: ‘cost‘, width:180,
				         field: { xtype: ‘numberfield‘},
				         summaryType: ‘sum‘,
                         renderer: function(value, metaData, record, rowIdx, colIdx, store, view){
                              return value + ‘ 元‘},
					     summaryRenderer: function(value, summaryData, dataIndex) {
                              return value + ‘ 元‘}
			        },{
					     text: ‘维修厂家‘, dataIndex: ‘factory‘,width:120,
				         summaryRenderer: function(value, summaryData, dataIndex) {
						      return ‘平均值‘}
			        },{
						 text: ‘‘, dataIndex: ‘costav‘, width:180,
				         field: {xtype: ‘numberfield‘},
				         summaryType: ‘average‘,
                         renderer: function(value, metaData, record, rowIdx, colIdx, store, view){
                              return ‘‘},//这列最后显示平均值 暂时这样转换显示
					     summaryRenderer: function(value, summaryData, dataIndex) {
                              return value + ‘ 元‘}
			        }],
		store: store
	    });
		grid.show();
  });
</script>
</body>
</html>

这个随便起名一个jsp就可以啦。

里面使用了一个日期选择控件,只可以选择年月的。顺便也贴一下代码吧

/** Months picker
      重写 field.Date
**/
Ext.define(‘app.ux.Month‘, {
   extend:‘Ext.form.field.Date‘,
   alias: ‘widget.monthfield‘,
   requires: [‘Ext.picker.Month‘],
   alternateClassName: [‘Ext.form.MonthField‘, ‘Ext.form.Month‘],
   selectMonth: null,
   createPicker: function() {
       var me = this,
           format = Ext.String.format;
       return Ext.create(‘Ext.picker.Month‘, {
           pickerField: me,
           ownerCt: me.ownerCt,
           renderTo: document.body,
           floating: true,
           hidden: true,
           focusOnShow: true,
           minDate: me.minValue,
           maxDate: me.maxValue,
           disabledDatesRE: me.disabledDatesRE,
           disabledDatesText: me.disabledDatesText,
           disabledDays: me.disabledDays,
           disabledDaysText: me.disabledDaysText,
           format: me.format,
           showToday: me.showToday,
           startDay: me.startDay,
           minText: format(me.minText, me.formatDate(me.minValue)),
           maxText: format(me.maxText, me.formatDate(me.maxValue)),
           listeners: {
       select:        { scope: me,   fn: me.onSelect     },
       monthdblclick: { scope: me,   fn: me.onOKClick     },
       yeardblclick:  { scope: me,   fn: me.onOKClick     },
       OkClick:       { scope: me,   fn: me.onOKClick     },
       CancelClick:   { scope: me,   fn: me.onCancelClick }
           },
           keyNavConfig: {
               esc: function() {
                   me.collapse();
               }
           }
       });
   },
   onCancelClick: function() {
       var me = this;
   me.selectMonth = null;
       me.collapse();
   },
   onOKClick: function() {
       var me = this;
   if( me.selectMonth ) {
              me.setValue(me.selectMonth);
           me.fireEvent(‘select‘, me, me.selectMonth);
   }
       me.collapse();
   },
   onSelect: function(m, d) {
       var me = this;
   me.selectMonth = new Date(( d[0]+1 ) +‘/1/‘+d[1]);
   }
});
/** Months picker **/  

知识点梳理:

①。显示的数据,这里整理好了一些数据,在实际中,我们可以通过查询数据库获取,分组查询便可。

	   var data = [{
		             factory:‘第一家维修公司‘, date:‘2014-05‘, cost:52492.0, costav:52492.0
			      },{
					 factory:‘第二家维修公司‘, date:‘2014-05‘, cost:760.0, costav:760.0
				  },{
					 factory:‘第三家维修公司‘, date:‘2014-05‘, cost:1807.0, costav:1807.0
				  },{
					 factory:‘第一家维修公司‘, date:‘2014-06‘, cost:4921.0, costav:4921.0
				  },{
					 factory:‘第二家维修公司‘, date:‘2014-06‘, cost:1020.0, costav:1020.0
				  },{
					 factory:‘第三家维修公司‘, date:‘2014-06‘, cost:1637.0, costav:1637.0
				  },{
					 factory:‘第一家维修公司‘, date:‘2014-07‘, cost:48150.0, costav:48150.0
				  },{
					 factory:‘第二家维修公司‘, date:‘2014-07‘, cost:7940.0, costav:7940.0}];

②store数据交互

	   var store = Ext.create(‘Ext.data.Store‘, {
				   fields: [{name: ‘date‘}, {name: ‘cost‘},{name: ‘costav‘},{name: ‘factory‘}],
                   groupField: ‘date‘,
				   data: data
	   });

这里只需要指定一个groupField就可以了,只需要这一步。

③。grid主体

	   var grid = Ext.create(‘Ext.grid.Panel‘, {
			frame: true,
			height: 800,
			columnLines: true, // 加上表格线
			features: [{
				id: ‘group‘,
				ftype: ‘groupingsummary‘,
				groupHeaderTpl: ‘{name}‘+‘月份车辆美容及维修费用‘,
				hideGroupedHeader: false,
				enableGroupingMenu: false
			}, {
				ftype: ‘summary‘,
				summaryType: ‘average‘,
				dock: ‘bottom‘
			}],
		   renderTo: Ext.getBody(),
           columns: [{
			             text: ‘维修时间‘, dataIndex: ‘date‘,width:100,
					        summaryRenderer: function(value, summaryData, dataIndex) {
						      return ‘合计‘}
			        },{
					     text: ‘维修费用(元)‘, dataIndex: ‘cost‘, width:180,
				         field: { xtype: ‘numberfield‘},
				         summaryType: ‘sum‘,
                         renderer: function(value, metaData, record, rowIdx, colIdx, store, view){
                              return value + ‘ 元‘},
					     summaryRenderer: function(value, summaryData, dataIndex) {
                              return value + ‘ 元‘}
			        },{
					     text: ‘维修厂家‘, dataIndex: ‘factory‘,width:120,
				         summaryRenderer: function(value, summaryData, dataIndex) {
						      return ‘平均值‘}
			        },{
						 text: ‘‘, dataIndex: ‘costav‘, width:180,
				         field: {xtype: ‘numberfield‘},
				         summaryType: ‘average‘,
                         renderer: function(value, metaData, record, rowIdx, colIdx, store, view){
                              return ‘‘},//这列最后显示平均值 暂时这样转换显示
					     summaryRenderer: function(value, summaryData, dataIndex) {
                              return value + ‘ 元‘}
			        }],
		store: store
	    });

这里需要注意,1.需要给grid指定高度,如果不指定IE8下数据不显示,应该是个bug吧。

2.分组以及统计的关键

			features: [{
				id: ‘group‘,
				ftype: ‘groupingsummary‘,//分组统计,可以选择不分组的,各类型可以去API查找
				groupHeaderTpl: ‘{name}‘+‘月份车辆美容及维修费用‘,//标题而已
				hideGroupedHeader: false,
				enableGroupingMenu: false
			}, {
				ftype: ‘summary‘,//下方的汇总的
				summaryType: ‘average‘,//类型是求平均值,还有sum等,可以去API查找
				dock: ‘bottom‘
			}],
时间: 2024-08-09 22:00:10

gridpanel分组汇总的相关文章

[ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总

本文地址:http://blog.csdn.net/sushengmiyan/article/details/42240531 本文作者:sushengmiyan ------------------------------------------------------------------------------------------------------------------------------------ 本文以一个实际例子,使用了extjs的gridpanel中的分组统计显

8第八章CTE递归及分组汇总高级部分(多维数据集)(转载)

8第八章CTE递归及分组汇总高级部分(多维数据集) 这里贴图太麻烦...算了 UNION 等集合操作符: UNION 等以第一个 SELECT  的 列明 作为 整个结果集的列明,整个结果集 唯一认可的 唯一逻辑处理阶段 是 ORDER BY 这个意思是说 只有 ORDER BY 是对整个结果集作用的,其它都操作都作用在 UINON 两侧的 子集合中. EXCEPT 操作符也是 提出了重复值的 此外,它认为两个 null 值是相等的, 而 NOT EXISTS 认为两个 null 值不相等, 集

集算器协助Java处理结构化文本之分组汇总

直接用Java实现文体文件分组汇总会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当分组.汇总表达式变化时,只能改写代码.而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大. 2.遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂. 使用集算器辅助Java编程,这些问题都有现成的类库可以解决.下面,我们通过例子来看一下具体作法. 文本文件employee.txt中保存有员工信息,我们要按照DEPT

Java实现文本文件分组汇总的简便方法

程序开发中经常会碰到处理文本文件中数据的情况,这里通过一个例子来看用java实现文本文件分组汇总的方法:从文本文件employee.txt中读取员工信息,按照DEPT分组,求出每组的员工个数COUNT和薪酬SALARY总额. 文本文件empolyee.txt的格式如下: EID   NAME       SURNAME        GENDER  STATE        BIRTHDAY        HIREDATE         DEPT         SALARY 1      

R实现大文本文件数据分组汇总的方法

使用R语言对文件数据分组汇总是很普遍的操作,但有时我们会遇到比较大的文件,这类文件的计算结果较小,但源数据太大,无法全部放入内存进行计算,只能采用分批读取.分批计算.拼合结果的办法来解决.下面用一个例子来说明R实现大文件数据分组汇总的方法. 有个1G的文件sales.txt,存储着大量订单记录,我们要对CLIENT字段分组并对AMOUNT字段汇总.该文件的列分割符为"\t",前几行数据如下: R语言解决方案     con <- file("E: \\sales.txt

--DCB分组汇总过程

--DCB分组汇总过程 insert into bs_dcb_counts(id,country,currency_unit,partner,isp,business,cntgamecode,cntmoney,partmoney,bsharkmoney, totalavgmoney,partneravgmoney,pricermb,totalprice,totalrmbprice,cdate,month,year) ( select seq_dcb_billcount.nextval,temp.

SQL对取值范围进行分组汇总的几种办法

在统计工作中,我们经常遇到对一个数量的取值范围进行分组汇总的情况,比如假定id取值为1~20000,按照组距5000进行分组,我们要分别求出5000以下包括5000,5000以上10000以下包括10000,10000以上15000以下包括15000,15000以上20000以下包括20000.的计数,可以用内置取整函数ceil和除法运算得到.select ceil(id/5000) f, count(1) cnt from t1 group by ceil(id/5000) order by

R语言实现固定分组汇总的方法

组名称和组数量已知的分组汇总被称为固定分组汇总,此类算法的分组依据来自于数据集之外,比如:按照参数列表中的客户名单分组,或按照条件列表进行分组.此类算法会涉及分组依据是否超出数据集.是否需要多余的组.数据是否重叠等问题,解决起来有一定的难度.本文将介绍R语言实现固定分组汇总的方法.  例1:分组依据不超出数据集 数据框sales是订单记录,其中CLIENT列是客户名,AMOUNT列是订单金额,请将sales按照"潜力客户列表"进行分组,并对各组的AMOUNT列汇总求和.潜力客户列表为[

细节决定成败--记初学Power Query之分组汇总问题解决

在今天用手头资料联系PQ时,出现含税金额项完全是数字格式的,分组汇总求和提示有错误值,错误提示:DataFormat.Error.无法转换为Number.详细信息q.各种百度居然搜不到类似PQ的解决方法.碰巧加入曾老师的"Excel Power Query交流群"受到启发,居然是添加条件列之前的那一列的格式没统一导致汇总依据列的连贯错误.还好最后测试解决.强烈建议以后的各位PQ处理数据前先确认各列数据的属性,再进行相关的运算汇总. 原文地址:https://blog.51cto.com