今天我们来学习一下ReportingService报表的制作。
ReportingService是微软提供的一个制作报表的工具,它集成在Microsoft Visual Studio中。
启动Visual Studio,如下图所示:

    启动之后进入开始界面,如下图所示:


    界面的上边是菜单栏、工具栏。左边是“服务器资源”和“工具箱”选项卡,服务器资源中放置的服务器连接之类的东西,工具箱中放置的是文本框、线条、表格等图标。右边放置的事“解决方案资源管理器”和“属性”选项卡,解决方案资源管理器中放置的是工程中的数据源和报表文件,属性选项卡中放置的事选中对象的各种属性,如大小、颜色、字体等等。下边是输出栏,输出各种错误信息和警告信息。中间的主窗口中放置起始页或者选中文件的内容。
首先我们需要创建个报表工程,单击上图起始页中的“创建项目”链接,弹出“新建项目”的对话框,如下图所示:
 


    在项目类型中选择“商业智能项目”,在模板中选择“报表服务器”,输入项目名称、位置等信息,点击“确定”按钮,在“解决方案资源管理器”中就会出现刚才新建的项目,如下图所示:



    在项目中出现两个文件夹:共享数据源和报表。共享数据源文件中放置查询数据时所要用的数据库连接,报表文件夹中放置报表文件。要查询数据,必定要有数据源,所以下来我们要新建一个数据源。右击上图中的“共享数据源”文件夹,在右键菜单中选择“添加新数据源”,如下图所示:
  


    弹出“共享数据源”对话框,如下图所示:
 


    在“常规”选项卡的“名称”文本框中输入数据源的名称,“类型”下拉框中选择数据源的类型,目前Visual Studio中提供的数据源类型有Microsoft SQL Server、OLE DB、Oracle、ODBC等等。输入了数据源名称,选择了数据源类型,下来就该编辑连接字符串了。点击上图中的“编辑”按钮,弹出“连接属性”对话框,如下图所示:
 

    在里边输入服务器名称、用户名和密码。如果数据源类型选择的是Oracle,那么此处的服务器名称应该是在Oracle的数据源配置文件tnsnames.ora中已经配置好的数据源的名字。如果这个文件中没有配置好,那么是无法连接的。输入完毕后,点击“测试连接”按钮,看是否能够正常连接。连接不正常的话,则需要查找原因,看是服务器名、用户名、密码或者是网络什么地方出了问题。连接正常则点击“确定”按钮,回到“共享数据源”对话框,此时在“连接字符串”框中就会显示配置的连接字符串。如下图所示:
 

    接下来点击“凭据”选项卡,确认用户名和密码是否正确。如下图所示:
 

    添加完数据源之后,就该添加报表了。右击“报表”文件夹,在右键菜单中选择“添加新报表”选项,如下图所示:

    弹出“报表向导”对话框,如下图所示:
 

   选择我们刚刚新建的数据源,点击“下一步”按钮,如下图所示:
 


    输入查询语句,这个查询语句是报表的查询语句,后边还可以修改的。点击“下一步”,选择报表类型,如下图所示:
 

    点击“下一步”,选择要显示的字段,如下图所示:
 

    在左边的可用字段列表中,显示了查询语句查出来的所有字段,将要显示的字段移到右边的显示字段列表中,这样改字段就会显示在报表中了。点击“下一步”,选择报表的样式,如下图所示:
 
 
 
点击“下一步”,显示报表的总体信息,如下图所示:
 
 
确认无误,就点击“完成”按钮。此时主界面上就会出现一个空的报表。如下图所示:
 
 
我用了一个已经做好的报表做演示,所以你看见主界面上是有表格等内容的。刚刚建好的报表是没有上述内容的。接下来我们就该添加报表的标题、表头、表格等内容了。
选中左侧工具箱中的报表项里边的文本框,将其将其拖到报表中,我们将其作为报表的标题,如下图所示:
 
 
然后修改该文本框中的内容以及字体、大小、颜色等属性,如下图所示:
 
 
选中这个文本框,就会在右侧的“属性”选项卡中出现该文本框的各属性值,如“Value”中可以输入文本框的内容,“Size”中可以输入文本框的大小,“外观”里边可以选择文本框的字体、颜色、大小、边框、对齐方式等等。对属性做了修改之后,在中间的布局页面中就会即时显示修改后的效果。
下来我们添加表格,在工具箱中选择“表”,将其拖到布局中。如下图所示:
 
 
然后编辑表头,如下图所示:
 
 
输入表头的内容,选择表头的字体、大小、颜色等属性。如果列数不够,需要插入列,则右击某列,在右键菜单中选择“在右侧插入列”即可,如下图所示:
 
 
报表的样式设置好后,我们就该设置查询的SQL语句了。
作为一个报表来讲,一般情况下有供用户输入或者选择的参数,用户输入了这些参数之后,根据参数查询符合要求的记录。有些参数可能需要根据数据表中的记录来产生一个下拉框,用户在下拉框中选择。所以一般情况下一个报表有两条或者更多的SQL语句,一条是用作查询报表数据的,其它的是查询报表可选参数值的。
首先我们来建立一个查询报表可选参数值的SQL语句。选择“数据”选项卡,在“数据集”下拉框中选择“新建数据集”,如下图所示:
 
 
弹出一个“数据集”对话框,如下图所示:
 
 
在“名称”文本框中输入该数据集的名称,在“数据源”中选择该数据集的数据源,即下边的查询语句从哪个数据源中进行查询。在“查询字符串”文本域中输入参数的查询语句,这个查询语句查出来的数据会放在下拉框中,其中一列作为前后台传递的Value,另外一列作为显示给用户的Text,所以参数查询语句中只要查询两列就可以了。点击“确定”按钮,“数据”选项卡中就会显示我们刚刚建立的数据集,如下图所示:
 
 
点击后边的“...”按钮,这是编辑按钮,可以对该数据集进行修改。
查询参数的SQL语句设置好后,就该进行参数的设置了。点击“报表”菜单,选择“报表参数”,如下图所示:
 
 
弹出“报表参数”对话框,如下图所示:
 
 
目前我们界面上添加了两个参数:polNo和endDate,polNo的数据类型是String型,提示为“保单号”。目前参数的数据类型有Boolean、DateTime、Integer、Float、String几种可选,如下图所示:
 
 
到时在报表的上方就会显示一个参数,左边的提示信息为“保单号”,右边会显示一个文本框。
endDate的类型是DateTime型,如下图所示:
 
 
报表的界面上有一个截止日期的参数,右边显示一个文本框,供用户输入日期,后边还会多出一个日历选择控件,用户可以点击该控件来选择日期。在上图中,还有“允许空值”、“允许空白值”等复选框以及默认值中的几个单选钮。如果选中“允许空白值”复选框,那么截止日期中用户不输入任何值,也可以进行查询。如果该复选框没有被选中,在查询界面中截止日期没有输入值,点击“查询报表”按钮,会弹出一个“截止日期参数不允许为空”的提示框。
上边都是普通类型的参数,直接供用户输入的,接下来我们再添加一个下拉框参数,让用户在有限的值中进行选择。选择的数据的来源就是我们前边的添加的queryCompany数据集。如下图所示:
 
 
点击“添加”按钮,在“名称”文本框中输入“company”,数据类型选择“String”,提示为“分公司”,可用值选择“来自查询”,数据集选择“queryCompany”。这样,下边的值字段和标签字段的下拉框中就会出现queryCompany数据集对应的查询语句中的两个字段。值字段选择“COMPANY_ID”,标签字段选择“COMPANY_NAME”。所谓值字段就是传递到后台的数据的那个字段,标签字段是显示给用户看的那个字段。然后设置一下分公司的默认值,选择“来自查询”,数据集和值字段与上边相同。这儿选择了默认值之后,进入报表的查询页面,就会根据默认值的设置来显示初始值给用户。如果不设置默认值,那么分公司下拉框的初始值就是一个空值。
这样,三个参数就添加好了,下来我们添加整个报表的查询语句。添加一个数据集,如下图所示:
 
这个数据集主要提供整个报表的查询语句。需要注意的是,在“查询字符串”中,从界面传进来的参数需要用“?”代替,如下图所示:
 
 
咱们在前边添加了三个参数,也就是说会从查询界面中传递三个参数进来。在查询语句中需要用参数替换的地方我们写成了“?”,那么这些参数是如何对应起来的呢?假如我们从界面中传了三个参数进来,在查询语句中有七处使用了这些参数,那么在查询语句中就应该有七个问号“?”。这七个问号按照顺序从1到7,我们需要为这七个问号一一指定用哪个参数来替换它。点击“querySQL”数据集后边的编辑按钮,弹出“数据集”对话框,如下图所示:
 
 
点击“字段”选项卡,这里边列出了查询语句所能查出的字段。这个不是我们要关注的重点,我们需要关注的是“参数”选项卡中的内容,如下图所示:
ReportingService报表入门

查询语句中有多少个问号“?”,这儿的“参数”列表中就有多少条记录,每一条记录对应于一个问号,按照它们在SQL语句中出现的顺序排列,这一点很重要,否则ReportingService就不知道哪个问号该用哪个参数来替换。如果第1个问号要用polNo的值来替换,则在第1条记录的值中选择“=Parameters!polNo.Value”,以此类推,为所有的问号都设置好参数,最终的结果如下图所示:
 
 
设置好后,点击“确定”按钮,接下来我们就该设置报表的布局信息了。点击“布局”选项卡,如下图所示:
 
 
选择一列,在“属性”选项卡的“Value”中选择该列要显示的字段值。这个值是可以稍作修改的,比如把这个值放在一个字符串中等等。我们在列表的上边添加两条提示信息,以显示统计单位和统计时间段。如下图所示:
 
 
编辑它的“Value”值,选择“表达式”,弹出“编辑表达式”对话框,如下图所示:
 
 
此处的语法和Java中连接String的语句类似,需要注意的事前边多一个等号“=”。上图示例中“统计单位”后边加上了queryHead数据集中查出的client_name字段的值。
下来我们再给报表做一个分组求和的操作。我们一个polNo作为分组的字段,对总保费等进行求和。如下图所示:
 
 
右击列表行,在右键菜单中选择“插入组”,弹出“分组和排序属性”对话框,如下图所示:
 
 
名称随便取,在“分组方式”中选择要进行分组的字段,此处我们以polNo作为Group By的字段,点击“确定”按钮,分组字段就选择好了,当然你可以选择多个分组字段。接下来就该进行求和了,如下图所示:
 
 
添加了分组字段之后,就会在类表的下边多出一行来,这一行就用来放置分组求和的信息。如图中所示,将这一行的第一列的值设置为“总计:”,将第2列的“Value”值改为“=Sum(Fields!PREMTOT.Value)”。这样,这一个单元格中的就会按照polNo分组,放置对premTot求和的值。其它两个字段也依次进行设置。
到现在,我们的报表就基本设置完了,下来我们就可以预览一下报表的结果是否符合我们的要求。点击报表的“预览”选项卡,如下图所示:
 
 
截止日期由于咱们设置的是Date类型,所以在后边出现了一个日历控件按钮。分公司咱们是从数据库中查出来的,所以它是以下拉框的形式存在的。输入参数之后,点击“查看报表”按钮,即可根据我们设置的查询语句和输入的参数查出数据放在下边的列表中。
如果报表没什么问题,下来我们就该部署了。如下图所示:
 
 
右击要部署的报表,在右键菜单中选择“部署”,ReportingService就会将这个报表部署到报表服务器中。从浏览器中登录报表服务器的地址去查看这个报表即可。
到此为止,我们的ReportingService报表就算开发完了。当然我讲的只是入门的知识,还有很多复杂的东西还需要大家在实践中自己去摸索总结。