微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果
开篇介绍
如何在 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 博客推荐栏中快速看到这些文章。
微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果的更多相关文章
- 微软BI 之SSRS 系列 - 如何让报表在一页显示,两种常用的技巧
通常情况下,SSRS 报表在页面内容过多的时候会自动分页.但有的时候当页面内容不是很多,大概最多2页的情况下,或者客户要求所有内容必须在一页显示时,应该如何设置. 实际上,要考虑两种情况:第一种情况是 ...
- 微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换
SSRS 中并没有直接提供本地化的配置方式,因此在 SSRS 中实现本地化,比如有英文标题还有可选的中文标题,就需要通过其它的方式来解决. 比如默认是这样的英文标题 - 但是本地中方用户可能比较喜欢看 ...
- 微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例
这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题, 于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助! 参看上一篇博文 - S ...
- 微软BI 之SSRS 系列 - 在 Cube 中通过 MDX 查询实现基于父子递归关系的汇总报表
之前我写了一篇在 SSRS 开发中处理这种父子关系的汇总与聚合的文章 (SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表),示例中的查询是基于 SQL Server 关系型 ...
- 微软BI 之SSRS 系列 - 基于时间段参数的 MDX 查询以及时间日历 Date Picker 的时间类型参数化
今天在天善问答里看到一个问题,如果我没有理解错的话,它应该是指比如在一个报表中选取一个时间段,然后求出这个时间段的某个 Measure 的 SUM 和.并且同时求出这两个时间点对应的上一年的时间点之间 ...
- 微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计
来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现? SSRS 2008.2 ...
- 微软BI 之SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表
基于数据仓库上的 SSRS 报表展示,一般可以直接通过 SQL 查询,存储过程,视图或者表等多种方式将数据加载并呈现在报表中.但是如果是基于 Cube 多维数据集的数据查询,就不能再使用 SQL 的语 ...
- 微软BI 之SSRS 系列 - 使用 LookupSet 和 Adjacent Group 等高级技巧在报表中跨 Dataset 分组查询
SSRS 报表中有一些高级的技巧,平常很少用到,下面我通过这个案例来展现一下如何在实际开发中使用它们,并且如何解决一些实际的需求. 这张报表分别统计了不同的 Product 产品在不同的月份的 Ord ...
- 微软BI 之SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表
基于父子关系的递归结构在公司组织结构里比较常见,基本上都是在一张表里实现的自引用关系.在报表中如果要实现这种效果,并且在这个基础上做一些数据的汇总,可以使用到下面提到的方法. 要实现的效果大致如下 - ...
随机推荐
- 关于toString方法的重写工具ToStringBuilder
原文:https://blog.csdn.net/zhaowen25/article/details/39521899# apache的commons-lang3的工具包里有一个ToStringBui ...
- WordPress主题开发实例:get_term_by()获取指定分类链接
根据名称获取链接 <?php //根据名称获取对应的id $term=get_term_by('name','新闻动态','category'); $term_id=$term->term ...
- 从零开始写一个发送h264的rtsp服务器(上)
转自:http://blog.csdn.net/jychen105/article/details/47006345 一.什么是RTSP 通常所说的rtsp协议其实包含三个协议: rtsp协议, rt ...
- Java Callable和Future简述
创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果.如果需要获取执行结果,就必须通过共享变量或者使用线程 ...
- python的重试库tenacity用法以及类似库retry、requests实现
介绍 tenacity is an Apache 2.0 licensed general-purpose retrying library, written in Python, to simpli ...
- 「BZOJ」「3262」陌上花开
CDQ分治 WA :在solve时,对y.z排序以后,没有处理「y.z相同」的情况,也就是说可能(1,2,3)这个点被放到了(2,2,3)的后面,也就是统计答案在前,插入该点在后……也就没有统计到! ...
- nfd指令的详细说明
在eterm上执行NFD:SHAPEK/CA*OW指令,返回如下: LN CXR OW RT FBC/TC RBD MIN/MAX TRVDATE R 01 CA 450.00 U U 00D/00D ...
- andengine的convertLocalCoordinatesToSceneCoordinates方法
使用Tile地图,看过andengine中的例子,都会发现例子中有这么一段话,以前版本的是convertLocalToSceneCoordinates方法. scene.registerUpdateH ...
- c#中的数组、ArrayList、List区别【转】
首先说明C#中的Array类:Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义.Array 类提供了各种用于数组的属性和方法.关于Array类的一些属性及方法详见博文:C ...
- [asp.net]C#实现json的序列化和反序列化
在做asp.net和unity进行http通信的时候,当unity客户端发出表单请求的时候,我要将他要请求的数据以json的格式返回给客户端,让客户端来解析.服务器端这一块就涉及到json的序列化和反 ...