原文:[翻译]初识SQL Server 2005 Reporting Services Part 2
在Part 1文章中我们对SQL Server Reporting Services 2005(SSRS)有了一个初步的了解。我们分别通过报表向导和报表设计器构建了两个报表。在Part 2我们将以一个SSRS开发者的身份深入查看更多特征信息。
以下是我们要研究的:
l 表达式的用法。这些表达式可以让你动态的控制从控件属性到数据绑定的报表的各个方面。
l 报表中用到的计算和操作的通用函数。
l 报表中自定义代码。
我们也会创建一个矩阵控件,创建一个子报表。最后我们会见识一下报表的动态钻取和排序。
开始
为了运行示例,你需要安装和配置了SQL Server 2005, SQL Server 2005 Reporting Services和Visual Studio 2005,如果你还不太清楚该怎么做,那么可以回到Part 1去学习一下。然后下载源代码文件。这些文件中包含了Visual Studio 项目和创建ReportDemo数据库的SQL脚本。如果这些你都有了,那么可以直接创建数据库了。
现在先创建一个商业智能项目。选择项目中的添加新项,把共享数据源ReportDb.rds和报表文件FirstReportMan.rdl添加到项目中。然后更改数据源中的相关配置信息以保障能连接到你的数据库。我们先从FirstReport.rdl开始,所以先在设计器中将它打开。
表达式
表达式是写在代码中用来设定属性值的简短陈述。表达式可以设置报表中任意用到的数据属性:参数,全局变量,数据集中的字还有嵌入函数。
SSRS2005在创建表达式方面有了很大的进步。现在提供了一个很直观的表达式编辑器。如果你滚动查看属性窗口,就会发现大多数控件的属性都可以通过表达式进行设置(表达式选项到处都是)。你也可以看到弹出的属性对话框中有很多写着fx的按钮。这些按钮就可以打开表达式编辑器。
这样的表达式特征将SSRS2005变成了一个非常好用的工具。因为这使得从数据展现到如何展现都可以动态设置。而不是直接写死在里面。SSRS用表达式对属性进行设置。
看一下你的报表,现在我们想要高亮显示从特定State来的客户信息。我们可以这样设计表达式:=iff(Fields!State.Value = “CA”, “Bold”, “Normal”)
如果我们将这个表达式应用到表格的明细列,运行报表的时候,所有来自California的列都被高亮显示。如果你正需要这些数据,就会很方便。然而如果每个高亮显示的列都需要一个报表那就太滑稽了。所以我们得进行动态设置。当报表运行的时候根据传入的参数不同而高亮显示不同的内容。
首先,先提添加一个参数。命名为HightlightState,设置如下的数值:
California |
CA |
Florida |
FL |
Louisiana |
LA |
Illinois |
IL |
Texas |
TX |
单击确定。
笔记:
可以看到要对一个参数进行预先赋值操作的时候,有一个来自查询选项。你可以通过在报表设计器定义数据集来使用这个选项。
下一步就是建立表达式。单击报表中的表格控件,可以看到表格的左边和上边多出了一列和一行表格,单击前边的图标,可以对正行进行属性设置。单击属性中的FontWeight中的表达式,输入=iif(Fields!State.Value = Parameters!HighlightState.Value, "Bold", "Normal")
函数iif是SSRS中经常用到的一个表达式。格式是:
iif (boolean statement, true result, false result)
如果布尔表达式返回true那么函数将返回ture result,如果布尔表达式返回false,那么函数就会返回false result。布尔表达式会问:现在传进来的参数是不是等于当前的state code呢?如果返回true那么文本就会加粗显示,否则正常。
转到预览选项卡,可以看到效果。
常见函数
现在然我们回到表达式编辑器。在编辑器的下半部分有三列。第一列显示的是为创建表达式所用的分类列表,最后一个就是常见函数,展开这个节点选择时间和日期类别。在第二列中双击任意个元素,这样就会将其添加到编辑文本框中,如果把光标放在第一个括号一边,就会看到智能感知的信息:
现在让我们用Year函数只显示某人的出生年份。选择DateOfBirth列的属性,在常规选项卡的值信息中单击表达式按钮进入表达式编辑器。把表达式改成:
=Year(Fields!DateOfBirth.Value)
这样就行了,现在预览一下。
值得注意的还有聚合函数。这些函数可以帮助你处理数据集中的数据。比如说,你的报表是关于一些商品的单价信息,这样就可以用Sum函数创造一个总价格。再比如,你有一个关于购买日期和每笔交易的购买数量报表,就可以通过AVG函数获得平均价格。
全局变量
再次回到表达式编辑器。这次让我们单击第一列中的全局,第二列中就会显示提供给报表使用的全局变量。
这一次让我们利用全局变量做一个对页数进行计数的报表。首先,给报表加上页脚,将四个文本框拖拽进页脚,把字体属性设置为8pt,按照下面方式进行设置:
Page |
=Globals!PageNumber |
of |
=Globals!TotalPages |
预览报表就可以看到有“'Page 1 of 5'.”这样的信息。
还有一些值得注意的全局参数:
l ExcutionTime – 这个会显示运行报表需要的时间
l ReportUrl – 这个保证你的报表来自正确的数据源
l UserID – 这个显示报表运行的User ID
你可以利用这些全局参数进行报表的基本诊断操作。你可以将这些参数加到页脚并利用参数对它们进行显示或者隐藏。这样在发布后,报表使用者就可以看到一个清爽的报表,而你可以看到跟多的信息。
自定义函数
SSRS2005里面有100多个函数,这足以应付大多数情况的需要,但是有的时候你需要更灵活的控制。所以在这里你可以用VB.NET 或 C#进行编写自定义的表达式。
现在让我们添加一个进去。
打开报表设计器的布局选项卡,选择报表菜单中的报表属性,直接跳到代码选项卡。我们将写一个根据传入的数据不同而返回不同颜色的函数。然后在表格细节中对这个函数进行运用。
把下面的代码拷贝进去:
Public Function GetColor(ByVal status as String) as String
IF status = "100" Then
Return "White"
End IF
IF status = "101" Then
Return "Yellow"
End IF
IF status = "102" Then
Return "Tomato"
End IF
End Function
单击确定关闭对话框。
笔记:
所有的颜色都在属性中的Color下拉列表中。
我们现在有了一个函数,现在来包装成表达式。右击Customer Status列打开属性窗口。找到Background Color属性,从下拉列表中选择表达式。添加下面的代码创建一个表达式:
=code.GetColor(Fields!CustomerStatus.Value)
当报表运行的时候,这个函数会被处理,而且参数信息将会传递进去。函数根据参数决定该显示哪个颜色。SSRS就可以确定要用那个颜色赋值给相应的单元格。
注意为了使用这个函数我们需要这样写:=code.<myfunction>.
预览报表。
子报表
子报表就是嵌入到另一个报表中的报表。子报表可以使用参数还有使用自己的数据集。值得注意的是其实SSRS中子报表是另外一个报表。实际上,在SSRS中,你可以单独运行一个子报表。
为了创建子报表,只需要从工具箱中拖拽一个子报表控件到报表中然后设置它在哪个报表中呈现。如果子报表需要参数,你就得告诉主报表要把那个参数传递给子报表。其实很简单。
现在在项目中添加一个报表MainReport.rdl,再创建一个使用共享数据源的数据集。使用下面的查询:
SELECT CustomerID, FirstName, LastName FROM Customer
转到布局选项卡,拖拽一个表格控件进去。选择第一列将客户的姓添加进去,第二列是名字。第三列的名字设置成Address。预览报表确定可以运行。
再创建一个子报表MySubReport.rdl。同样创建一个使用共享数据源的数据集。使用下面的查询语句:
SELECT Address, City, State, ZipCode
FROM Customer
WHERE (CustomerID = @CustomerID)
转到布局选项卡,利用文本框控件显示地址信息。只需要把数据集字段拖拽进去就可以自动创建文本框控件。还可以注意到当这样做的时候,文本框中的数据 自动使用First()函数。这个函数将使用数据集返回的第一行数据,其它的将被忽略。
现在用“100”这个书进行运行报表测试。
现在回到MainReport.rdl主报表。为了进行嵌入操作,将一个子报表控件拖拽进Address列。右击子报表选择属性,将子报表设置成MySubReport。
接下来转到参数选项卡,这里正是你将子报表连接到主报表的地方。在这里设置要将哪个参数传递个子报表相应的参数。
在参数名中选择CustomerID,参数值中选择=Fields!CustomerID.Value,这样就可以让子报表知道该显示那个客户的信息。
单击确定,预览主报表。
矩阵
下面我们要用矩阵控件来创建一个矩阵风格的报表。
首先,在项目中添加一个MatrixReport.rdl报表。用共享数据源添加一个数据集,查询语句是Select * from Customer。
导航到报表设计器布局选项卡,将一个矩阵控件拖拽进来,将State拖进行,将CustomerStatus拖进列,将FirstName和LastName拖进数据区域。经过一点点美化后,应该是下面的效果:
运行起来是这个样子:
添加钻取
SSRS中的钻取功能可以使得你的报表像一个树一样可以展开和收缩。
首先,建立一个AdvancedTable.rdl报表。用共享数据源添加数据集,查询语句是Select * from Customer query。
转到布局选项卡,将一个表格控件拖拽进去。首先我们得给表格控件添加分组。选中表格控件,右击前面的小图标,选择插入组。分组和排序属性对话框就弹出来了,在分组方式的表达式选择=Fields!State.Value,这样报表就会以State进行分组。现在把State字段拖拽到第一列组列。然后把FirstName,LastName和City拖进明细区域。美化一下进行预览。
我们现在实现了分组,但是还不能进行钻取。选择表格控件,选择明细列前边的小图标,右击选择属性。展开Visibility部分,将Hidden属性设置为True,把ToggleItem属性设置为State。Hidden决定了报表运行时这一列的状态。如果设置为True那么开始是缩起和隐藏的。把ToggleItem属性设置为State,这样当报表运行的时候旁边就会向树状结构一样有个可以展开的小“+”号。
预览报表发现只有States列显示,但是可以对其进行展开和收缩操作。
添加动态排序
要对表格控件进行动态排序操作其实很容易。先打开FirstReportMan.rdl报表。转到报表设计器的布局选项卡。右击表头的FirstName文本框选择属性。转到交互式排序选项卡。将将交互式排序操作添加到词文本框复选框选中,然后设置排序表达式为=Fields!FirstName.Value,排序表达式是在这一列中显示的值。对其他列也进行类似设置。
现在预览报表,就可以进行每一列的交互式排序。
总结
我希望这些SQL Server Reporting Services 2005高级的主题能帮助你更好的与用户进行沟通。在Part 3中,我们将会看一下图标控件和它的多种多样的功能。