如何在施工物料管理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 報表控件,果然拖拖拽拽就解決了問題。

 

相關閱讀:

【推薦】中鐵、中石油等大型企業的復雜報表解決方案

ActiveReports11 SP1 新特性

ActiveReports11 新特性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM