【IT168技术文档】
从数据源中获取报表数据时,基于用户的选择标准考虑最有效的方式筛选报表数据是很重要的。很多数据库含有大量数据。因此,只获取报表所需要的恰当数据量常常是重要的。有时,一个报表只用于查看一个有限范围值的数据,其他时候用户指定不同的标准,引起报表显示一个变化范围的相关值。在可能取值的范围很小的情况下,只获取相关联数据更具有意义。但是,如果用户在一个会话中指定不同的标准——使得数据源需要多次重新查询——这证明是低速的和资源利用效率低下。
在图5-7中,提供给数据源的参数引起数据筛选,并且只返回报表单一显示的数据中。该数据集代表了在客户端的数据库服务器(报表服务器)的结果集。如图5-7所示,经过筛选后,只是少量数据存在数据库中。
通过传递数据库对象级别的筛选标准参数,网络传输量可以大大降低,报表显示也会更加高效。但是,如果用户提供多组不同的参数值,在一段时间内返回了同一报表的几个版本,那么数据库将重复查询,也许会导致很长的等待时间和相同数据多次在网络中传输。如图5-8所示,因为没有进行数据筛选,数据库服务器返回了大量的数据。然后报表服务器通过使用报表参数对数据进行了筛选。
在用户的一次会话中,对即将执行的查询来说,如果其必需的所有数据都能从一个结果集内获取,那么这将一次执行的巨大的网络传输量。但是这会减少后续报表显示时间。
参数选择可以应用于报表级别的数据而不只是数据源。因为所有的数据都被缓存(在内存中保留),报表将会显示更快。这个技术可以减少总体的网络流量和显示时间。
当然,我们不想从数据源获取不必要的信息,所以根据特定的报表需求,上述两种方法的结合也许是比较恰当的解决方案。例如,作为一个区域销售经理,想获得自己负责区域下每个地区的销售总计,他得先取回某时间段内所有地区的销售数据。对于每个地区报表来说,这一数据都是经过简单筛选后发到上个级别的地区。
参数概念
虽然我认为这不是过于复杂,但是开始时我发现整个参数问题有一些困惑。直到我有机会在查询和报表表达式方面做一些带有参数的创造性的工作。为了减轻读者的苦恼(希望可以缩短读者学习历程),我将解释简单查询和报表中的参数是如何定义的以及如何在更加复杂的报表中使用(和定义)参数。
报表设计中会声明两种(也许会是三种,取决于查询技术)不同类型的参数:数据集参数和报表参数。数据集参数源于数据库对象,比如存储过程和用户定义函数。如图5-9所示,可能会接触到参数的设计过程分为三个不同的层。
采用SQL Server作为数据源时,SQL语法通过在参数名前面加一个@符号作为前缀来定义参数。在存储过程中,这些参数先进行定义然后用于程序主体,与使用即席查询一样。报表设计器生成相应的报表参数。图5-9的第三部分显示了打开的带有两个导出的参数Report Parameter对话框。如果采用图形化查询生成器或者一般查询设计器来写一个典型的Transact-SQL语句,报表设计器将解析数据集参数和数据库对象参数,自动建立相应的报表参数。数据集参数映射到Dataset Properties对话框中的报表参数,如图5-10所示。该对话框可通过单击省略号(…)按钮访问,按钮在报表设计器的Data选项卡中数据集下拉列表旁边。
对于基本查询,报表设计器将填充对话框并匹配参数。但是,如果是复杂或者不常见的数据集查询,则需要手动配置数据集和报表参数。在很多事件中都执行参数解析,包括单击Refresh按钮时、选取另一个数据集时或者离开报表设计器Data选项卡时。
进行特殊查询时需要人工介入,建议对报表最终的工作版本保存一个备份副本,复制查询文本到记事本,以备需要时恢复。
用查询参数筛选数据
参数常被用来在数据源筛选数据。无论数据是否在报表中进行筛选,对于大多数报表处理工作来说,至少在数据库中筛选数据是一个基本的方法。如果读者曾在SQL Server中建立过参数化存储过程,那么已经熟悉这一模式。这个技术应用到存储过程和查询表达式上,使用类似的语法。让我们由一个简单的即席查询表达式开始,然后继续创建一个存储过程。
查询参数以符号@开始,必须遵守对Transact-SQL标识符的命名约定标准。命名不能含有空格或某些标点符号,不能以数字开头;简单起见,只使用字母。存储过程中,使用参数前,必须事先对参数作声明。在即席查询中,需要时,可对参数命名做简单修饰。在SQL语句的WHERE部分内,用参数代表变量值,如下所示:
SELECT * FROM Products WHERE ProductID = @ProductID
这种情况下,参数名与相应的字段名一致,但是这种情况不是必需的。如果是利用查询生成器创建一个更为复杂的查询,则要在生成器网格的Criteria列内指定参数。如图5-11所示
这个例子中,满足ListPrice列的值小于或等于@ListPriceMax参数指定的值条件的行,都要作为记录返回。
报表参数
除了来自数据集参数的报表参数外,还要增加一些个人的报表参数。这些报表参数(没有对应的查询参数)可以加入进来支持附加的报表功能,比如隐藏和显示报表段、页码和动态格式化。
下面的例子演示了一些简单的报表参数,用于在报表上动态设置值。随后,我们将 在几个实际报表特性中运用此方法。这个例子要演示两个非常简单的报表参数,用于教学目的。
不使用向导,创建一个新报表。可以通过以下步骤完成:在Solution Explorer的右键菜单中选择Add,然后选择Add New Item;在Add New Item对话框内的报表项模板中,选择Report。不要为新创建的报表指定数据集,切换到报表设计器的Layout视图。
报表参数通过Report Parameters对话框进行添加。选择Properties窗口的Report项,单击ReportParameters属性旁边的省略号(…)按钮。
如图5-12所示,ReportTitle参数是一个字符串值,其默认值是Report Title,TextColor参数与其类似,默认值为Blue。
在报表设计器内,从Toolbox窗口拖曳出两个文本框放置到报表主体。通常情况下,为项提供一个恰当的名称是个好主意(特别是它们为同一表达式所引用时),但是在这个简单例子中,没有必要这样做。
为这两个文本框设置属性:每个文本框的Value属性和第二个文本框的Color属性,依照下列说明。设计器在文本框中显示值属性,但是在标准属性窗口或者自定义文本框Properties对话框(右击文本框,选择Properties)中改变这些属性值是个好主意。
第一个文本框将从ReportTitle参数获得它的值。设置它的Value属性=Parameters! ReportTitle.Value,设置第二个文本框的Value属性=“This Text is ” & Parameters! TextColor.Value。选择第二个文本框,设置它的Color属性=Parameters! TextColor.Value(参见图5-13)。
如果想装饰一下的话,还可以改变FontSize和FontWeight属性。我给报表加了条线。
现在,单击Preview选项卡,注意发生的变化。预览窗口的标题显示了ReportTitle和TextColor两个参数的默认值,这两个值显示于报表中。
尝试用标题内的参数字段来改变ReportTitle和Color,然后单击View Report按钮,刷新报表预览。第一个文本框应该显示了输入ReportTitle参数的文本,第二个文本框应不只显示指定的色彩名称,文本也应呈现为该颜色,如图5-14所示。