在很多的應用程序中,報表是不可缺少的,一張好的報表能直觀地讓人把握數據的情況,方便決策。在這篇文章中,我們將以一個三層結構的asp.net程序為例,介紹如何使用crystal report ,來制作一份報表,其中介紹了不少asp.net和水晶報表的技巧。
在這個例子中,我們設想的應用要為一個銷售部門制作一份報表,管理者可以查看某段時間之內的銷售情況,以列表或者折線圖的形式反映出銷售的趨勢。我們將使用SQL Server 2000做為數據庫,使用VB.NET編寫中間層邏輯層,而前端的表示層使用C#。我們先來看下數據庫的結構。

| CREATE 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) GO ALTER TABLE tblSalesPerson ADD CONSTRAINT PK_SalesPersonId PRIMARY KEY (SalesPersonId) GO ALTER TABLE tblSales ADD CONSTRAINT FK_ItemId FOREIGN KEY (ItemId) REFERENCES tblItem(ItemId) GO ALTER TABLE tblSales ADD CONSTRAINT FK_SalesPersonId FOREIGN KEY (SalesPersonId) REFERENCES tblSalesPerson(SalesPersonId) GO |
| Public Function GetAllItems () As Collections.ArrayList |
| Public Function ValidateUser (strUserName as String, strPassword as String) As Integer |
| Public Function GetSales (Optional nSaleId As Integer = 0, Optional nSalesPersonId As Integer = 0,Optional nItemId As Integer = 0) As Collections.ArrayList |
| Public Function AddSale (objSale As Sale) |



| <input type="image" onclick="Page_ValidationActive=false;" src="datepicker.gif" alt="Show Calender" runat="server" onserverclick="ShowCal1" id="ImgCal1" name="ImgCal1"> |
| public void ShowCal1(Object sender, System.Web.UI.ImageClickEventArgs e) { //顯示日歷控件 DtPicker1.Visible = true; } |
| private void DtPicker1_SelectionChanged(object sender, System.EventArgs e) { txtStartDate.Text = DtPicker1.SelectedDate.ToShortDateString(); DtPicker1.Visible = false; } |
| private void bSubmit_ServerClick(object sender, System.EventArgs e) { Response.Redirect("ViewReport.aspx?ItemId=" + cboItemType.SelectedItem.Value + "&StartDate=" + txtStartDate.Text + "&EndDate=" + txtEndDate.Text);} |
![]() |
![]() |
![]() |
![]() |
![]() |
| 名稱: | 類型: |
| ItemId | Number |
| StartDate | Date |
| EndDate | Date |
![]() |
| CrystalDecisions.CrystalReports.Engine CrystalDecisions.Shared 在viewreport.aspx的Page_load事件中,加入以下代碼 //接收傳遞的參數 nItemId = int.Parse(Request.QueryString.Get("ItemId")); strStartDate = Request.QueryString.Get("StartDate"); strEndDate = Request.QueryString.Get("EndDate"); //聲明報表的數據對象 CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable; TableLogOnInfo dbConn = new TableLogOnInfo(); // 創建報表對象opt ReportDocument oRpt = new ReportDocument(); // 加載已經做好的報表 oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt"); //連接數據庫,獲得相關的登陸信息 crDatabase = oRpt.Database; //定義一個arrtables對象數組 object[] arrTables = new object[1]; crDatabase.Tables.CopyTo(arrTables, 0); crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo; //設置相關的登陸數據庫的信息 dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost"; dbConn.ConnectionInfo.UserID = "sa"; dbConn.ConnectionInfo.Password = "test"; //將登陸的信息應用于crtable表對象 crTable.ApplyLogOnInfo(dbConn); //將報表和報表瀏覽控件綁定 crViewer.ReportSource = oRpt; //傳遞參數 setReportParameters(); |
| oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt"); |
| private void setReportParameters() { // all the parameter fields will be added to this collection ParameterFields paramFields = new ParameterFields(); // the parameter fields to be sent to the report ParameterField pfItemId = new ParameterField(); ParameterField pfStartDate = new ParameterField(); ParameterField pfEndDate = new ParameterField(); // 設置在報表中,將要接受的參數字段的名稱 pfItemId.ParameterFieldName = "ItemId"; pfStartDate.ParameterFieldName = "StartDate"; pfEndDate.ParameterFieldName = "EndDate"; ParameterDiscreteValue dcItemId = new ParameterDiscreteValue(); ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue(); dcItemId.Value = nItemId; dcStartDate.Value = DateTime.Parse(strStartDate); dcEndDate.Value = DateTime.Parse(strEndDate); pfItemId.CurrentValues.Add(dcItemId); pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate); paramFields.Add(pfItemId); paramFields.Add(pfStartDate); paramFields.Add(pfEndDate); // 將參數集合綁定到報表瀏覽控件 crViewer.ParameterFieldInfo = paramFields; } |
| ParameterFields paramFields = new ParameterFields(); ParameterField pfItemId = new ParameterField(); ParameterField pfStartDate = new ParameterField(); ParameterField pfEndDate = new ParameterField(); // 設置在報表中,將要接受的參數字段的名稱 pfItemId.ParameterFieldName = "ItemId"; pfStartDate.ParameterFieldName = "StartDate"; pfEndDate.ParameterFieldName = "EndDate"; |
| ParameterDiscreteValue dcItemId = new ParameterDiscreteValue(); ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue(); dcItemId.Value = nItemId; dcStartDate.Value = DateTime.Parse(strStartDate); dcEndDate.Value = DateTime.Parse(strEndDate); |
![]() |
新聞熱點
疑難解答