避免空白页
有时当你将报表输出到例如PDF或打印机这样的物理页面是,你可能会看到有空白页面。通常,当报表正文超过纸面尺寸是会发生这种情况。
为了确认所有的内容适合于单一的纸张,正文加上页边的空白应该小于预定义好的纸面宽度。文本框和其他的报表项可以导致正文宽度超过纸面宽度,即使当超出部分的内容不可见。另外,报表项水平的增长(矩阵数据区域和图片自动设置为Autosize或Fit)可以导致正文宽度的增长。
使用分页提高大报表的性能
如果不去为一个返回大量数据的报表设置页面大小或分页符,一些报表格式将会尝试将报表渲染成单页。
例如,Excel没有默认的固定页面宽度。所以,如果你有一个很大的报表,Excel将尝试将其渲染成一个工作表。通常,使用分页符可提高用户访问报表时的性能,因为当渲染报表剩余部分时,用户可以查看报表的第一页。
使用筛选器代替查询参数
报表服务有几种方法动态的过滤报表内容:
◆当返回丛数据源获取数据时使用查询参数过滤数据。
◆应用于数据集或报表区域的报表筛选器,限制在报表中显示的数据。
使用筛选器获取所有的数据,但是只有和用户相关的数据被显示。这也许比在数据源中过滤数据的效率要低。然而,这样可以使我们只获取一次数据并将数据存储在快照中来服务于不同的用户请求。换句话说,当我们使用查询参数,每一个新的参数查询你都要访问数据源。筛选器可以使我们执行快照并获取所有参数的结果。
在表格中添加轮换条
也许你需要创建带有隔行渐变形式的表格或矩阵的报表。 这种栏从视觉上可以更好地在一个页面上跟踪不同的行。
为了更好的模拟用在生成大量报表的高速数据打印机中的老式绿条纸 你可以轮换条设置为绿色。
为了完成这个效果,可以使用Iif函数基于行数的奇偶性有条件指派背景色。例如:
=iif(RowNumber(Nothing) Mod 2,"PaleGreen","White")
在RDL文件中的描述应该类似于如下代码:
<TableCell>
<ReportItems>
<Textbox Name="SalesOrderID">
<Style>......<PaddingLeft>2pt</PaddingLeft><Format>d</Format><BackgroundColor>=iif(RowNumber(Nothing) Mod 2,"#c0ffc0","White")</BackgroundColor>
<TextAlign>Right</TextAlign>
<PaddingBottom>2pt</PaddingBottom>
<PaddingTop>2pt</PaddingTop>
<PaddingRight>2pt</PaddingRight></Style>
<ZIndex>4</ZIndex><rd:DefaultName>SalesOrderID</rd:DefaultName>
<CanGrow>true</CanGrow><Value>=Fields!SalesOrderID.Value</Value></Textbox></ReportItems></TableCell>
在一个报表中的表格中在指定行后添加分页符
你可以使用Ceiling 函数在表格中将行分组,并在每个分组后插入分页符。
Ceiling函数返回不小于输入参数的最小值。例如,每隔30行添加一个分页符,你应该使用下列表达式分组:
Ceiling(RowNumber(Nothing)/30)
RDL中描述分组应该类似于下列描述:
<TableGroups>
<TableGroup>
<Grouping Name="PageGroup">
<GroupExpressions>
<GroupExpression>=Ceiling(RowNumber(Nothing)/30)</GroupExpression>
</GroupExpressions>
<PageBreakAtEnd>true</PageBreakAtEnd>
</Grouping></TableGroup></TableGroups>
在页眉和页脚中添加全局变量值
在表6中显示了Globals对象的成员,这些可以在报表的表达式中使用。
表6
| 名称 | 类型 | 描述 |
| PageNumber | Integer | 当前页数。仅在报表的页眉和页脚中使用。 |
| TotalPages | Integer | 报表的总页数。仅在报表的页眉和页脚中使用。 |
| ExecutionTime | DateTime | 报表开始执行得日期和时间。 |
| ReportFolder | String | 包含报表的文件夹的路径,例如salesreports\budgeting 或c:\sales\budget |
| ReportName | String | 报表的名称,例如 currentbudget. |
你可以在报表的页眉或页脚中使用表达式显示报表名称和执行时间。时间通过.NET提供的短日期格式。例如:
Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")
同样也可以利用文本框将报表的当前页数和总页数显示在页眉:
Globals.PageNumber & " of " & Globals.TotalPages
在页眉中显示报表项
在长报表中你可能会希望在页眉中添加报表正文中的文字。例如,一个姓名地址录在页眉重要显示当页中出现的第一个和最后一个名字。
为了实现这个功能,你可以在页眉上添加一个文本框,并使用First函数。为了在页面上显示第一次出现的LastName值,表达式应该类似于如下所示:
=First (ReportItems!LastName.Value)
同样的,使用表达式函数Last 可以提供在页面上显示LastName 文本框的最后一个值 。例如
=Last (ReportItems!LastName.Value)
创建带有条件格式的钻取连接
报表服务可以通过拥护和报表的交互在报表中隐藏或显示报表项。
你可以使用这种功能在报表中创建钻取连接。例如,通过点击某个区域,用户可以从汇总视图中钻取数据的详细信息。
接下来,为包含该分组的文本框创建触发开关项。然后当用户点击该文本框,隐含的数据变成可见的或数据不显示。
结论
Microsoft SQL Server 2005 报表服务提供了多种报表设计的选择。本文提供了一些常规的指导方针和报表设计技巧,但是只涉及了部分该产品的功能。为了获取更多的设计信息和产品功能,请参考SQL Server 2005 联机丛书。
