在SSRS中,没有直接以选择的颜色来显示网格的方法(以可选择的颜色显示网格会提高报表的可读性。在Excel 2007中你可以很容易地做到,但是在SSRS中却不行)。
通过将背景颜色中的一个表达式和RowNumber函数结合起来,你可以添加选择颜色到你的报表中。RowNumber(无)返回当前记录的记录编号。对于每个文本框的背景属性,你需要给出下面的表达式。
=iif(RowNumber(Nothing) Mod 2, "LightBlue", "SkyBlue") |
由上面的函数,偶数编号的记录会显示为淡蓝色,而奇数编号的记录会显示为天蓝色,如下所示:
每页显示给定数目的记录
如果你想只在每页显示一组记录,那么这不是简单的工作,因为记录数目将依赖于字体大小和其它的打印机默认设置。除了这个问题,还有如果一行的记录长度太长,那么它会移到另一行,而这会扰乱你报表中记录的数目。所以有必要添加一些代码来添加这个功能到你的报表中。假设你想每页显示20行,那么添加一个组到你的报表中,它具有以下表达式:
=int((RowNumber(Nothing)-1)/20) |
然后为这个组选择page break at the end选项。
阻止向下钻取矩阵中总列数
当你在报表中有个矩阵时,你可以像下面这样显示总行数和列数:
如果你想在你点击任何详细单元时导航到另一个报表,那么你可以配置导航标签。但是,这个配置的问题是这个配置使得用户可以点击总列数并钻取到导航报表。你不能通过使用表达式来阻止,因为总列数可以看作是一个其它字段。
下面是我们将用于上面这个例子的查询:
SELECT YEAR(Sales.SalesOrderHeader.OrderDate) AS Year, Production.Product.Name AS Name, SUM(Sales.SalesOrderDetail.LineTotal) AS Amt FROM Sales.SalesOrderDetail INNER JOIN Sales.SalesOrderHeader ON Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID INNER JOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID WHERE ( Production.Product.Name LIKE 'HL R%' ) AND ( YEAR(Sales.SalesOrderHeader.OrderDate) IN ( 2001, 2002 ) ) GROUP BY Production.Product.Name, YEAR(Sales.SalesOrderHeader.OrderDate) ORDER BY YEAR, Name |
注意,我包含了where以便可以很容易地看到总列数。
为了解决上面的问题,我们要做的是在查询里包含总的值而不是从报表服务中获取这个值。
SELECT ISNULL(YEAR(Sales.SalesOrderHeader.OrderDate), '9999') AS YEAR, ISNULL(Production.Product.Name, 'Total') AS Name, SUM(Sales.SalesOrderDetail.LineTotal) AS Amt FROM Sales.SalesOrderDetail INNER JOIN Sales.SalesOrderHeader ON Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID INNER JOIN Production.Product ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID WHERE ( Production.Product.Name LIKE 'HL R%' ) AND ( YEAR(Sales.SalesOrderHeader.OrderDate) IN ( 2001, 2002 ) ) GROUP BY Production.Product.Name, YEAR(Sales.SalesOrderHeader.OrderDate) WITH CUBE ORDER BY YEAR, Name |
CUBE操作器将为你提供一年的总值和产品名称。这个查询的问题是我们不能有一个“总”标签用于年和总值,因为年是整数。因此,在上面的查询中包括了一个随意的9999。
对于总值,你可能需要写一个简单的表达式,例如IIF(Fields!Year.Value="9999","Total",Fields!Year.Value)。
这时你将获得的与上面相同的输出。
接下来是编写一个表达式用于导航。
=SWITCH(Fields!Year.Value <>9999 AND Fields!Name.Value<>"Total","SubReport") |
在上面的表达式中,检查了年和名称总值,以便它不会导航到子报表。