程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET中利用Crystal Report創建圖表

ASP.NET中利用Crystal Report創建圖表

編輯:.NET實例教程
在很多的應用程序中,報表是不可缺少的,一張好的報表能直觀地讓人把握數據的情況,方便決策。在這篇文章中,我們將以一個三層結構的asp.net程序為例,介紹如何使用crystal report ,來制作一份報表,其中介紹了不少ASP.Net和水晶報表的技巧。

  在這個例子中,我們設想的應用要為一個銷售部門制作一份報表,管理者可以查看某段時間之內的銷售情況,以列表或者折線圖的形式反映出銷售的趨勢。我們將使用SQL Server 2000做為數據庫,使用VB.Net編寫中間層邏輯層,而前端的表示層使用C#。我們先來看下數據庫的結構。

    其中,tbitem表中存放的是每張訂單中所訂購的貨品,tbsales存放的是每張訂單,tblsalesperson是銷售員表,存放該出版社的每位銷售員。

  接下來,使用SQL Server 2000來創建這些表。表的結構如下所示:

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     創建中間邏輯層

  在中間邏輯層組件中,我們為每一張表都創建兩個類。比如,對於tblItems表,創建item 和items類。Item類中記錄每件銷售的貨品的詳細情況,而items表則記錄所有銷售的貨品並且有增加貨品的方法。這樣,就存在下面的六個類:

  Item and Items
  SalesPerson and SalesPersons
  Sale and Sales

  接下來,看一下每個類中的屬性:

  Item類

   包括如下屬性
    ItemId (貨品id編號)
    Description (貨品的描述)
    Items

  有一個方法,將根據item的編號返回一個item對象

Public Function GetAllItems () As Collections.ArrayList
  SalesPerson

  該類有以下三個屬性:

   SalesPersonId (銷售員編號)
   Name (姓名)
   PassWord (密碼)

  SalesPersons

  有一個方法,根據銷售員登陸時輸入的用戶名和密碼,在數據庫中,驗證銷售員的登陸是否正確,如果正確,則返回零。

Public Function ValidateUser (strUserName as String, strPassWord as String) As Integer
  Sale

  有如下5個屬性

  · SaleId
  · SalesPersonId
  · ItemId
  · SaleDate
  · Amount

  Sales

  有兩個方法,其中getsales根據輸入的參數返回sales對象的集合

Public Function GetSales (Optional nSaleId As Integer = 0, Optional nSalesPersonId As Integer = 0,Optional nItemId As Integer = 0) As Collections.ArrayList
  還有一個addsales方法,用於增加一張訂單

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">
  這裡設置page_validationactive參數為false,所以不需要重新提交頁面,並且,在onserverclick事件中,設置處理的代碼,如下所示:

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);}
  在提交頁面後,將跳轉到浏覽報表的頁面vIEwreport.ASPx,傳入相關的參數,如貨品ID,開始和結束日期。
  用水晶報表創建報表

  首先,往窗體中添加水晶報表控件,之後,就可以用水晶報表的報表設計器設計一份報表了。新建一個水晶報表文件類型,命名為itemreport.rpt,接著使用報表設計專家,並選擇設計標准型的報表,點下一步,出現如下畫面:


  我們選擇使用ADO類型的數據,在彈出的窗口中,設置好SQL Server的登陸名,登陸密碼,選擇好數據庫後,選擇在報表中使用tblsales表,如下圖:


  接著選Next,在要在報表中顯示的字段中,選擇SaleDate和Amount。之後,一直選NEXT,忽略其他相關設置,最後,在圖表類型中選擇折線圖,如下圖:


  最後點擊finish,可以看到如下的報表:


  再次選擇報表專家,在彈出的窗口中選擇數據頁,在數據可用字段中選擇salesdate,並且可以在文本頁中,設置適當的報表標題。


  由於要根據輸入的日期,貨品參數來動態顯示報表,因此我們要設置參數字段。在報表設計器中,在字段資源管理器中,選擇參數字段,鼠標右擊選擇“新建”,新建如下三個參數字段。

名稱: 類型: ItemId Number StartDate Date EndDate Date   
  最後,要設置相關的查詢公式,在除報表頁眉的區域,鼠標右鍵點擊,在彈出菜單中選擇“報表|編輯選擇公式|記錄”,輸入如下的公式:


  在上面的公式編輯器中,分為左中右三部分,左邊的是報表的字段,中間的是相關的功能函數,最右邊的是運算符,雙擊其中選中的部分,則可以添加到下部的公式顯示區域中。最後,保存建立的公式。
  在程序中使用報表

  接下來,我們可以在程序中用代碼處理和報表的連接過程。首先,在工程項目中,增加如下的兩個命名空間的引用(注意,在代碼中也必須用using引入它們):

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();
  在上面的代碼中,首先接收了日期,貨品編號等參數,並實例化了Database, Table和 TableLogOnInfo 三個類,它們是用來在運行時,建立報表和數據庫的連接必需的。再使用

oRpt.Load("F:\\ASPnet\\WroxWeb\\ItemReport.rpt");
  來裝載已經做好了的報表。

  在裝載完報表後,將數據庫中要使用的表復制到一個對象數組中去,並選擇對象數組中的第一個表元素,將其轉換為水晶報表的報表對象。接著,再設置LOGONINFO中的登陸數據庫的信息。最後,將報表源與報表浏覽控件綁定。

  傳遞參數到水晶報表

  定義一個新的過程,setReportParameters(),代碼如下:

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;
}
  現在來解釋一下上面的代碼。在水晶報表中,浏覽器控件有一個屬性parameterfieldsinfo,該屬性可以通過綁定parameterfields類型的集合,將相關的參數的實際數值傳遞到報表。Parameterfields類型集合通過add的方法,接收Parameterfield類型的對象。因此,我們先為itemid,startdate,enddate三個參數創建parameterfIEld類型的對象,並且設置它們對應報表中接受參數的名稱:

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";
  接著,可以為這些參數字段設置具體的值了,但由於parameterfIEld必須接受P arameterDiscreteValue類型的對象,所以,再創建相關的實例:

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);
  最後,就可以在三個parameterfield的對象中的currentvalues中設置它們的值,並往paramFields集合中加進這三個parameterfIEld對象。

  運行的結果如下。


  本程序在VS.Net 2003,crystal report 9以上版本可以正確運行。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved