SSRS表格类对象

SSRS表格类对象

SSRS中的报表内容主要是通过“数据表”、“矩阵”以及“列表”三种数据区域项目所建构而成的,但是在旧版SSRS中,这三种项目都有其适用功能以及使用限制,例如:

n 数据表:数据列数量是固定的,但数据行却是可以动态增加且进行组合。

n 矩阵:数据行与数据列都是可以动态增加的。

n 列表:利用文本框以任意位置配置,适合用来呈现明细数据。

基本上,这些数据区域项目(除了列表)只能处理对称类型的报表结构,太多的限制对于企业业务报表设计来说实在过于束缚。因此,造成很多报表格式难以在SSRS中实作,为了提升可用性,SSRS中利用全新的Tablix将三者的功能加以延伸,大幅的排除既有限制以及扩充既有数据区域的格式设置弹性。

1. Tablix

什么是Tablix,简单地说,就是综合了传统的数据表(Table)与矩阵(Matrix)的优点合并产生的新型的数据区域项目,也就是:

Tablix = Table + Matrix

Tablix工具相较于传统数据区域项目有以下特性:

n 可以同时具备固定数量与动态数量数据列与数据行:“数据表”的特色在于数据列数量是固定的,但是,数据行却是可以动态增加且进行组设定。在“矩阵”中数据行与数据列都是可以动态增加的。可是在Tablix中,这些限制都将不再存在,不管是数据行或数据列都可以选择固定、或是动态增加模式,甚至于很合两种形态并且自由设定数据组。

n 在同一层级中支持平行数据行或数据列:这是Tablix新功能中最让微软自豪的一项,例如,在业绩报表中,设计者可以在数据行中加入一组“年度”的动态数量数据列,同时在旁边再加上一组平行的“产品”的动态数量数据列。这两组数据列虽然是使用独立的数据集,但是却可以共享同样的数据行。

n 阶梯式数据行:传统的矩阵报表的最大缺点就是当数据列具备阶梯时,展开时会是多层结构。在Tablix中,可以将数据列的多层结构转为阶梯缩排结构(这是以前在数据表才有的功能),如此报表会看起来简洁许多。

不过,Tablix只是一个概念,在SSRS的工具栏中是找不到名为“Tablix”的项目的,数据表、矩阵以及列表依然存在,只不过是利用属性设置的方式扩充的格式弹性,因此,不管你拉的是数据表、矩阵或是列表,在设计界面上的名称也都是Tablix。以下我们将从“数据表”数据区域项目的使用谈起。

2. 数据表与数据集绑定

设计报表可以直接从工具箱中将数据表拖放至设计画面中。当鼠标单击设计画面中数据表的任一数据格时,在数据表的左侧与上方都会呈现灰色的区块,在此称为“数据行控点(Row Handle)与“数据列控点(Column Handle)”,而“数据列控点”与“数据行控点”的交汇处为“交角控点(Corner Handle)”。在“数据列控点”、“数据行控点”与“交角控点”按一下鼠标右键来执行数据行、数据列和数据表的大部分设置动作。

“行处理框”灰色区域上会使用图示来标示每行数据行的用途。第一行无图示者为数据表的“表头(Header)”,在数据表中表头默认只出现一次,如果希望增加表头的行数,可以点选“行处理框”的表头处点选“Insert Row”的“Above”或是“Below”,即可增加行数。

第二行有“≡”图示者为“详细数据”,至于SSRS 2008之后已经不在有数据表的“表尾(Footer)”项目,对于SSRS 2008来说,表尾就是一般的数据行,如果要开启数据表的表尾,可直接在详细数据下方加入组外的数据行即可。

如何选择整个数据表?

先选择数据表中的任一单元格,再单击数据表左上角的“交角控点”,即可选择整个数据表。

但是,系统默认并不会显示“Report Data”窗口,此时,请各位在“View”中选择“Report Data”。将报表数据窗口中的“各品类每月销售分析”数据集展开,使用鼠标从字段列表中将数据列“TRX_YEAR”字段拖放至数据表对应的“详细数据”行的第一列中,拖拉动作完成后,详细数据单元格中会出现该数据的代表表达式“=Fields!TRX_YEAR.Value”。

放入数据字段时,SSRS会依照数据集所命名的字段名称(TRX_YEAR)自动标示在数据表的表头,通常数据集所定义的字段名称是无法让报表的使用者直接识别的,所以,设计者应该手动将表头中的字段修改为有意义的名称。

基本上,当第一个字段放到数据表时,该数据集即成为此数据表绑定的数据集,SSRS中的一个数据区域只能绑定单一数据集。设计者可通过“Properties”窗口的“DataSetName”属性中的下拉式菜单,查看火修改绑定的数据集。

数据绑定

SSRS中,一个数据区域只能绑定一个数据集,但是一张报表内可以有多个数据集。如果你希望做到一个数据区域内呈现多个数据源,必须要利用SSRS 2008 R2新增的Lookup表达式。

修改完成后,切换至“Preview”标签页,即可检查报表完成画面。

通过以上示例,可以了解SSRS的报表设计只需要几步鼠标点选、拖放的动作,便完成了一份报表。不过,要完成一份正式的报表光是这样还是不够的,还需要在版面上作多一些视觉化的设计。

3. 数据表属性设定方式

当在“主体(Body)”区域加入数据表时,在属性窗口中发现,除新增了“Tablix”的属性外,还多了许多的“文本框”属性,那是因为“数据表”是由许多“单元格(Cell)”组成,而实际上每个单元格都是一个“文本框(Textbox)”。

先介绍这个Tablix的属性设置。整个数据表“Properties”的设置,我们可以通过以下几种方式来操作,第一种模式是在报表设计器中的“Properties”窗口,在下拉菜单内选择“Tablix”选项。

除了以上的模式外,也可以右键数据表任一处,选择快捷菜单中的“Tablix Properties…”选项,即可在“Tablix Properties”对话框内设置相关属性。

不过,“Tablix Properties”对话框仅提供比较简单的设置功能,包括:

n 常规:主要是设置数据表名称、工具提示、数据集名称、分页符号以及行标题与列标题。

n 可见性:利用Hidden以及ToggleItem属性设置数据表的可见性切换。

n 筛选器:设置Filter属性。

n 排序:设置SortExpression属性。

4. 数据表数据行、数据列与表头

数据表中的“表头”与“表尾”是用来放置数据表共同的说明性信息,表头的部分通常都使用字段名来说明每个说句列的内容,“表头”默认只会在数据表的顶端出现一次。但如果数据表中的数据笔数过多需要延伸至多页时,为了方便使用者可以在每页查看字段信息,此时,也可以设置表头每页重复出现。

要做到每页重复表头,必须将“Column Groups”切换为“Advanced Mode”,单击“Row Groups”处“Details”上方的“Static”数据列(也就是表头数据列),在属性窗口中将“RepeatOnNewPage”属性设为“True”,即可做到每页重复表头的效果。

此外,SSRS也有类似Excel中“冻结窗格”的固定表头的功能,必须要进入“Advanced Mode”,单击“Row Groups”处“Details”上方的“Static”列(也就是表头数据列),在属性窗口中将“FixedData”属性以及“KeepTogether”属性设为“True”即可。

在SSRS 2008以后就不再出现独立的表尾区域,而是以详细数据下方的数据行取代。传统表尾是用来显示数据列中数值字段汇总后的结果。如果要产生表尾,除了单击详细信息区域,选择加入列组外下方数据列之外,还可以在设计区域下方的行组单击“Details”,选择“Add Total”、“After”,即可加入显示汇总信息的表尾区域。默认总计的汇总函数都是“求和(Sum)”。

5. 数据表单元格格式修改

光是有数据表恐怕还不够,大多数的商务使用者希望报表本身是能够赏心悦目,因此,数据的排版与格式是非常重要的,这也是为什么大多数的分析人员都是Excel高手,而且经由巧手一调整就可以产生出各种专业的报表。

SSRS中也提供了丰富的属性设置。可用来调整报表内容的外观。接下来,我们就从几个常见的属性来说明如何调整报表的格式。

步骤1:将表头的底色改为蓝色,字的颜色改为白色同时加大、加粗与居中。

步骤2:将销售金额的数字格式加上货币符号以及千分位符号。

步骤3:将销售数量的数字格式加上千分位符号。

步骤4:数据表加上横向框线。

首先,请将数据表的表头反白,将“BackgroundColor”设为“SteelBlue”、“Color”设为“White”、“Font”设为“Normal,10pt,Bold”、“FontFamily”设为“Microsoft YaHei”、“TextAlign”设为“Center”。表示底色设为蓝色,文字颜色为白色,字型设为粗体、10pt,雅黑及居中对齐。

接下来,将销售年月详细资料以及表尾处反白,将“Format”属性内输入“d”,d标示简易日期。销售金额详细资料以及表尾处反白,将“Format”属性内输入“C0”,C标示货币,系统会根据设定值产生对应的货币符号,至于0则标示保留小数0位。至于销售数量只需要在“Format”属性内输入“N0”,标示呈现数值0位小数。

在格式设置中,默认数据表都是灰色的边框,如果要改成横向边框,请先将“BorderStyle”属性的“Default”改为“None”。接下来,请将“BorderStyle”属性的“Top”与“Bottom”改为“Solid”。

设置完成后切换至预览标签页,只要熟悉各项格式属性,再搭配下表达式,就可以让报表格式呈现更丰富的变化。

6. 排序

一般在设计报表时,会希望报表中的数据能依一个或多个列中的数据来排序,帮助看报表的人能快速地检索数据,SSRS中有提供数种模式可以达到排序的效果:

n 在建立数据集时,使用“Order by”关键字来指定行的排序。

n 在数据表中指定排序方式。

n 让使用者依照个人的喜好来设置报表的排序方式。

当在定义数据集时,可使用SQL语法中的“Order by”、“Asc”及“Desc”关键字互相搭配指定数据返回至SSRS的顺序,其优点是将排序的工作交由数据库负责,报表服务器取得已经排序好的数据集,不需再做处理,可直接呈现结果。但是缺点在于如果要让多个数据区域共享同一个数据集,但是需求的排序方式不同时,就会造成设计上的困难。

若在定义数据集时没有指定排序的方式,数据会依照查询后返回数据集的原始数据顺序显示,如果觉得这个顺序过于凌乱,设计者仍可以使用“Tablix Properties”对话窗口内的“Sorting”标签页来设置。

首先,右击数据表任一处选择“Tablix Properties”,切换至“Sorting”标签页,单击“Add”按钮即可列出数据集排序的列,设计者可以制定多个排序列,以及排序顺序。如果单击排序依据右方的“fx”图示,可以再进一步撰写较复杂的表达式以符合设计者的排序需求。

前面介绍的两种方式,虽然都可以达到排序的效果,但是依照笔者的实际经验,不同的使用者看同一份报表时,仍会希望依照自己的需求来显示数据的顺序,通常这对报表设计人员会是一项棘手的问题,在SSRS中提供了“交互式排序”的功能,让每个使用者可以依照各自喜好调整报表的排序方式,贴心地为报表设计人员减轻负担。

7. 筛选

在数据集中虽然可以利用WHERE子句以进行数据筛选,但是,当筛选条件中包括参数时,每个使用者选取的参数不同,会造成SSRS必须重新从数据库中查询返回数据集,这反而会造成数据库查询的负担。此时,可以善用数据表的筛选功能,系统只需查询一个最完整的共享数据集,然后将此数据集存入缓存中,不同使用者使用差异的筛选功能,如此个别数据表虽然是绑定到相同的数据集,但只要筛选的条件不同,即可做到不同的内容呈现,这在企业级报表平台中是用来节省数据存取性能的重要技巧。

首先,右击数据表于任一处选择“Tablix Properties”,切换至“Filters”标签页,单击“Add”按钮即可列出数据集筛选的字段,以及指定筛选的表达式。如果单击筛选栏位或是筛选值右方的“fx”图示,可再进一步撰写较复杂的表达式以符合设计者的筛选需求。

8. 组

当数据表中数据列过多时,除了可以使用排序的方式来增加报表的可读性,另一种常用的技巧就是组化。组是将一组拥有相同特性的数据的集合,以刚才的报表来说,每笔数据都会有对应的销售年份以及产品种类,如果是以“产品大类”为基础加入数据表群组,数据表会将相同产品种类的数据集中在同一个组中,甚至组内还可以再使用其他字段再加入组,这种方式我们称为“嵌套组”。

如果要设计组,单击要产生组的数据行,右击选择“Add Group”,“Parent Group”即可。此处的父组指的是在外层的组,由于目前单击的是“Details”数据行,因此不可能有更内层的组,所以,画面只会显示“Parent Group”选项。

选择产生“Parent Group”后,在“Tablix Group”对话框中的“Group by”利用下拉菜单选择要产生组的列。此外,与数据表的概念相同,在每次新增组的时候,系统可以根据使用者的需求在组上下方产生新的数据行,分别为组头(Group Header)、组尾(Group Footer),在此,我们需要组头尾以放置小计数值。

设置组完成之后,默认会在数据表最左侧产生一个新的数据列,并且填入“Group by”的字段名称,同时该数据列的表头为“TRX YEAR”。将新的数据列“TRX YEAR”名称改为“交易年份”,并将原有的“交易年度”列删除。

默认组尾会是空白的数据行,设计者可以在组首尾中加入数据列汇总表达式来显示小计数值。此时,可将销售金额与销售数量在数据表表尾的表达式复制贴上至组页尾处,同时可在组页尾处加上“小计”的说明文字。

设置完成后,切换至“预览”标签页。

同时我们可以在交易年份的组内加入一个名为“产品大类”的子组,或是在详细信息外加入一个名为“产品大类”的父组,接着,我们将列只留下销售数量与销售金额。

此时,预览结果如下,你可以发现与预期有些不同,数据仍是呈现明细,而非根据两个组进行汇总。

这是因为组内还有详细信息所造成的,因此,可单击“Details”,并将它删除,在弹出的对话框中,选择“Delete Group”

设置后预览,可以得到汇总结果。

9. 高级数据表Tablix格式设置

传统的数据表只能将数据集作单次显示,但是,高级的Tablix则是可以将一个数据集利用不同的角度作重复的显示。举例来说,销售量报告除了依照产品类别查看之外,也可能要依照销售地区查看,传统做法就只能够使用两个数据表,但Tablix则是可以将它并排在同一个项目之中。以下我们将介绍如何使用Tablix设计不同角度的合并业务数据表。

设计方式只需要在设计区域下方的“Column Group”面板中选择“产品大类”的组,右击选择“Add Group”、“”,在弹出画面中选择组依据为[COUNTRY_NAME],如此即可产生一组平行于“产品大类”组的新组。

此时,可以在新产生的数据列中填入相关列,为了方便查看,将新产生的相邻组设定不同的底色。

此时预览结果如下图所示。请仔细观察,我刻意没有把新的相邻组的数值设置为之前的相邻组的格式,这是因为要让各位理解,上下两个相邻组的格式是可以各自独立的。

善用Tablix的属性,设计者可以自由地在数据行与数据列处设定静态(数量固定)以及动态(数量随列变动)的组,同时可以设置并排式的组,以强化报表的可读性。

时间: 2024-11-03 22:18:27

SSRS表格类对象的相关文章

Java File类学习笔记2:File类对象及常用操作方法

一. 文件.相对路径与绝对路径 1.文件 (1)标准文件:就像图片,音乐文件等. (2)目录文件:也就是平常所说的文件夹. (3)虚拟内存文件:系统在运行程序时生成的临时性文件. 2.文件的路径 (1)相对路径:相对于某一文件的路径,形象地说是把两文件的绝对路径相同的部分砍掉,剩下的就是相对路径 如: A文件是"D:\MyDocuments\StudySample\src\cn\xmh", B文件是"D:\MyDocuments\StudySample\src\netjava

java 类对象使用

在学习反射机制时,总结一下获得类对象方式: 第一种方式:通过类本身来获得对象 Class<?> classname = this.getClass(); 或者this.class 第二种方式:通过子类的实例获取父类对象 ClassName cn = new ClassName(); UserClass = cn.getClass(); Class<?> SubUserClass = UserClass.getSuperclass(); 第三种方式:通过类名加.class获取对象 C

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新. 之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher. 在需要使用数据的时候,通过: FetcherFactory::getFetcher<XXXFetcher>() 即可获取一

多继承(虚继承)派生类对象内存结构

在这里谈一下虚继承.前面写过派生类对象的内存结构,都是基于VS2010编译器的,不同的编译器对于继承的处理不同,但本质都是一样的. 虚继承是解决共享基类问题的.例如在菱形继承中 如果不使用虚继承,基类A在D中会有两个,这不仅浪费内存,还会造成歧义.使用虚继承就可以解决基类共享的问题. 要想在派生类中共享基类(例如在D对象中只有一个A对象,这时候D对象中的B对象和C对象都可以查找到A,而不是在B对象和C对象中各含有一个A对象). 先看下面一个例子: #include<iostream> usin

1,SFDC 开发篇 - 类对象和SOQL查询

1,类对象 & 接口 & 属性 2, Object & SOQL

Objective-C对象之类对象和元类对象

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/8592492 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 作为C语言的超集,面向对象成为Objective-C与C语言的最大区别,因此,对象是Objective-C中最重要的部分之一.目前面向对象的语言有很多,Objective-C中的对象又和其他语言中的对象有什么区别呢?下面来简单介绍Objectiv

C++:基类与派生类对象之间的赋值兼容关系

4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量.这种不同类型之间的自动转换,称为赋值兼容.在基类和派生类对象之间也存在有赋值兼容关系,基类和派生类对象之间的赋值兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来代替.因为,通过公有继承,除了构造函数和析构函数外,派生类保留了基类其他的所有的成员.那么,派生类就具有基类的全部功能,凡

字符串类的定义和字符串类对象的创建方式

String为字符串类. 其定义如下: public final class String 可以看出,String类是final类型的,是不可继承的.从源代码还可以看出,String从本质上说就是一个char类型的数组. 字符串类对象的声明有两种方式. 第一种,使用new关键字创建. String 变量名=new String("值"); 第二种,直接声明并初始化. String 变量名="值"; 我更喜欢第一种,标准的,所有类的对象的声明都通过  new 类的构造

类对象指针

类对象指针定义 Tdate d1; Tdate *p1=&d1; Tdate *p2=(Tdate *)malloc(sizeof(Tdate));