由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。
名称: 类型:
ItemId Number
StartDate Date
EndDate Date
最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:
在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
ASP.NET水晶报表教程之在程序中使用报表
接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用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.DatabasecrDatabase; CrystalDecisions.CrystalReports.Engine.TablecrTable; TableLogOnInfodbConn=newTableLogOnInfo(); //创建报表对象opt ReportDocumentoRpt=newReportDocument(); //加载已经做好的报表 oRpt.Load("F:\\aspnet\\WroxWeb\\ItemReport.rpt"); //连接数据库,获得相关的登陆信息 crDatabase=oRpt.Database; //定义一个arrtables对象数组 object[]arrTables=newobject[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中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。
ASP.NET水晶报表教程之传递参数到ASP.NET水晶报表
定义一个新的过程,setReportParameters(),代码如下:
以下是代码片段: privatevoidsetReportParameters() { //alltheparameterfieldswillbeaddedtothiscollection ParameterFieldsparamFields=newParameterFields(); //theparameterfieldstobesenttothereport ParameterFieldpfItemId=newParameterField(); ParameterFieldpfStartDate=newParameterField(); ParameterFieldpfEndDate=newParameterField(); //设置在报表中,将要接受的参数字段的名称 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); //将参数集合绑定到报表浏览控件 crViewer.ParameterFieldInfo=paramFields; } |
现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:
以下是代码片段: ParameterFieldsparamFields=newParameterFields(); ParameterFieldpfItemId=newParameterField(); ParameterFieldpfStartDate=newParameterField(); ParameterFieldpfEndDate=newParameterField(); //设置在报表中,将要接受的参数字段的名称 pfItemId.ParameterFieldName="ItemId"; pfStartDate.ParameterFieldName="StartDate"; pfEndDate.ParameterFieldName="EndDate"; |
接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受ParameterDiscreteValue类型的对象,所以,再创建相关的实例:
以下是代码片段: 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水晶报表教程相关程序在VS.NET2003,crystalreport9以上版本可以正确运行。
联系客服