摘 要 本文介绍了水晶报表的数据传递的两种模式,指出了这两种模式的优缺点及适合的情况,最后实例的方式具体实现。
关键词 水晶报表,推模式,拉模式,数据集
水晶报表(Crystal Reports)是世界领先的用于创建交互报表的软件包,报表可以发布在Web上或集成在应用程序中。水晶报表以其强大的报表功能、方便的设计工具和支持多种语言,现已成为Web及Windows报表编写器的主导者。
在向水晶报表传递数据时,有两种方式可以实现,分别是拉模式和推模式。在VS.NET2003及VS.2005中提供了水晶报表的设计工具,通过它可以方便的设计各种水晶报表。本文将对这两种模式分别作简要的介绍,并在VS.NET环境下举例实现。
一、 水晶报表中使用拉模式
1.拉模式简介
在拉模式中,数据库驱动程序连接到数据库,并根据用户预先设定好的查询语句,将数据“拉”进来。使用这种模型时,与数据库的连接和为了获取数据而执行的SQL命令都同时由水晶报表本身处理。比如在选取数据源的时候选的Access/Excel、ODBC、OLEDB、数据库文件。
在拉模式下,只要按照报表专家的向导来操作,水晶报表直接根据指定的驱动连接数据库然后组装这些数据,不需要开发人员编写代码。拉模式适用于不需要对数据库(或数据文件)中的数据进行额外的处理(如数值计算等)的情况,其优点是设计时非常方便,可以随时对设计的情况进行预览,但在应用程序部署时则比较繁琐(如需要设定数据库连接的数据源及驱动)。
2.拉模式的实现
举例说明:用水晶报表显示某公司员工的详细信息清单。首先新建一个项目,在项目中添加水晶报表,如图1所示:
图1 新建水晶报表
点击确定,进入选择报表的创建方式,这里使用“使用报表专家”,选择“标准”类型(这里还可以选择其它类型的,在此不做举例)。接下来就是设置数据源,在可用的数据源列表中选择ODBC(RDO),如图2所示。在弹出的界面中选择一个已经设定好的ODBC,本例中是SQL Server2000中自带的Northwind数据库。
图2 选择数据源
接下来就可以从已经连接好的数据库中选择具体的表来生成报表,如图3所示。这里以雇员信息表Employees为例,显示雇员的基本信息。
图3 选择表
选中具体的表之后,选择在将要在报表中显示的字段,进行相关的分组、统计及按某种要求生成图形等设置,如图4所示。
图4 设置报表的显示格式
设定好报表的显示格式后,在一个窗体中添加一个报表浏览器,并在报表浏览器的load事件中添加如下代码:
CrystalReportViewer1.ReportSource = New CrystalReport1
运行之后,显示的界面如图5所示。
图5 报表运行结果
这是一个简单的运用拉模式向水晶报表传递数据的例子,当然还可以在此基础上做些复杂的显示,比如分组,统计,以图形报表的方式显示等。这些操作几乎不用编写任何的代码就能实现,而且功能非常强大。具体的操作方法,请参照相关的水晶报表编程书籍。
二、 在水晶报表中使用推模式
1. 推模式简介
与拉模式最大的区别,是使用推模式时需要开发人员编写代码以连接到数据库,执行SQL命令以创建与报表中的字段匹配的记录集或数据集,并且将产生的数据传递给报表。该方法要求将数据库连接的操作置入应用程序中,并在水晶报表收到数据之前先将数据筛选出来。此时开发报表不得不自己编写代码连接数据库获取数据,并组装成数据集,同时将它传送至报表。推模式一般是利用字段定义的数据集、ADO.NET数据集、ADO.NET(XML)等方式实现。
虽然使用推模式需要一定的编码量,也没有拉模式便捷的导向式设计,但当数据库中的数据是加密的无法直接显示,或数据需要进行处理后再进行显示的时候,推模式就体现出了它的优势。
2. 推模式的实现
使用推模式向水晶报表传递数据,其思路是:先设计一个能存放数据的数据集(在VS.NET中一般是强类型的DataSet),以此数据集作为水晶报表的数据源。报表的显示格式还是像拉模式那样,然后通过程序填充数据集,最后将生成的数据集绑定到水晶报表的数据源上。举例如下:用水晶报表生成一份试卷,试题是加密的,存放于数据库中,由于不能采用拉模式的方式传递数据,采用推模式最合适。
在原项目基础上(也可新建一个项目)新建一个强类型的数据集,如图6所示。
图6 新建一个数据集
在这里新建一个自定义的数据集,内容是一份试卷,如图7所示。
图7 数据集元素
图8为其XML格式,该数据集也可从XML格式的文档转化而来。
图8 数据集的XML格式
将数据集建立之后,新建一个水晶报表,制定报表的数据源为刚刚新建的数据集,如图9所示。
图9 选择报表的数据源
接下来的操作与拉模式操作类似,设计报表的格式及显示风格,具体操作见图4。设计好报表之后,添加一个窗体及报表浏览器,在报表浏览器的load事件中添加如下代码:
'定义DataSet、DataRow 、DataColumn等变量
Dim mydr As SqlDataReader
Dim myds As New DataSet
Dim mydc As New DataColumn
Dim th, i, count As Integer
'依据选出的试题编号以及题目生成一个强类型dataset
Dim mydt As New temp_tb.temp_sjDataTable
Dim str As String
'从试题信息表中提取加密的试题信息
str = "select * from sjstxxb where kssj='" & kssj & "' and ksdm='" & ksdm & "' and sjbh=" & sjbh
mydr = dboper.DBRead(str)
If Not mydr.HasRows Then
MessageBox.Show("没有试卷信息,请检查!", "请检查", MessageBoxButtons.OK, MessageBoxIcon.Information)
Exit Sub
End If
'填充DataRow,将DataRow添加到DataTable中
While mydr.Read
Dim dr = mydt.NewRow
dr("kssj") = mydr.GetString(1)
dr("kskm") = mydr.GetString(2)
dr("ksdm") = mydr.GetString(3)
th = mydr.GetInt32(4)
dr("th") = th
dr("tm") = encrypt.Decrypt(get_stnr(th))
dr("stfs") = mydr.GetInt32(5)
dr("stlx") = mydr.GetString(6)mydt.Rows.Add(dr)
End While
mydr.Close()'将datatable绑定到dataset
count = mydt.Rows.Count
myds.Tables.Add(mydt)rpt_paper.SetDataSource(myds) '将DataSet绑定到报表的数据源
rpt_paper.Refresh()
CrystalReportViewer1.ReportSource = rpt_paper
最后显示的报表如图10所示。
图10 生成报表
三、 结语
水晶报表的功能非常强大,笔者只是根据实际应用中的经验写出来。在设计报表时,根据具体数据传递的情况来设计,但它们包含在推和拉这两种模式中。当然,很多报表细节方面的设计细节及技巧并未提及,大家可以参照水晶报表官方网站及相关的书籍。
参考文献:
[1] 李万红,王 军.Crystal Reports for Visual Studio .NET高级编程.清华大学出版社.2003,4
[2] 李行武,施妍然.Crystal Reports 9水晶报表设计与开发大全.清华大学出版社.2004,5
[3] 王健伟,李延如,王晓红.Crystal Reports水晶报表设计与开发实务.电子工业出版社.2003,1