如何在施工物料管理Web系统中处理大量数据并显示

最近在开发施工物料管理系统,其中涉及大量的物料信息需要管理和汇总,数据量非常庞大。之前尝试自己通过将原始数据,加工处理建模,在后台代码中通过分组、转置再显示到 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))[email protected] and b.Month>[email protected] and b.Month<[email protected]  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))[email protected]  and a.OrderDate>[email protected] AND a.OrderDate<[email protected]
        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 的值来生成列数;行会根据一级类别和二级类别,自动合并相同单元格,并根据内容自动生成行数据;将字段拖拽到单元格后,合并单元格,调整样式。

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

时间: 2024-11-09 07:44:20

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

用于管理Linux系统中的各种服务的命令service命令

我们知道service命令是用于管理Linux系统中的各种服务的命令.其实service是位于系统中/usr/sbin/service的一个可执行的脚本,其内容如下: #!/bin/sh ########################################################################### # /usr/bin/service # # A convenient wrapper for the /etc/init.d init scripts.  #

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

LoadRunner测试ajax框架的系统时,录制回放都没有报错,但是回放后系统中没有产生数据,数据始终不能写入数据库.查了一下原因,应该是录制的脚本不完善的问题,因为JS是在客户端执行的程序,LR只能监控客户机与服务器之前的通信. 解决方法: Recording options> HTTP Properites> Advanced > Headers: 选择"Record headers not in list", 然后点ok. 重新录制一遍脚本,会发现脚本里多出一

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

//EXTJS中grid的数据特殊显示renderer : function(value, metaData, record, rowIndex, colIndex, store, view) { var USED_AMOUNT_ = 0; for (var i = 0; i < matMonthPlanHisList.length; i++) { if(matMonthPlanHisList[i].MAT_NO_ == record.get('MAT_NO_')){ USED_AMOUNT_

vc 在edit控件中动态插入数据滚动显示

内存从网上论坛摘抄整理 思路:给控件设置多行属性,设置垂直滚动条,Auto Vscroll设置为true,放入文本后把插入点设置到末尾 pEdit->LineScroll(pEdit->GetLineCount()); 滚动条滚动到最下端 int len  = pEdit->GetWindowTextLength(); pEdit->SetSel(len,-1,true); //定位光标到内容末尾pEdit->ReplaceSel("12121212");

如何处置web系统中的密码

密码,是敏感又重要的信息.对密码的处理是非常重要的.那么在web系统该如何处理密码呢?在下略有心得,备忘如下. 密码的轨迹 用户 => 应用服务器 => 数据库 从用户在客户端/浏览器输入密码到传输到应用服务器,再存储到数据库.有很多措施可以用来提高密码的安全性. 用户 => 应用服务器 用户的原始密码经过http协议传输到应用服务器. 使用https. 虽然前段时间出现心血漏洞,但是并不能说https就没用了. 加密传输. 对原始密码进行单项加密可以有效提高破解成本,甚至完全杜绝渗透者

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

IE浏览器下使用Activex插件调用客户端扫描仪扫描文件并山传,可以将纸质档案(如合同.文件.资料等)扫描并将扫描图像保存到服务器,可以用于合同管理.档案管理等. 通过插件方式调用扫描仪扫描并获取图像,可以减少用户操作,减少操作出错,如一次扫描量大也可以使用连续扫描,由系统对扫描文件进行编号或进行其他处理. web页面中只需通过js调用后启动扫描仪扫描,即可获取扫描文件的图像编码,再通过ajax或表单提交到服务器解码后保存为jpg文件即可. 通过服务器上程序处理后,可以方便以后浏览或去其它用户

asp网络编程:Web程序中网页间数据传递方法小结

我们总是会遇到这样的情况,需要将数值从一个网页传递到另一个网页.在这篇文章中,向你展示了几种从一个网页向另一个网页传递数值的几种方法.在此例子中,创建的网页由一个文本控件和几个按钮控件组成.在文本框中输入的数据通过被标识在按钮控件中的不同方法从一个网页传递到另一个网页. Response.Redirect 让我们首先看一看如何使用Response.Redirect方法传递数据.这是它们之中最简单的方法.在文本框中输入一些数据,并且当你输入完成数据后,按下“Respose.Redirect”按钮.

web系统中ACL, RBAC等鉴权系统的异同

ACL, 强调面向资源, 描述对具体资源对象的操作鉴权, 有诸如Zend_ACL(好用), symfony-acl(不好用)等实现 应用场景如:对一条帖子资源的增删改鉴权, 整个鉴权流程中, 权限部分是由具体帖子对象和增删改等操作共同构成的.授权的结果是将 "资源---操作" 组合授权给用户. RBAC,强调面向角色的权限节点鉴权, 描述对功能节点的鉴权,有诸如ThinkPHP-RBAC, sylius/rbac-bundle(symfony)等实现 应用场景如: 依据不同用户角色显示

创建一个Java Web项目,获取POST数据并显示

新建一个新的Java Web工程项目 打开IntelliJ IDEA 新建一个工程,选择选择Java Enterprise,设置Tomcat的安装目录,点击下一步. 选中Create project from template,点击下一步: 创建工程成功,可以看到目录结构是如下图一样的: 第一个程序,HelloWorld程序 JSP代码要使用<%%>包起来,因此HelloWorld输出到网页上是这么写的: 变量的使用 Java Web中的变量是这么声明和使用的. 构建一个登录页面 接受表单参数