企業級應用常需產出專業報表以輔助決策。本文以一個銷售部門報表系統為例,示範如何在 ASP.NET 三層架構中整合 Crystal Reports,實現銷售趨勢的列表與折線圖呈現。系統採用 SQL Server 2000 做為資料層,VB.NET 實作商務邏輯層,C# 負責表現層,展現跨語言協作的彈性。
核心三張資料表關聯如下:
ItemId、DescriptionSalesPersonId、UserName、PasswordSaleId、SalesPersonId、ItemId、SaleDate、AmountCREATE TABLE [dbo].[tblItem] (
[ItemId] [int] NOT NULL,
[Description] [varchar] (50) NOT NULL
) ON [PRIMARY];
CREATE TABLE [dbo].[tblSalesPerson] (
[SalesPersonId] [int] NOT NULL,
[UserName] [varchar] (50) NOT NULL,
[Password] [varchar] (30) NOT NULL
) ON [PRIMARY];
CREATE TABLE [dbo].[tblSales] (
[SaleId] [int] IDENTITY (1, 1) NOT NULL,
[SalesPersonId] [int] NOT NULL,
[ItemId] [int] NOT NULL,
[SaleDate] [datetime] NOT NULL,
[Amount] [int] NOT NULL
) ON [PRIMARY];
-- 主鍵與外鍵約束
ALTER TABLE tblItem ADD CONSTRAINT PK_ItemId PRIMARY KEY (ItemId);
ALTER TABLE tblSalesPerson ADD CONSTRAINT PK_SalesPersonId PRIMARY KEY (SalesPersonId);
ALTER TABLE tblSales ADD CONSTRAINT FK_ItemId FOREIGN KEY (ItemId) REFERENCES tblItem(ItemId);
ALTER TABLE tblSales ADD CONSTRAINT FK_SalesPersonId FOREIGN KEY (SalesPersonId) REFERENCES tblSalesPerson(SalesPersonId);
@StartDate、@EndDate,於「選取專家」設定記錄篩選公式:{tblSales.SaleDate} in {@StartDate} to {@EndDate}。using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ReportDocument rpt = new ReportDocument();
rpt.Load(Server.MapPath("~/Reports/SalesTrend.rpt"));
// 設定資料庫登入資訊
ConnectionInfo connInfo = new ConnectionInfo();
connInfo.ServerName = "localhost";
connInfo.DatabaseName = "SalesDB";
connInfo.UserID = "sa";
connInfo.Password = "your_password";
foreach (TableLogOnInfo logOnInfo in rpt.Database.Tables[0].LogOnInfo)
{
logOnInfo.ConnectionInfo = connInfo;
rpt.Database.Tables[0].ApplyLogOnInfo(logOnInfo);
}
// 傳遞參數
rpt.SetParameterValue("@StartDate", DateTime.Now.AddMonths(-1));
rpt.SetParameterValue("@EndDate", DateTime.Now);
CrystalReportViewer1.ReportSource = rpt;
}
}
| 層級 | 技術 | 主要職責 |
|---|---|---|
| 資料層 | SQL Server 2000 | 資料儲存、預存程序、檢視表 |
| 商務邏輯層 | VB.NET (Class Library) | 資料存取封裝、業務規則驗證、報表資料集準備 |
| 表現層 | C# (ASP.NET Web Forms) | 頁面生命週期、參數收集、CrystalReportViewer 控制項繫結 |
ReportDocument 實作 IDisposable,務必於 Page_Unload 或 using 區塊中呼叫 rpt.Close()、rpt.Dispose() 釋放非受控資源。透過 Crystal Reports 強大的排版與圖表引擎,配合 ASP.NET 三層架構的清晰分工,能快速建構出專業且可維護的企業報表系統。關鍵在於報表設計階段善用資料庫端運算、參數化查詢,以及部署時正確配置執行環境與記憶體釋放機制。