在上面的公式編輯器中,分為左中右三部分,左邊的是報表的字段,中間的是相關的功能函數,最右邊的是運算符,輕按兩下其中選中的部分,則可以添加到下部的公式顯示區域中。最後,儲存建立的公式。
在程式中使用報表
接下來,我們可以在程式中用代碼處理和報表的連接配接過程。首先,在工程項目中,增加如下的兩個命名空間的引用(注意,在代碼中也必須用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對象。
運作的結果如下。