报表是应用程序中不可缺少的部分,一张好的报表,能直观地让人把握数据的情况,对决策起到重要作用。那么,如果才能更快捷、更高效地实现报表呢?本文以一个三层结构的ASP.NET程序为例,介绍如何使用crystalreport,来制作一份报表,其中介绍了不少ASP.NET水晶报表的技巧。
在这个例子中,我们设想的应用要为一个销售部门制作一份报表,管理者可以查看某段时间之内的销售情况,以列表或者折线图的形式反映出销售的趋势。我们将使用SQLServer 2000做为数据库,使用VB.NET编写中间层逻辑层,而前端的表示层使用C#。
介绍ASP.NET水晶报表教程之前,我们先来看下数据库的结构。
其中,tbitem表中存放的是每张订单中所订购的货品,tbsales存放的是每张订单,tblsalesperson是销售员表,存放该出版社的每位销售员。
接下来,使用SQLServer 2000来创建这些表。表的结构如下所示:
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]
并且用以下的代码创建表之间的约束关系。
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水晶报表教程之创建中间逻辑层
在中间逻辑层组件中,我们为每一张表都创建两个类。比如,对于tblItems表,创建item和items类。Item类中记录每件销售的货品的详细情况,而items表则记录所有销售的货品并且有增加货品的方法。这样,就存在下面的六个类:
Item and Items
SalesPerson and SalesPersons
Sale and Sales
接下来,看一下每个类中的属性:
Item类
包括如下属性
ItemId (货品id编号)
Description (货品的描述)
Items
有一个方法,将根据item的编号返回一个item对象
PublicFunctionGetAllItems()AsCollections.ArrayList
SalesPerson
ASP.NET水晶报表教程之创建表现层页面
接下来,开始创建表现层页面。首先,要创建一个可以给销售员登陆的页面,如下图所示。
在销售员成功登陆后,可以给销售员输入某样货品销售的数量,如下图:
此外,为了给业务主管看到某个时期的销售情况,创建如下页面。
其中,业务主管可以选择查看某样货品在某个时期(选择开始日期,结束日期)的销售情况,以图表方式显示。
这里特别值得一提的是,日历控件的使用。在页面中放置日历控件后,设置如下代码:
<inputtype="image"onclick="Page_ValidationActive=false;"src="datepicker.gif?http://www.xvna.com"alt="ShowCalender"runat="server"onserverclick="ShowCal1"id="ImgCal1"name="ImgCal1">
这里设置page_validationactive参数为false,所以不需要重新提交页面,并且,在onserverclick事件中,设置处理的代码,如下所示:
publicvoidShowCal1(Objectsender,System.Web.UI.ImageClickEventArgse)
{//显示日历控件 DtPicker1.Visible=true; }