最近在开发施工物料管理系统,其中涉及大量的物料信息需要管理和汇总,数据量非常庞大。之前尝试自己通过将原始数据,加工处理建模,在后台代码中通过分组、转置再显示到 Web 页面中,但自己编写的代码量非常大,而且性能很差简直无法忍受。后来使用了矩表控件非常好的解决了需求,本文主要介绍之前如何通过代码将数据展现在页面中,以及使用矩表控件创建行列转置和动态列表格,并显示在网页中。

一、通过代码将数据展现在页面的步骤

1.行列转置代码片段:

public static DataTable GetCrossTable(DataTable dt)
{
if (dt == null || dt.Columns.Count != 3 || dt.Rows.Count == 0)
{
return dt;
}
else
{
DataTable result = new DataTable();
result.Columns.Add(dt.Columns[0].ColumnName);
DataTable dtColumns = dt.DefaultView.ToTable("dtColumns", true, dt.Columns[1].ColumnName);
for (int i = 0; i < dtColumns.Rows.Count; i++)
{
string colName;
if (dtColumns.Rows[1][0] is DateTime)
{
colName = Convert.ToDateTime(dtColumns.Rows[i][0]).ToString();
}
else
{
colName = dtColumns.Rows[i][0].ToString();
}
result.Columns.Add(colName);
result.Columns[i + 1].DefaultValue = "0";
}
DataRow drNew = result.NewRow();
drNew[0] = dt.Rows[0][0];
string rowName = drNew[0].ToString();
foreach (DataRow dr in dt.Rows)
{
string colName = dr[1].ToString();
double dValue = Convert.ToDouble(dr[2]);
if (dr[0].ToString().Equals(rowName, StringComparison.CurrentCultureIgnoreCase))
{
drNew[colName] = dValue.ToString();
}
else
{
result.Rows.Add(drNew);
drNew = result.NewRow();
drNew[0] = dr[0];
rowName = drNew[0].ToString();
drNew[colName] = dValue.ToString();
}
}
result.Rows.Add(drNew);
return result;
}
}

2.实现多级分组逻辑示例代码:

public void GroupByClassLeverl()
{
var query =
from inforCode in ClassReportDetail group InfoCode by BigClassName into newGroup
orderby newGroup.Key
select newGroup; foreach (var BigClassName in ClassReportDetail )
{
Console.WriteLine("Key: {0}", nameGroup.Key);
foreach (var ClassName in nameGroup)
{
Console.WriteLine("\t{0}, {1}", student.BigClassName , student.ClassName );
………… }
}
}

3. SQL 语句实现中实现汇总分级功能,进行7张表的复杂连接和汇总:

每一张表中包含多列,需要做出多层连接和排序,并根据用户输入对数据进行过滤

select a.*,b.SupplyMode,h.ClassName,g.ClassName BigClassName,e.ReceiveDepName,f.W_ReceiveDepName,
isnull(b.reQuantity,0)reQuantity,isnull(b.reBookSum,0) reBookSum,isnull(d.mQuantity,0) mQuantity,isnull(d.mBookSum,0)
…,
isnull(f.W_allQuantity,0) W_allQuantity,isnull(f.W_allAllotSum,0) W_allAllotSum,isnull(f.W_AllotBookSum,0) W_AllotBookSum
from (select a.InfoCode,a.InfoName,a.InfoModel,a.InfoUnit,a.ClassNodebh,a.Rate,a.NonRatePrice,a.BookPrice,a.Manufacturer,a.BatchNo,a.BarCode,a.Storeroom,a.InfoRemark
from (
select b.InfoCode,b.InfoName,b.InfoModel,b.InfoUnit,b.ClassNodebh,b.Rate,b.NonRatePrice,b.BookPrice,b.Manufacturer,b.BatchNo,b.BarCode,b.Storeroom,b.InfoRemark
from dbo.M_MonthStore b
where left(b.ProjectID,LEN(@projectid))=@projectid and b.Month>=@startmonth and b.Month<=@endmonth and b.MonthBalanceNum!=0
group by b.InfoCode,b.InfoName,b.InfoModel,b.InfoUnit,b.ClassNodebh,b.Rate,b.NonRatePrice,b.BookPrice,b.Manufacturer,b.BatchNo,b.BarCode,b.Storeroom,b.InfoRemark
union all
select InfoCode,InfoName,InfoModel,InfoUnit,ClassNodebh,Rate,NonRatePrice,BookPrice,Manufacturer,BatchNo,BarCode,b.Storeroom,InfoRemark
from dbo.M_ReceiveOrder a inner join dbo.M_ReceiveOrderItem b
on a.ProjectID=b.ProjectID
and a.OrderID=b.OrderID
where left(a.ProjectID,LEN(@projectid))=@projectid and a.OrderDate>=@startdate AND a.OrderDate<=@enddate
AND a.IsAudit=1
union all ……) b
on a.InfoCode=b.InfoCode
and a.InfoName=b.InfoName
and a.InfoModel=b.InfoModel
and a.InfoUnit=b.InfoUnit
and a.ClassNodebh=b.ClassNodebh
and a.StoreRoom=b.StoreRoom
……….
order by supplymode,ReceiveDepName,W_ReceiveDepName desc

最终只能将数据单一的呈现出来,而且样式过于简单,将近上万条的数据呈现起来性能无法承受,常常会导致页面崩溃。

使用报表提供的矩表控件实现行列转置,就不需要再写那么复杂的行列转置和分组代码,而且会根据物料的供应方式来自动生成列,将数据展现在最终页面中。

二、使用矩表控件实现步骤:

1. 添加 RDL 报表

2.为报表添加数据源

3.添加数据集

在数据集窗口中输入 SQL 语句:

select * From ClassReportDataTable.

获取字段

4. 添加矩表控件

5. 搭建报表结构

5.1 首先按照一级类别和二级类别添加行分组

选中行分组单元格,添加行分组-》子分组

5.2 添加供应方式动态列

右键单击列分组单元格,选择插入列分组,按照设计的样式,插入三个列分组。

5.3 插入静态列,因为这些列不会随着数据而动态改变,所以是静态列,只需要右键单击-》插入列

到这里,数据的基本结构就成形了,接下来需要做的就是将业务数据和矩表控件绑定。

5.4 数据绑定

想想原来还需要编写各种行列转置代码、生成分组代码,头就疼了,现在使用矩表控件,直接将数据字段拖拽到对应的单元格,就可以动态生成行列。如将 "SupplyMode" 添加到列分组单元格上,会自动根据 SupplyMode 的值来生成列数;行会根据一级类别和二级类别,自动合并相同单元格,并根据内容自动生成行数据;将字段拖拽到单元格后,合并单元格,调整样式。

再也不用痛苦的编写前端显示和超复杂的性能优化代码,页面半个小时都刷不出来,用户真的无法忍耐;现有使用比较成熟的 ActiveReports报表控件,果然拖拖拽拽就解决了问题。

相关阅读:

【推荐】中铁、中石油等大型企业的复杂报表解决方案

ActiveReports11 SP1 新特性

ActiveReports11 新特性

如何在施工物料管理Web系统中处理大量数据并显示的更多相关文章

  1. LoadRunner测试ajax框架,回放后系统中没有产生数据解决方法

    1.QTP11 下载地址:http://www.genilogix.com/downloads/unified-functional-testing/quicktest-professional-11 ...

  2. EXTJS中grid的数据特殊显示,不同窗口的数据传递

    //EXTJS中grid的数据特殊显示renderer : function(value, metaData, record, rowIndex, colIndex, store, view) { v ...

  3. VLC在web系统中应用(x-vlc-plugin 即如何把VLC嵌入HTML中)第一篇

    VLC毫无疑问是优秀的一款播放软件,子B/S机构的web项目中,如果能把它嵌入页面,做页面预览或者其他,是非常棒的. 第一步:下载VLC安装程序:(推荐1.0.3或者是1.0.5版本,比较稳定) ht ...

  4. B/S(WEB)系统中使用Activex插件调用扫描仪实现连续扫描并上传图像(IE文件扫描并自动上传)

    IE浏览器下使用Activex插件调用客户端扫描仪扫描文件并山传,可以将纸质档案(如合同.文件.资料等)扫描并将扫描图像保存到服务器,可以用于合同管理.档案管理等. 通过插件方式调用扫描仪扫描并获取图 ...

  5. 在Web界面中实现Excel数据大量导入的处理方式

    在早期Bootstrap框架介绍中,我的随笔<结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传.预览.提交的导入Excel数据操作流程> ...

  6. web.xml中配置固定数据

    在web.xml单个servlet中配置的数据的存取 存: <servlet> <description>This is the description of my J2EE ...

  7. Web系统中Mic设备的应用实例

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  8. java web系统中时间比sql server中的日期少2天的解决办法

    系统环境 jdk:1.7 数据库:sql server 2008 问题描述 升级1.7之后查询出来的日期就比数据库中的少2天,降回1.6版本的jdk就正常了. 问题原因及解决办法 国内网站有很多不靠谱 ...

  9. 手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示

    手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示 效果演示地址 项目demo展示 重要功能总结 权限功能的实现 权限路由思路: 根据用户登录的roles信息与路由中配置的roles信息进行比 ...

随机推荐

  1. 大前端学习笔记整理【六】this关键字详解

    前言 在上一篇博客里我总结了下辨认this指向的四种方式,但是有师兄抛出一个问题来,我发现那些this的指向并不能说明更复杂的情况,先看下这段代码 var a = { name: 'a', getNa ...

  2. linux系统编程之lseek帮助文档

    通过man 2 lseek可以查看linux中的系统函数lseek函数的帮助文档,为了更好的学习,我把这些重要内容翻译过来 NAME lseek - reposition read/write fil ...

  3. JS-sort排序

    var arr = [ 'c', 'd', 'a', 'e' ];// arr.sort();// alert( arr );var arr2 = [ 4,3,5,5,76,2,0,8 ];// ar ...

  4. Android 时间维护服务 TimeService(针对于特殊定制设备)

    此方法针对于无法自动获取网络时间的特殊设备,正常 Android 设备直接调用 System.currentTimeMillis(); 方法获取当前时间即可. TimeService 集成于 Serv ...

  5. mysql无法登录

    很久没用root账户登录mysql发现无法登录 以为root密码被修改 修改root密码后还是无法登录 判断ip没权限 运行 Grant all privileges on *.* to 'root' ...

  6. npm下载速度太慢

    因为墙的原因导致下载速度过慢,解决方式就是使用国内镜像 使用淘宝的镜像 npm config set registry="http://registry.npm.taobao.org/&qu ...

  7. 原生JavaScript实现滚动条

    没事找事,明明overflow:scroll|auto就可以,只是难看点(实际上css也能设置).只当练习写拖拽.监听事件.位置检测了. 原理是对滑动条块进行监听,按下鼠标按键后,监听鼠标移动,然后根 ...

  8. 超级编辑器--VIM的常见操作

    如下,都是我常用的 删除单词:  d + w 关闭vim窗口:   :q   或者 shift + zz 全部向左移: shift + v  --->  shift + <   ---&g ...

  9. “设计之变”--从iPhone应用到iPad应用

    在做APP的iPad版本设计时,我们常常需要考虑:如何在延续iPhone版本设计特色和优点同时,充分利用iPad的特性更好地进行设计.本文从iPad和iPhone的差异性入手,试图总结这一设计过程中需 ...

  10. RHEL6p5下ntfs分区的挂载及自动挂载

    No.1: #uname -a //查看你的Linux内核版本的命令 No.2:去http://www.atrpms.net/dist/el5/fuse/下载与内核接近的三个东西 fuse-libs- ...