IT运维管理,创造商业价值!
中国IT运维网首页 | 资讯中心 | 运维管理 | 信息安全 | CIO视界 | 云计算 | 最佳案例 | 运维资源 | 专题策划 | 知识库 | 论坛

SQL Server报表服务中的一些常见小问题(2)

2008年08月14日
IT专家网/

  在SSRS中,没有直接以选择的颜色来显示网格的方法(以可选择的颜色显示网格会提高报表的可读性。在Excel 2007中你可以很容易地做到,但是在SSRS中却不行)。

  通过将背景颜色中的一个表达式和RowNumber函数结合起来,你可以添加选择颜色到你的报表中。RowNumber(无)返回当前记录的记录编号。对于每个文本框的背景属性,你需要给出下面的表达式。

=iif(RowNumber(Nothing) Mod 2, "LightBlue", "SkyBlue")

  由上面的函数,偶数编号的记录会显示为淡蓝色,而奇数编号的记录会显示为天蓝色,如下所示:

SQL Server报表服务中的一些常见小问题

  每页显示给定数目的记录

  如果你想只在每页显示一组记录,那么这不是简单的工作,因为记录数目将依赖于字体大小和其它的打印机默认设置。除了这个问题,还有如果一行的记录长度太长,那么它会移到另一行,而这会扰乱你报表中记录的数目。所以有必要添加一些代码来添加这个功能到你的报表中。假设你想每页显示20行,那么添加一个组到你的报表中,它具有以下表达式:

=int((RowNumber(Nothing)-1)/20)

  然后为这个组选择page break at the end选项。

SQL Server报表服务中的一些常见小问题

  阻止向下钻取矩阵中总列数

  当你在报表中有个矩阵时,你可以像下面这样显示总行数和列数:

SQL Server报表服务中的一些常见小问题

  如果你想在你点击任何详细单元时导航到另一个报表,那么你可以配置导航标签。但是,这个配置的问题是这个配置使得用户可以点击总列数并钻取到导航报表。你不能通过使用表达式来阻止,因为总列数可以看作是一个其它字段。

 下面是我们将用于上面这个例子的查询: 

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)。

  这时你将获得的与上面相同的输出。

SQL Server报表服务中的一些常见小问题

  接下来是编写一个表达式用于导航。

=SWITCH(Fields!Year.Value <>9999 AND Fields!Name.Value<>"Total","SubReport")

  在上面的表达式中,检查了年和名称总值,以便它不会导航到子报表。

发表评论请到:http://bbs.cnitom.com

相关阅读

图文热点

SQL Server2008行数据和页数据压缩解密
SQL Server2008行数据和页数据压缩解密本文将为大家介绍SQL Server 2008行数据和页数据的一些处理方法,希望能对DBA的管...
如何修改天融信NGFW4000防火墙用户认证数据库
如何修改天融信NGFW4000防火墙用户认证数据库对象本文主要是如何修改天融信NGFW4000防火墙用户认证数据库对象的介绍。...

本类热点