DataTable中数据记录的统计-- Compute的强大

本文介绍了一种在DataTable中进行高效统计的方法,无需逐行计算即可快速得出结果。通过使用Compute函数,可以实现类似数据库中的Sum、Count等操作。

转自http://dev.youkuaiyun.com/article/22/22710.shtm

 

 

我们在使用Sql Server这些数据库时,可以轻松的通过Sum、Aver、Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web Service获得了DataSet,这个时候,可是没有办法回头去修改Select语句来获取这些统计了。那么在DataSet/DataTable中是否可以进行统计呢?答案是肯定的。

在MSDN中,有一篇MS推荐的统计方法,就是逐行对数据进行求和统计,这个方法,其实有等于无(或许这个方法只是针对于DataGrid求取小计用吧),因为这个方法中采用的是DataGrid的ItemDataBind事件来对数据进行累加,同我们手动写代码统计没有什么区别。

本文介绍一个简单的方法,不需要逐条记录进行计算就可以轻松的获得DataTable中的记录统计结果。这个简单的方法就是调用功能强大的DataTable的函数Compute。

一、调用说明(仅以C#为例,下同):

public object Compute(string strExpression,string strFilter)

参数:

strExpression:要计算的表达式字符串,基本上类似于Sql Server中的统计表达式

strFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计

二、调用举例:

以下示例,假设一个产品销售表table,描述某商场中各促销员销售的实际记录,包含字段为:姓名(Name)、性别(Sex,0为女,1为男)、生日(Birthday)、销售产品的代码(ProID)、销售的数量(Quantity)、销售价格(Price)。

1。统计所有性别为女的销售员的数量:
table.Compute("Count(*)","Sex=0");

2。统计所有销售员中年龄大于20岁的
table.Compute("Count(*)","Birthday<'"+today);//today为今天的日期字符串

3。统计销售产品的平均价格
table.Compute("Aver(Price)","true");

4。统计产品代码为1的产品销售数量:
table.Compute("Sum(Quantity)","ProID=1");

5。统计所有产品的销售总金额:
要统计总销售金额,由于table中不存在某项产品某个促销员销售的金额数据,但我们可以通过Quantity*Price来获得。比如:
table.Compute("Sum(Quantity*Price)","true");

这里一个问题是:DataTable的统计功能没有SqlServer强,这个统计是错误的,因为Compute的统计不具备Sum(Quantity*Price)这样数据的功能。那怎么办呢?

对于这样复杂数据的统计,我们可以在DataTable中创建一个新的字段来完成,比如Amount,同时设置该字段的Expression为Quantity*Price,这样我们就可以使用统计功能了:
table.Compute("Sum(Amount)","true");

 

<think>好的,我需要帮助用户在Vue中使用v-for来填充DataTable表格内容。首先,用户提到了DataTables库,它需要初始化表格并支持排序、分页等功能。在Vue中,常见的做法是在组件挂载后初始化DataTable,但使用v-for渲染数据时可能会遇到冲突,因为DataTable会修改DOM结构,而Vue的响应式系统可能无法正确追踪这些变化。 首先,我需要确认用户是否已经正确安装和引入了DataTables库及其样式文件。用户需要在项目中安装jQuery、DataTables以及可能的扩展插件,比如Buttons扩展用于导出功能。可以通过npm安装这些依赖,或者在HTML文件中通过CDN引入。 接下来,用户需要在Vue组件中定义表格的结构。使用v-for指令循环遍历数据数组来生成表格行。例如,在<tbody>中使用<tr v-for="(item, index) in tableData" :key="index">,然后每个<td>中使用{{ item.property }}来绑定数据。 然后,初始化DataTable的时机很重要。通常,在Vue组件的mounted生命周期钩子中进行初始化,因为这时DOM已经渲染完成。但是,如果在初始化DataTable之后,数据发生变化,Vue会重新渲染表格,这可能导致DataTable的实例与DOM不同步。因此,可能需要在数据更新时销毁旧的DataTable实例并重新初始化,或者使用Vue的响应式特性来动态更新表格。 另一个需要注意的问题是,DataTable会修改表格的DOM结构,例如添加分页控件、排序按钮等。如果在Vue中使用v-for生成的表格被DataTable修改,可能会导致Vue的虚拟DOM与实际DOM不一致。解决方法是确保在每次数据更新时,先销毁现有的DataTable实例,再重新初始化。可以使用.dataTable().destroy()来销毁实例,并清除可能的残留样式。 示例代码的结构大致如下:在模板中定义表格结构,使用v-for填充数据;在mounted钩子中初始化DataTable;在数据变化时,先销毁再重新创建DataTable实例。此外,需要避免在同一个表格上多次初始化DataTable,否则会出现重复的事件监听和样式问题。 可能还需要处理异步加载数据的情况。如果数据是通过API异步获取的,初始化DataTable应该在数据加载完成后进行,可以在获取数据的Promise的.then()方法中执行初始化,或者使用Vue的watch来监听数据变化并触发初始化。 此外,样式问题也需要考虑。确保正确引入DataTables的CSS文件,否则表格的样式可能不正常,比如分页按钮或搜索框的布局错乱。 最后,测试示例代码时,应检查表格是否正常显示数据,是否支持排序、搜索、分页等功能,以及数据更新后这些功能是否仍然有效。如果遇到问题,可能需要检查控制台是否有错误信息,比如jQuery未正确引入,或者DataTable初始化选项配置错误。 总结步骤:安装依赖、定义数据、模板中使用v-for渲染、mounted中初始化DataTable、处理数据更新时的重新初始化、处理异步数据加载、引入必要样式和脚本文件。</think>在Vue中结合v-for和DataTables实现表格数据填充,需注意DataTables的DOM操作与Vue响应式系统的协调。以下是实现步骤与示例代码: ### 一、基础实现步骤 1. **安装依赖** ```bash npm install jquery datatables.net datatables.net-dt ``` 2. **组件中引入资源** ```javascript import $ from 'jquery'; import 'datatables.net'; import 'datatables.net-dt/css/jquery.dataTables.css'; ``` 3. **Vue组件实现** ```vue <template> <table id="myTable" class="display"> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>城市</th> </tr> </thead> <tbody> <tr v-for="(item, index) in tableData" :key="index"> <td>{{ item.name }}</td> <td>{{ item.age }}</td> <td>{{ item.city }}</td> </tr> </tbody> </table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 25, city: '北京' }, { name: '李四', age: 30, city: '上海' }, { name: '王五', age: 28, city: '广州' } ], dataTable: null }; }, mounted() { this.initDataTable(); }, methods: { initDataTable() { if (this.dataTable) { this.dataTable.destroy(); // 销毁旧实例 } this.$nextTick(() => { this.dataTable = $('#myTable').DataTable({ paging: true, searching: true, ordering: true }); }); } } }; </script> ``` ### 二、动态数据更新处理 ```javascript watch: { tableData: { handler() { this.initDataTable(); }, deep: true } } ``` ### 三、扩展功能实现(导出/打印) ```javascript // 引入按钮扩展 import 'datatables.net-buttons'; import 'datatables.net-buttons/js/buttons.html5'; import 'datatables.net-buttons/js/buttons.print'; // 修改初始化配置 this.dataTable = $('#myTable').DataTable({ dom: 'Bfrtip', buttons: ['copy', 'csv', 'excel', 'pdf', 'print'] }); ``` ### 四、注意事项 1. **Key属性必要性**:v-for必须设置唯一key值避免渲染异常 2. **DOM更新时序**:使用$nextTick确保DOM更新完成再初始化 3. **内存管理**:组件销毁时手动清理实例 ```javascript beforeDestroy() { if (this.dataTable) { this.dataTable.destroy(true); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值