每次做机房的时候,总会遇到报表的问题;每次遇到报表,又总是会卡在这里。第一次机房是由于第一次接触到报表,而且VB也没有自带报表设计器,所以只能用第三方控件来设计报表。这一次VS是自带了设计器,可是还是卡了,卡在了怎么用的问题上。经过各种查资料,发现报表其实就是难者不会会者不难。
在VB中,报表窗体可以分为三部分,窗体、控件、报表,用控件来显示报表数据,用窗体来承载控件。在VS中也类似,只不过分为数据库、控件、报表三部分更为恰当,因为报表是直接连接数据集的。以周结账单举例,下面是我做的报表,因为数据库没有数据,所以显示的只是表头。

报表设计
设计报表之前,首先应该确定你所要的报表是什么样式的,都需要些什么东西。如上图,需要文本框显示汉字和时间,还需要一张表来显示数据库的内容。另外,既然报表跟数据库连接,那么它肯定不需要自己输入数据,也就是说表头下面的每一栏都对应数据库表的字段。而且文本框中的时间,同样也是报表加载时自动显示的。
分析好自己需要的东西,就应该设计报表了。在UI层添加报表,进入到报表的设计界面,设计报表所需要的东西都在工具箱中。我做的报表只使用到了表和文本框,所以讲控件拖出来,放到适当的位置。
因为需要报表的文本框显示起始日期和终止日期,所以需要给报表设置两个参数,用来接收窗体DateTimePicker控件传来的日期。
在报表数据中,右键单击参数,添加新参数,设置参数名和类型,我用到的参数名是rptParaA和rptParaB,类型为文本类型。然后就是给文本框赋值,右击文本框,设置文本框属性,
点击值右边的函数符号,然后选择要给文本框赋得值。我用到的是给文本框赋值参数和日期时间,
设置不同文本框不同的值,这样报表就可以自动加载你所要的内容。
U层设计
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">''' <summary>
''' 实现周结账功能
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub btnCheckOut_Click(sender As Object, e As EventArgs) Handles btnCheckOut.Click
'定义B层类
Dim wBLL As New BLL.WeekCheckBLL
'定义DataTable盛放数据库数据
Dim dt As New DataTable
'给DataTable赋值
dt = wBLL.SelectData(DateTimePicker1.Text.Trim, DateTimePicker2.Text.Trim)
'定义报表数据源
Dim rptDataSource As New ReportDataSource
'数据源的名称,也就是连接数据库时设置的数据集名称
rptDataSource.Name = "dsWeekCheck"
rptDataSource.Value = dt
'说明ReportViewer承载的报表名
ReportViewer1.LocalReport.ReportEmbeddedResource = "UI.WeekBill.rdlc"
'设置两个参数的值
Dim rptParaA As ReportParameter = New ReportParameter("rptParaA", DateTimePicker1.Text.Trim)
ReportViewer1.LocalReport.SetParameters(New ReportParameter() {rptParaA})
Dim rptParaB As ReportParameter = New ReportParameter("rptParaB", DateTimePicker2.Text.Trim)
ReportViewer1.LocalReport.SetParameters(New ReportParameter() {rptParaB})
'清空ReportViewer的数据源
ReportViewer1.LocalReport.DataSources.Clear()
'加载ReportViewer的数据源为rptDataSource
ReportViewer1.LocalReport.DataSources.Add(rptDataSource)
'刷新ReportViewer
Me.ReportViewer1.RefreshReport()
End Sub</span></span>
总结
提到报表的时候,就会觉得报表很复杂,其实真正实现功能的代码也没有很多。就像三层一样,报表同样是一层一层的传输数据,只不过不像三层那样形式分明罢了。