如何在施工物料管理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))=@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

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

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

1. 添加 RDL 报表

2

2.为报表添加数据源

3

3.添加数据集

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

select * From ClassReportDataTable.

获取字段

4

4. 添加矩表控件

5

5. 搭建报表结构

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

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

6

5.2 添加供应方式动态列

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

7

8

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

9

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

5.4 数据绑定

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

10

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

本文转自ITPUB博客77rou的博客,原文链接:如何在施工物料管理Web系统中处理大量数据并显示,如需转载请自行联系原博主。

相关文章
|
11月前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
269 0
|
7月前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
161 0
|
10月前
|
存储 消息中间件 缓存
构建互联网高性能WEB系统经验总结
如何构建一个优秀的高性能、高可靠的应用系统对每一个开发者至关重要
78 2
|
11月前
|
机器学习/深度学习 数据处理 数据库
基于Django的深度学习视频分类Web系统
基于Django的深度学习视频分类Web系统
154 4
基于Django的深度学习视频分类Web系统
|
10月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
207 2
|
10月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
221 3
|
10月前
|
存储 消息中间件 缓存
构建互联网高性能WEB系统经验总结
构建互联网高性能WEB系统经验总结
118 16
|
10月前
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
336 2
|
11月前
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
190 5

热门文章

最新文章