水晶報表的兩種模式:拉模式與推模式

.NET下水晶报表传递数据的两种模式

摘自:http://hi.baidu.com/xbzhu/blog/item/95158d5066d3f16785352427.html

 

摘 要 本文介绍了水晶报表的数据传递的两种模式,指出了这两种模式的优缺点及适合的情况,最后实例的方式具体实现。
关键词 水晶报表,推模式,拉模式,数据集
    水晶报表(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值