十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇內容介紹了“ASP.NET怎么實現(xiàn)水晶報表”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
專注于為中小企業(yè)提供做網(wǎng)站、網(wǎng)站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)建湖免費做網(wǎng)站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。
在這個例子中,我們設想的應用要為一個銷售部門制作一份報表,管理者可以查看某段時間之內的銷售情況,以列表或者折線圖的形式反映出銷售的趨勢。我們將使用SQLServer 2000做為數(shù)據(jù)庫,使用VB.NET編寫中間層邏輯層,而前端的表示層使用C#。
介紹ASP.NET水晶報表教程之前,我們先來看下數(shù)據(jù)庫的結構。

其中,tbitem表中存放的是每張訂單中所訂購的貨品,tbsales存放的是每張訂單,tblsalesperson是銷售員表,存放該出版社的每位銷售員。
接下來,使用SQLServer 2000來創(chuàng)建這些表。表的結構如下所示:
CREATETABLE[dbo].[tblItem]( [ItemId][int]NOTNULL, [Description][varchar](50)NOTNULL )ON[PRIMARY] CREATETABLE[dbo].[tblSalesPerson]( [SalesPersonId][int]NOTNULL, [UserName][varchar](50)NOTNULL, [Password][varchar](30)NOTNULL )ON[PRIMARY] CREATETABLE[dbo].[tblSales]( [SaleId][int]IDENTITY(1,1)NOTNULL, [SalesPersonId][int]NOTNULL, [ItemId][int]NOTNULL, [SaleDate][datetime]NOTNULL, [Amount][int]NOTNULL )ON[PRIMARY]
并且用以下的代碼創(chuàng)建表之間的約束關系。
ALTERTABLEtblItem ADDCONSTRAINTPK_ItemId PRIMARYKEY(ItemId) GO ALTERTABLEtblSalesPerson ADDCONSTRAINTPK_SalesPersonId PRIMARYKEY(SalesPersonId) GO ALTERTABLEtblSales ADDCONSTRAINTFK_ItemId FOREIGNKEY(ItemId)REFERENCEStblItem(ItemId) GO ALTERTABLEtblSales ADDCONSTRAINTFK_SalesPersonId FOREIGNKEY(SalesPersonId)REFERENCEStblSalesPerson(SalesPersonId) GO
ASP.NET水晶報表教程之創(chuàng)建中間邏輯層
在中間邏輯層組件中,我們?yōu)槊恳粡埍矶紕?chuàng)建兩個類。比如,對于tblItems表,創(chuàng)建item和items類。Item類中記錄每件銷售的貨品的詳細情況,而items表則記錄所有銷售的貨品并且有增加貨品的方法。這樣,就存在下面的六個類:
Item and Items
SalesPerson and SalesPersons
Sale and Sales
接下來,看一下每個類中的屬性:
Item類
包括如下屬性
ItemId (貨品id編號)
Description (貨品的描述)
Items
有一個方法,將根據(jù)item的編號返回一個item對象
PublicFunctionGetAllItems()AsCollections.ArrayList
SalesPerson
該類有以下三個屬性:
SalesPersonId(銷售員編號)
Name(姓名)
Password(密碼)
SalesPersons
有一個方法,根據(jù)銷售員登陸時輸入的用戶名和密碼,在數(shù)據(jù)庫中,驗證銷售員的登陸是否正確,如果正確,則返回零。
PublicFunctionValidateUser(strUserNameasString,strPasswordasString)AsInteger
Sale
有如下5個屬性
SaleId
SalesPersonId
ItemId
SaleDate
Amount
Sales
有兩個方法,其中getsales根據(jù)輸入的參數(shù)返回sales對象的集合
PublicFunctionGetSales(OptionalnSaleIdAsInteger=0,OptionalnSalesPersonIdAsInteger=0,OptionalnItemIdAsInteger=0)AsCollections.ArrayList
還有一個addsales方法,用于增加一張訂單
PublicFunctionAddSale(objSaleAsSale)
ASP.NET水晶報表教程之創(chuàng)建表現(xiàn)層頁面
接下來,開始創(chuàng)建表現(xiàn)層頁面。首先,要創(chuàng)建一個可以給銷售員登陸的頁面,如下圖所示。

在銷售員成功登陸后,可以給銷售員輸入某樣貨品銷售的數(shù)量,如下圖:

此外,為了給業(yè)務主管看到某個時期的銷售情況,創(chuàng)建如下頁面。

其中,業(yè)務主管可以選擇查看某樣貨品在某個時期(選擇開始日期,結束日期)的銷售情況,以圖表方式顯示。
這里特別值得一提的是,日歷控件的使用。在頁面中放置日歷控件后,設置如下代碼:
<inputtype="image"onclick="Page_ValidationActive=false;"src="datepicker.gif"alt="ShowCalender"runat="server"onserverclick="ShowCal1"id="ImgCal1"name="ImgCal1">
這里設置page_validationactive參數(shù)為false,所以不需要重新提交頁面,并且,在onserverclick事件中,設置處理的代碼,如下所示:
publicvoidShowCal1(Objectsender,System.Web.UI.ImageClickEventArgse) {//顯示日歷控件 DtPicker1.Visible=true; }當用戶選擇了相關的日期后,在文本框中可以獲得相關的日期:
privatevoidDtPicker1_SelectionChanged(objectsender,System.EventArgse) { txtStartDate.Text=DtPicker1.SelectedDate.ToShortDateString(); DtPicker1.Visible=false; }在提交的頁面中,處理的代碼如下:
privatevoidbSubmit_ServerClick(objectsender,System.EventArgse) { Response.Redirect("ViewReport.aspx?ItemId="+cboItemType.SelectedItem.Value+"&StartDate="+txtStartDate.Text+"&EndDate="+txtEndDate.Text);}在提交頁面后,將跳轉到瀏覽報表的頁面viewreport.aspx,傳入相關的參數(shù),如貨品ID,開始和結束日期。
ASP.NET水晶報表教程之創(chuàng)建報表
首先,往窗體中添加水晶報表控件,之后,就可以用水晶報表的報表設計器設計一份報表了。新建一個水晶報表文件類型,命名為itemreport.rpt,接著使用報表設計專家,并選擇設計標準型的報表,點下一步,出現(xiàn)如下畫面:

我們選擇使用ADO類型的數(shù)據(jù),在彈出的窗口中,設置好sqlserver的登陸名,登陸密碼,選擇好數(shù)據(jù)庫后,選擇在報表中使用tblsales表,如下圖:
|
接著選Next,在要在報表中顯示的字段中,選擇SaleDate和Amount。之后,一直選NEXT,忽略其他相關設置,***,在圖表類型中選擇折線圖,如下圖:
|
***點擊finish,可以看到如下的報表:
|
再次選擇報表專家,在彈出的窗口中選擇數(shù)據(jù)頁,在數(shù)據(jù)可用字段中選擇salesdate,并且可以在文本頁中,設置適當?shù)膱蟊順祟}。

由于要根據(jù)輸入的日期,貨品參數(shù)來動態(tài)顯示報表,因此我們要設置參數(shù)字段。在報表設計器中,在字段資源管理器中,選擇參數(shù)字段,鼠標右擊選擇“新建”,新建如下三個參數(shù)字段。
| 名稱: | 類型: |
| ItemId | Number |
| StartDate | Date |
| EndDate | Date |
***,要設置相關的查詢公式,在除報表頁眉的區(qū)域,鼠標右鍵點擊,在彈出菜單中選擇“報表|編輯選擇公式|記錄”,輸入如下的公式:

在上面的公式編輯器中,分為左中右三部分,左邊的是報表的字段,中間的是相關的功能函數(shù),最右邊的是運算符,雙擊其中選中的部分,則可以添加到下部的公式顯示區(qū)域中。***,保存建立的公式。
ASP.NET水晶報表教程之在程序中使用報表
接下來,我們可以在程序中用代碼處理和報表的連接過程。首先,在工程項目中,增加如下的兩個命名空間的引用(注意,在代碼中也必須用using引入它們):
CrystalDecisions.CrystalReports.Engine CrystalDecisions.Shared
在viewreport.aspx的Page_load事件中,加入以下代碼
//接收傳遞的參數(shù) nItemId=int.Parse(Request.QueryString.Get("ItemId")); strStartDate=Request.QueryString.Get("StartDate"); strEndDate=Request.QueryString.Get("EndDate"); //聲明報表的數(shù)據(jù)對象 CrystalDecisions.CrystalReports.Engine.DatabasecrDatabase;CrystalDecisions.CrystalReports.Engine.TablecrTable; TableLogOnInfodbConn=newTableLogOnInfo(); //創(chuàng)建報表對象opt ReportDocumentoRpt=newReportDocument(); //加載已經(jīng)做好的報表 oRpt.Load("F:\\aspnet\\WroxWeb\\ItemReport.rpt"); //連接數(shù)據(jù)庫,獲得相關的登陸信息 crDatabase=oRpt.Database; //定義一個arrtables對象數(shù)組 object[]arrTables=newobject[1]; crDatabase.Tables.CopyTo(arrTables,0); crTable=(CrystalDecisions.CrystalReports.Engine.Table)arrTables[0];dbConn=crTable.LogOnInfo; //設置相關的登陸數(shù)據(jù)庫的信息 dbConn.ConnectionInfo.DatabaseName="WroxSellers";dbConn.ConnectionInfo.ServerName="localhost"; dbConn.ConnectionInfo.UserID="sa"; dbConn.ConnectionInfo.Password="test"; //將登陸的信息應用于crtable表對象 crTable.ApplyLogOnInfo(dbConn); //將報表和報表瀏覽控件綁定 crViewer.ReportSource=oRpt; //傳遞參數(shù) setReportParameters();在上面的代碼中,首先接收了日期,貨品編號等參數(shù),并實例化了Database,Table和TableLogOnInfo三個類,它們是用來在運行時,建立報表和數(shù)據(jù)庫的連接必需的。再使用
oRpt.Load("F:\\aspnet\\WroxWeb\\ItemReport.rpt");
來裝載已經(jīng)做好了的報表。
在裝載完報表后,將數(shù)據(jù)庫中要使用的表復制到一個對象數(shù)組中去,并選擇對象數(shù)組中的***個表元素,將其轉換為水晶報表的報表對象。接著,再設置LOGONINFO中的登陸數(shù)據(jù)庫的信息。***,將報表源與報表瀏覽控件綁定。
ASP.NET水晶報表教程之傳遞參數(shù)到ASP.NET水晶報表
定義一個新的過程,setReportParameters(),代碼如下:
privatevoidsetReportParameters() { //alltheparameterfieldswillbeaddedtothiscollection ParameterFieldsparamFields=newParameterFields(); //theparameterfieldstobesenttothereport ParameterFieldpfItemId=newParameterField(); ParameterFieldpfStartDate=newParameterField(); ParameterFieldpfEndDate=newParameterField(); //設置在報表中,將要接受的參數(shù)字段的名稱 pfItemId.ParameterFieldName="ItemId"; pfStartDate.ParameterFieldName="StartDate"; pfEndDate.ParameterFieldName="EndDate"; ParameterDiscreteValuedcItemId=newParameterDiscreteValue(); ParameterDiscreteValuedcStartDate=newParameterDiscreteValue();ParameterDiscreteValuedcEndDate=newParameterDiscreteValue(); 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); //將參數(shù)集合綁定到報表瀏覽控件 crViewer.ParameterFieldInfo=paramFields; }現(xiàn)在來解釋一下上面的代碼。在水晶報表中,瀏覽器控件有一個屬性parameterfieldsinfo,該屬性可以通過綁定parameterfields類型的集合,將相關的參數(shù)的實際數(shù)值傳遞到報表。Parameterfields類型集合通過add的方法,接收Parameterfield類型的對象。因此,我們先為itemid,startdate,enddate三個參數(shù)創(chuàng)建parameterfield類型的對象,并且設置它們對應報表中接受參數(shù)的名稱:
ParameterFieldsparamFields=newParameterFields(); ParameterFieldpfItemId=newParameterField(); ParameterFieldpfStartDate=newParameterField(); ParameterFieldpfEndDate=newParameterField(); //設置在報表中,將要接受的參數(shù)字段的名稱 pfItemId.ParameterFieldName="ItemId"; pfStartDate.ParameterFieldName="StartDate"; pfEndDate.ParameterFieldName="EndDate";
接著,可以為這些參數(shù)字段設置具體的值了,但由于parameterfield必須接受ParameterDiscreteValue類型的對象,所以,再創(chuàng)建相關的實例:
ParameterDiscreteValuedcItemId=newParameterDiscreteValue(); ParameterDiscreteValuedcStartDate=newParameterDiscreteValue(); ParameterDiscreteValuedcEndDate=newParameterDiscreteValue(); dcItemId.Value=nItemId; dcStartDate.Value=DateTime.Parse(strStartDate); dcEndDate.Value=DateTime.Parse(strEndDate);
***,就可以在三個parameterfield的對象中的currentvalues中設置它們的值,并往paramFields集合中加進這三個parameterfield對象。
運行的結果如下。
|
“ASP.NET怎么實現(xiàn)水晶報表”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質量的實用文章!