【Reporting Services 报表开发】— 交互式报表

我们知道,界面是人与系统间的对话方式,当使用者面对的是冷冰冰的界面,不但会造成使用者对于系统的热情减低,也会因为不便而产生诸多抱怨。尤其像报表时企业内几乎每日都会使用到的工具,因此,如何让使用者可以再复杂的报表中最快找到所需要的信息,正是报表工具所努力的重要课题,为了提升使用者的便利与满意度,SSRS提供了许多便利的交互性功能,包括:交互式排序、文档结构图、书签、深化报表和钻取报表。

一、交互式排序

在查看数据的过程中,为了能快速地找出特定的信息以及确认数据的相对大小,总免不了使用排序的动作:“找出业绩最差的业务员”、“找出毛利最高的产品”等如此类的需求,这些对于分析人员来说可以说是家常便饭。但是不同的分析人员面对不同的使用习惯以及分析目的,报表数据必须随着利用不同的字段进行升序i和降序。

1.新建报表,新建数据源和数据集,需要用到的SQL脚本:

 SELECT
YEAR(TRX_DTE) AS TRX_YEAR,
DATEADD(dd,1-DAY(TRX_DTE),TRX_DTE) AS TRX_MONTH,
C.PRODUCTSUBCATEGORY_KEY,
C.PRODUCTSUBCATEGORY_NAME,
D.PRODUCTCATEGORY_KEY,
D.PRODUCTCATEGORY_NAME,
F.COUNTRY_NAME,
SUM(SALES_AMT) AS SALES_AMT,
SUM(SALES_QTY) AS SALES_QTY
FROM dbo.FACT_SALES A
LEFT JOIN
dbo.DIM_PRODUCT B
ON A.PRODUCT_KEY=B.PRODUCT_KEY
LEFT JOIN
dbo.DIM_PRODUCTSUBCATEGORY C
ON B.PRODUCTSUBCATEGORY_KEY=C.PRODUCTSUBCATEGORY_KEY
LEFT JOIN
dbo.DIM_PRODUCTCATEGORY D
ON C.PRODUCTCATEGORY_KEY=D.PRODUCTCATEGORY_KEY
LEFT JOIN
dbo.DIM_STORE E
ON A.STORE_KEY=E.STORE_KEY
LEFT JOIN
dbo.DIM_REGION F
ON E.REGION_KEY=F.REGION_KEY
GROUP BY
YEAR(TRX_DTE) ,
DATEADD(dd,1-DAY(TRX_DTE),TRX_DTE) ,
C.PRODUCTSUBCATEGORY_KEY,
C.PRODUCTSUBCATEGORY_NAME,
D.PRODUCTCATEGORY_KEY,
D.PRODUCTCATEGORY_NAME,
F.COUNTRY_NAME

SQL Code

2.添加父组(以[PRODUCTCATEGORY_NAME]),设置图1:

【Reporting Services 报表开发】— 交互式报表

图1

3.点击“销售数量”的文本框属性,请勾选“对此文本框启用交互式排序”,并在排序区域单击“组”,并选择“PRODUCTCATEGORY_NAME”组。具体如图2

【Reporting Services 报表开发】— 交互式报表

图2

4.预览,此时发现刚才设置的表头处会有出现一个三角形图示,只要一单击,画面的数据就会如图3般自动切换升序和降序。具体如图3

【Reporting Services 报表开发】— 交互式报表

图3

 二、文档结构图

当使用者查看一份页数超过数十页甚至于数百,数千页的报表时,可怜的使用者只能利用工具栏上方的“上一页”,“下一页”,逐页靠自己的能力寻找所需要的信息内容,这种搜寻模式不仅浪费时间,同时使用者在使用上也容易因为眼花而遗漏重大信息。因此,SSRS提供了“文档结构图”功能,让报表产生文档的结构图标签,借此解决使用者对大型报表数据搜寻的困扰。

"文档结构图"的展现方式是在报表的左方提供了文件导引模式,文件导引模式中包含了报表使用者用来寻找信息的字段索引,索引来源可以使来自单一字段,同时也可以使多个组字段构成的层次式索引。使用“文档结构图“的效果是当使用者单击左方文档结构图索引的某个项目是,右方的报表就会立刻跳至使用者选取的项目位置,这对使用者在数据量庞大的报表中寻找数据,是相当使用的小帮手。以下将利用两个范例,带领大家熟悉”文档结构图“的设计方式

范例一:

1.需要用到的SQL脚本:

SELECT
PRODUCTCATEGORY_NAME,
PRODUCTSUBCATEGORY_NAME,
TRX_DTE,
SUM(SALES_QTY) AS SALES_QTY,
SUM(SALES_AMT) AS SALES_AMT
FROM FACT_SALES A
LEFT JOIN DIM_PRODUCT B
ON A.PRODUCT_KEY=B.PRODUCT_KEY
LEFT JOIN DIM_PRODUCTSUBCATEGORY C
ON B.PRODUCTSUBCATEGORY_KEY=C.PRODUCTSUBCATEGORY_KEY
LEFT JOIN DIM_PRODUCTCATEGORY D
ON C.PRODUCTCATEGORY_KEY=D.PRODUCTCATEGORY_KEY
WHERE TRX_DTE BETWEEN @START_DTE AND @END_DTE
GROUP BY
TRX_DTE ,
PRODUCTCATEGORY_NAME,
PRODUCTSUBCATEGORY_NAME

SQL Code2

2. 先以产品大类(PRODUCTCATEGORY_NAME)分组,在添加子组(交易日[TRX_DTE]),如图4

【Reporting Services 报表开发】— 交互式报表

图4

3.在产品大类"组属性”对话框切换至“高级”标签页,在“文档结构图”下拉菜单中选择产品大类”PRODUCTCATEGORY_NAME“,即可,如图5

【Reporting Services 报表开发】— 交互式报表

如图5

4.预览报表,此时左方会出现以产品大类名称为基础的索引,展开索引后,单击索引中的”家具“的项目,此时右方报表就会立刻移到”家具“组的开头,如图6

【Reporting Services 报表开发】— 交互式报表

图6

范例二:

1.在范例一的报表上,在产品大类的组内加入一个产品种类的子组。如图7

【Reporting Services 报表开发】— 交互式报表

图7

2.同样,在产品中类"组属性”对话框切换至“高级”标签页,在“文档结构图”下拉菜单中选择产品中类”PRODUCTSUBCATEGORY_NAME“,即可,如图8

【Reporting Services 报表开发】— 交互式报表

图8

设置后如图9

【Reporting Services 报表开发】— 交互式报表

图9

3.预览报表,此时仔细看画面左方的文档结构图,第一层以”产品大类“为索引单位,单击左方的层次式文档结构图产品大类层级中的”家具“项目后,会同步展开出现所有的产品种类。此时只要单价产品中类为”卧室家具陈列“,右方报表立刻会移到”卧室家具陈列“组开头。如图10

【Reporting Services 报表开发】— 交互式报表

图10

 三、书签

相信对网页熟悉的人对于定位锚(Anchor)的用途也不会感到陌生,我对这个就很熟悉,设置定位锚之后可以通过简单的点击,就让网页快速跳转到指定的地方。SSRS也可以做到类似的效果,只需要通过”书签“的设置,即可在报表页面使用超链接快速移动到指定”书签“的位置。

1.使用前面范例二的报表的,范例的报表处添加一个文本框”这是首页“,在这个文本框,首先要在这个文本框中设为定位锚,此时只需点击此文本框后,按F4,在属性窗口的”Bookmark“属性中填入”这是首页“作为书签。如图11

【Reporting Services 报表开发】— 交互式报表

图11

书签可以是任何字符串,但是在报表中必须是唯一的。如果书签并非唯一,则链接此书签是,系统会指向第一个相符的书签。

2.在数据表的最左边插入一列,并在文本框里面输入”返回首页“,单击该“文本框属性”,在”文本框属性“对话框中切换至”操作“标签页,勾选”转到书签“,并在下拉菜单内填入要调至的书签。这里为“这是首页”。如图12

【Reporting Services 报表开发】— 交互式报表

图12

3.预览报表,无论在报表何处,比如第二页,第三页等,只要把鼠标放至在”返回首页“的存储格上方,就会出现”小手指(表示超链接)“的图示,画面就会自动调回至报表首页(设置书签之处)。如图13和图14

【Reporting Services 报表开发】— 交互式报表

图13

点击图13的返回首页,直接会跳转到图14

【Reporting Services 报表开发】— 交互式报表

图14

 四、深化报表

在报表中”组“是经常使用来显示汇总数据的方式,通过组可以让数据进行结构化的汇总,以方便浏览者解读报表信息。在复杂的商业报表中,通常会有多重的组结构,例如,时间久可能会有年,季,月,日,为了方便使用者查看,如果组能够让使用者自行展开和缩合,分析者就可以选择想要查看的年份并深化至想要的时间层。

多维度分析是用数据事先汇总来达到动态报表的效果,在SSRS中也提供类类似的”深化报表“功能(Drill-down),虽然没有办法像多维度分析般动态拖拉报表的横轴和纵轴,但是仍旧可以利用组结构设计出动态展开和缩合的架构。

范例一:深化式报表

1.需要用到的SQL:

 SELECT
YEAR(TRX_DTE) AS TRX_YEAR,
month(TRX_DTE) AS TRX_MONTH,
C.PRODUCTSUBCATEGORY_KEY,
C.PRODUCTSUBCATEGORY_NAME,
D.PRODUCTCATEGORY_KEY,
D.PRODUCTCATEGORY_NAME,
F.COUNTRY_NAME,
SUM(SALES_AMT) AS SALES_AMT,
SUM(SALES_QTY) AS SALES_QTY
FROM dbo.FACT_SALES A
LEFT JOIN
dbo.DIM_PRODUCT B
ON A.PRODUCT_KEY=B.PRODUCT_KEY
LEFT JOIN
dbo.DIM_PRODUCTSUBCATEGORY C
ON B.PRODUCTSUBCATEGORY_KEY=C.PRODUCTSUBCATEGORY_KEY
LEFT JOIN
dbo.DIM_PRODUCTCATEGORY D
ON C.PRODUCTCATEGORY_KEY=D.PRODUCTCATEGORY_KEY
LEFT JOIN
dbo.DIM_STORE E
ON A.STORE_KEY=E.STORE_KEY
LEFT JOIN
dbo.DIM_REGION F
ON E.REGION_KEY=F.REGION_KEY
WHERE YEAR(TRX_DTE)=@YEAR
GROUP BY
YEAR(TRX_DTE) ,
month(TRX_DTE),
C.PRODUCTSUBCATEGORY_KEY,
C.PRODUCTSUBCATEGORY_NAME,
D.PRODUCTCATEGORY_KEY,
D.PRODUCTCATEGORY_NAME,
F.COUNTRY_NAME

SQL Code

【Reporting Services 报表开发】— 矩阵的使用 图14的基础上稍微改下,如图15

【Reporting Services 报表开发】— 交互式报表

图15

2.在下方数据行组面板右击”PRODUCTSUBCATEGORY_NAME“行组选择”组属性“,切换至属性对话框的”可见性“标签页,在报表最初运行时”处勾选“隐藏”,这表示“PRODUCTSUBCATEGORY_NAME”组在报表展示时默认为隐藏(缩合),并选择“PRODUCTCATEGORY_NAME”,并选如图16

【Reporting Services 报表开发】— 交互式报表

图16

3.切换至预览,此时报表一开始数据行只会出现“产品大类”汇总项目,但是显示的组内容表头上都会出现小型的“+”符号,点击该符号后,会展开该产品大类内的的所有产品中类,同时该“+”会切换为“-”。如图17

【Reporting Services 报表开发】— 交互式报表

图17

注意这里要设置pading 的Left的属性,如图18:

【Reporting Services 报表开发】— 交互式报表

图18

范例二:父子式层次报表

1.需要用到的SQL:

SELECT
EMPLOYEE_KEY,
MANAGER_KEY,
EMPLOYEE_NAME,
SUM(C.SALES_AMT) AS SALES_AMT
FROM dbo.DIM_EMPLOYEE A
LEFT JOIN
dbo.DIM_STORE B
ON A.EMPLOYEE_KEY=B.MANAGER_EMPLOYEE_KEY
LEFT JOIN
dbo.FACT_SALES C
ON B.STORE_KEY=C.STORE_KEY AND YEAR(TRX_DTE)=2010
GROUP BY
EMPLOYEE_KEY,
MANAGER_KEY,
EMPLOYEE_NAME

SQL Code

2.加入数据表,将员工名称和销售金额字段加入数据表,

3.建立以“EMPLOYEE_KEY”为基础的组,然后把详细的信息删除。如图19

【Reporting Services 报表开发】— 交互式报表

图19

4.右击“EMPLOYEE_KEY”组,选择组属性,切换至“高级”标签页,在“递归父级”处下下拉选择“[MANAGER_KEY]”。如图20

【Reporting Services 报表开发】— 交互式报表

图20

5.如果希望视觉上呈现数状规则结构,则必须通过缩排的方式来显示。所以,选中“EMPLOYEE_NAME”的文本框,按F4,在其属性的Pading的“Left”的表达式中输入以下表达式

=(2 + (Level()*20)) & "pt"。如图21

【Reporting Services 报表开发】— 交互式报表

图21

6.在下方数据行组面板右击”EMPLOYEE_KEY“行组选择”组属性“,切换至属性对话框的”可见性“标签页,在报表最初运行时”处勾选“隐藏”,这表示“EMPLOYEE_NAME”组在报表展示时默认为隐藏(缩合),并选择“EMPLOYEE_NAME”。如图22

【Reporting Services 报表开发】— 交互式报表

图22

7.预览效果如下:

【Reporting Services 报表开发】— 交互式报表

图23

发现一个问题:上级的没有数字,因为是高级主管。高级主管必须为下层的数字的求和。

【Reporting Services 报表开发】— 交互式报表

图24

=Sum(Fields!SALES_AMT.Value)

=Sum(Fields!SALES_AMT.Value,"EMPLOYEE_KEY",recursive)

【Reporting Services 报表开发】— 交互式报表

图25

五、钻取式报表:

主要是主表跳转到子表,通过传参数到子表。具体如下图,大家自己思考下吧。

【Reporting Services 报表开发】— 交互式报表

图26

六、总结:

SSRS报表开发基本上就差不多就这些,特别是对于Microsoft Dynamics CRM 中的报表开发者,这都是必须要掌握的知识。另外要开发出性能很好的报表,还需要掌握SQL Server的知识。另外SSRS还可以开发一些图表,微图形与仪表等其他功能,大家可以自己去研究。

参考书籍《SQL Server 2008 R2  Reporting Services 报表服务》

需要下载的数据库和SQL脚本:http://www.wsbookshow.com/bookshow/kjlts/jsj/kfzj/11395.html 的图书详情—>下载资源 都是用“ASIAMINER_SSRS”数据库

上一篇:【Reporting Services 报表开发】— 数据表存储格式修改


下一篇:【Reporting Services 报表开发】— 怎么根据当前表单的guid作为参数查询相关数据?