代码改变世界

微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果

2014-01-15 00:21  BIWORK  阅读(8661)  评论(23编辑  收藏  举报

开篇介绍

如何在 SSRS 报表中实现标签导航 Navigation 和向下钻取 Drill Down的效果? 如同下面这个例子一样 -

在页面第一次加载的时候,默认显示是全部地区的销售总和情况,上面一张图是显示各个国家的零售额和网售额,下面一张图是根据时间小时销售额的趋势。

那么 Overall 的部分即图中红色部分内容为全部地区汇总的信息,蓝色圈表示的位置都是可以点击的,通过选择不同的国家可以导航或者钻取到不同的国家具体数据。

比如在导航菜单中选择 United Kingdom 或者点击了柱状图中 United Kingdom 表示的区域,那么报表将刷新跳转到 United Kingdom 所在的数据区域。

同样的在最左边的导航中如果选择 United States 也会跳转到 United States 所在的数据报表。

这种需求肯定存在,比如不希望设计多个报表,跳转来跳转去觉得别扭。希望在一个报表中实现这样的效果,能够很直观的进行导航。

实际上这个例子所有的操作都是基于同一个报表来实现的,在点击导航的时候其实已经发生了报表的跳转,由自身跳往自身然后根据参数的传递来控制页面中各个组件的显示或者隐藏效果,以及标签内容和标签颜色的改变。对这些细节仔细调整,那么用户在导航或者钻取报表的时候除了页面刷新的等待时间,是感觉不到其它的异常的。

还有一种想法就是能不能直接在 SSRS 报表上添加一些 Move Over 事件,然后再来控制组件的显示或者隐藏效果? 在 SSRS 报表中是没有这样的特性的,唯一有可能的操作应该是在用其它WEB 页面嵌入 SSRS 报表的时候通过 JS 来控制报表的布局和事件相应,但是对于这一点我也是道听途说,至少我没有研究过具体如何实现。

像这个类型的例子,实现的方式有很多种,我这里是用的一些硬编码的参数方式来控制的,大家如果有类似的需求可以在这个基础上自己动手扩展。

只有一个参数 - CountryName,字符串类型并允许空值。

Dataset 的数据表来源可以参考这一篇文章中的示例数据 ,下面是一个非常简单的查询,为了避免数据过多,只特意选择了部分数据。如果参数 @CountryName 为空的话那么就显示所有国家的信息,反之,只查询参数所表示国家的数据。

IF @CountryName IS NULL
SELECT dg.EnglishCountryRegionName AS 'Country',
       dg.StateProvinceName AS 'StateProvince',
       dg.City,
       dc.CustomerName, 
       fa.OrderDateKey,
       fa.SalesAmount AS 'Internet Sales Amount',
       fa.SalesAmount * RAND(10) AS 'Reseller Sales Amount'
FROM DimCustomer AS dc
INNER JOIN DimGeography AS dg
ON dc.GeographyKey = dg.GeographyKey
INNER JOIN FactInternetSales AS fa
ON fa.CustomerKey = dc.CustomerKey
WHERE dg.EnglishCountryRegionName IN ('United States','United Kingdom','Germany','Canada')
AND OrderDatekey BETWEEN 20050701 AND 20050731
ELSE
SELECT dg.EnglishCountryRegionName AS 'Country',
       dg.StateProvinceName AS 'StateProvince',
       dg.City,
       dc.CustomerName, 
       fa.OrderDateKey,
       fa.SalesAmount AS 'Internet Sales Amount',
       fa.SalesAmount * RAND(10) AS 'Reseller Sales Amount'
FROM DimCustomer AS dc
INNER JOIN DimGeography AS dg
ON dc.GeographyKey = dg.GeographyKey
INNER JOIN FactInternetSales AS fa
ON fa.CustomerKey = dc.CustomerKey
WHERE dg.EnglishCountryRegionName IN ('United States','United Kingdom','Germany','Canada')
AND OrderDatekey BETWEEN 20050701 AND 20050731
AND dg.EnglishCountryRegionName = @CountryName

 

 

左侧导航区都是使用不同的 Textbox 表示不同的国家,右侧和下侧图表的底层还有表示 Overall 的图表,也就是说是两层图表,一层被遮盖了。

 对于导航的文本控件,主要就是设置 Action 导航动作 - 调到报表自身并传递参数值,这个参数值将用做 Dataset 查询的结果集过滤条件以及各个子图表的 Title。

同样的,为了增强一些效果,可以做的细致一些来修改文本的背景颜色和字体颜色。

子图表的标题部分也可以通过传入的参数来控制。

在 Overall 表的 Series Properties 中可以选择 Action,意味着只要用户点击了柱状图区域,那么就可以根据选择的国家来做导航。

这里的 Action 中的参数就不需要硬编码了,因为报表知道你选择了图标中的哪一个国家。

对于各个主图表和子图表的显示或者隐藏可以通过判断 CountryName 参数是否为空来决定,这里的配置是子图表。

基本的配置就是以上这些,实际上像上面的这个报表设计的过程还是非常简单和容易的,如果熟练的话半个小时就可以完成一个比较有意思的导航和钻取效果。在导航或者钻取到国家这个层面之后,其实还可以继续往下钻取到省份乃至城市的级别。这些都可以通过参数来进行控制,同时需要对 Dataset 中的查询做出一些调整以配合起来控制。

虽然,微软 SSRS 报表在很多功能和设计上显的比较落后,包括单板的界面样式,选择性很少的图表等等很多能够被吐槽的地方。但是,可以通过各种变通的方式以及耐心细致的设计在很多情况下是可以达到客户的要求的。换句话说,不要求报表做的有多么炫,但是需要能够站在客户的角度,提供客户以最便捷的方式最简单的操作来找到他们做需要关心的数据,我认为这样的报表设计就已经很成功了。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。