Reporting Services(以下称RS)这东西国内用的好像不是很多,百度搜去,没几条。最近上头忽然提出要用这东西。
总而言之、统而言之,RS是基于XML的数据呈现。
根据菜鸟我这几天的接触,觉得RS有以下的优点:
1.数据报表的制作方便,有点类似PB中制作数据呈现
2.报表发布之后,可以通过URL方便地访问
3.支持PDF、Excel等多种格式的呈现和导出方式
4.订阅功能允许你以共享文件或电子邮件方式让RS定时生成报表到指定目录或发送到指定邮箱中
但它相应也有不少缺点:
1.须得安装SQL Server
2.须得使用VS.NET发布(总觉得应该有更简便的发布方式,还没来得及仔细去弄,高手们如果有发布RS的经验,不吝赐教,多谢!)
装好了RS,在IIS里看增加了两个虚拟目录,一个是ReportServer 做部署用,一个是Reports 做管理用。
另外,会在开始菜单SQL SERVER的下发现多了一个相应的菜单,其中包括一个“报表管理器”和RS的联机丛书。同时,打开你的VS.NET 2003,可以在“智能商业项目”中找到RS的项目模板,这样你就可以新建一个RS项目。
项目打开之后,在解决方案的项目下有两个文件夹:“共享数据源”、“Reports”。RS可以使用多种数据源,所谓“共享”,是指可供多张报表共用的数据源。而“Reports”文件夹下放的则是你要的一张张报表。
添加一张报表之后,界面上会有“数据”、“布局”、“预览”三个TAB页。在“数据”页中,你可以配置当前报表所需的数据集,这需要你提供SQL查询语句。“布局”窗口允许你设计报表的样式,在左侧的工具箱中你可以看到“表格”、“矩阵”、“图表”等,另外,工具箱边上有一个“字段”窗口,选择相应数据集,将列出所有数据列,可以将列拖放到表格的“详细信息”行中的某一格上,表示表格该列所呈现的是此列的数据。“预览”窗口可以让你即时地看到你所制作的报表的效果。
下面介绍RS中的两个概念,这在使用RS的过程可能会常常遇到、用到:
(1)参数:
在“数据”或“布局”视图下,主菜单上的“报表”项下有“报表参数”一项,允许你设置可供报表使用的参数。最常见的使用参数的方法是,先设定报表参数如p_id,而后在生成数据集时的sql语句中就可用@p_id来表示(Oracle中是:p_id):select * from products where categoryid=@p_id
具体在参数页面中包括设置其:名称、提示、数据类型、可用值、默认值等。为报表设置参数后,当其显示时,在页面上方将显示参数栏,可能是简单的文本框,或者是下拉框,这取决于你对可用值的设定。提示则作为标签显示于文本框或下拉框的左侧。
可用值的设置有两种方式,包括无查询、来自查询,无查询方式中你可以指定相应的“标签”“值”对,如:
标签 值
True 1
False 0
“来自查询”需要你预先设置一个数据集,以该数据集中某个字段的值集合作为该参数可供选择的值。
类似的,默认值中也有无查询和来自查询,道理跟上面一样。
在通过url访问时,可以直接通过url指定相关参数的值,指定的方法与一般指定url参数的方法一样,以“&”作为分隔符。如“……&p_id=1&p_date=20061213”
(附带说明,经过测试,IE地址限制为2083B)
内置参数:
RS中有另一类内置参数,与上面所述参数不同,“url访问参数”可以用于控制报表格式等等,可简单分为两类:以“rs:”为前缀的指向报表服务器,以“rc:”为前缀的表示与HTML页面显示相关,
rc:Toolbar,用true与false表示是否显示工具栏,RS报表默认带有工具栏,工具栏上包括查询、刷新、导出等按钮,如果指定为false将不显示工具栏
rc:Parameters,表示是否显示参数栏,如果报表设置了参数,默认将在页面上方显示参数栏,允许你输入参数,如果指定为false将不显示参数栏
rs:Command,指示出要应用到您所指定的路径的操作。例如,rs:Command=Render 将呈现一个报表,而 rs:Command=ListChildren 将列出文件夹中所有项。
rs:Format,它用于指定呈现报表的格式。这使您可以包括不需要显示在 HTML 中的报表,还可以使用诸如 PDF 甚至是 XML 的格式。
关于内置参数,具体可参见RS联机丛书:url access。
关于参数,具体可参见RS联机丛书---管理他使用发布的报表---运行报表---运行参数化报表。
(2)表达式:
使用表达式可以使报表更丰富多样。RS报表在很多指定属性的地方都可以使用表达式,比如详细信息行的Color属性指定为:
=IIF(Fields!WEIGHT.Value<=0,"Red","Black")
(IIF类似于一个三元运算操作)
=IIF(Fields!WEIGHT.Value<=0, "Red", IIF(Fields!WEIGHT.Value <= 1, "Green", "Black"))
(IIF可以嵌套,以上表示当Weight列的值为0时,界面将以红色显示该行,否则以黑色显示)
=WeekdayName(Weekday("2007-01-04"))
(星期四)
=Globals.ReportName
(用于显示报表名称,可以在报表最上方插入一行,合并所有单元格,然后写入该表达式,即可获得该报表的名称)
在指定报表参数的默认值等情况下亦可以使用默认值,如一个时间类型的参数:
=Format(Today(),"d")
(表示当天,格式参数"d"表示短日期格式,不包括时间,如果是"D"则是长日期,包括时间。)
=Format(DateAdd(DateInterval.Day, -30, Today()),"d")
(表示30天前)
(附:DateAdd是一个VB函数,DateAdd(interval, number, date)
interval 字符串表达式,是所要加上去的时间间隔的单位。
number 数值表达式,是要加上的时间间隔的数目。
date 日期表达式,这一日期还加上了时间间隔。
Interval包括:yyyy 年、q 季、m 月、y 一年的日数、d 日、w 一周的日数、ww 周、h 时、n 分钟、s 秒,例如:
DateAdd("d",10,"2000-6-18") = 2000-06-28
DateAdd("m",-1,"2000-6-18") = 2000-05-18)
(部分RS中可用的函数,可参见:
RS联机丛书----设计和创建报表----生成报表----创建报表的方法----从access导入报表----支持的access报表功能)
可结合表达式与报表参数,如,预先设置一个报表参数p_chart,可用值指定为“表格”、“图表”,默认值为“表格”。在一张报表上分别制作了表格形式与图表形式的报表,分别指定其Visibility---Hidden属性:
=IIF(Parameters!p_chart.Value="表格",False,True)
=IIF(Parameters!p_chart.Value="图表",False,True)
完成之后你就可以通过选择p_chart参数来改变报表形式。
同样,可以结合表达式与报表参数来控制报表显示哪些列,隐藏哪些列。
另一个可用到表达式的地方是数据集中的查询字符串:
="Select * From Nodes " & IIF(Parameters!p_Today.Value=1,"where
trunc(InDate)=trunc(sysdate)","")
(当选择p_Today参数为1时,列出当天录入到表Nodes的节点信息,否则列出所有的节点信息,有一个不好的地方是在查询字符串中使用表达式的话,要保证表达式为一行,所以在注意删除多余的换行符。如果表达式较长,会比较麻烦。)
//另有一些表达式示例(网络资源):
下面的表达式也是根据 PctComplete 的值返回三个值中的一个
=Switch(Fields!PctComplete.Value >= .8, "Green", Fields!PctComplete.Value >= .5, "Amber", Fields!PctComplete.Value < .5, "Red")
在数据区域内的文本框中使用包含 RowNumber 函数的表达式,可以显示该表达式所在的每个文本框实例的行号。此函数可用于为表中的各行编号。还可以将其用于更复杂的情况,例如,根据行数插入分页符。有关详细信息。
下面的表达式显示最外面数据区域中从第一行到最后一行的行号。Nothing 关键字表示该函数将从最外面的数据区域中的第一行开始计数。若要从子数据区域开始计数,可使用数据区域的名称。
=RowNumber(Nothing)
下面的表达式提供报表的名称及其运行时间。可以将该表达式置于报表表尾或表体的文本框中。其时间格式为短日期形式的 .NET Framework 格式设置字符串:
=Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")
下面的表达式位于报表表尾的文本框中,提供报表的页码和总页数:
=Globals.PageNumber & " of " & Globals.TotalPages
下面的表达式位于表头左侧的文本框中,提供页面中的 LastName 文本框的第一个值:
=First(ReportItems!LastName.Value)
下面的表达式位于表头右侧的文本框中,提供页面中的 LastName 文本框的最后一个值:
=Last(ReportItems!LastName.Value)
您可以对表头或表尾中的报表项引用应用聚合函数。
=Sum(ReportItems!Cost.Value)
下面的表达式如果用在组表达式中,可为每 25 行指定一个编号。如果为组定义了分页符,则会每隔 25 行插入一个分页符。
=Int((RowNumber(Nothing)-1)/25)
对数据行应用交替着色。
=Iif(RowNumber(Nothing) Mod 2, "PaleGreen", "White")
一篇比较详尽的RS入门文章(不保证地址始终有效^^):
http://www.microsoft.com/china/msdn/library/data/sqlserver/SQLServerReportServ.mspx?mfr=true