SQL Server 2005 Reporting Services – RDL 编程问题






2.83/5 (10投票s)
2007年8月5日
4分钟阅读

95397
RDL 编程 - 一些问题及其解决方案
引言
在过去三个月里,我有机会接触了“SQL Server 2005 Reporting Services – RDL 编程”。SQL Server Reporting Services 目前存在很多限制。因此,我和我的团队成员在为客户开发各种报表的过程中遇到了很多问题。我们需要开发超过 20 个报表,并且在此之前没有任何经验。
在本文中,我们将讨论我们遇到的一些问题/挑战以及我们提出的解决方案。
直入主题
#1. 按组分隔符重置页码
SQL Server Reporting Services 提供了 2 个全局变量:Globals.PageNumber
和 Globals.TotalPages
。您可以使用它们在“页脚”中显示页码。但是,如果您需要在 RDL 中的“组”断开时“重置”页码。例如,假设您正在显示客户发票,并且您希望在每个新客户处重置页码。这是一个非常明显的要求,但不幸的是,Reporting Services 没有原生支持。
可能的解决方案
起初,我们很高兴在 Chris Hay 的博客 上找到了类似的解决方案。事实上,他的博客上还有其他一些值得阅读的有趣文章。他的解决方案实际上是使用了“共享”变量。具体来说,添加一个自定义函数来设置共享变量并检索组页码。
Public Function GetGroupPageNumber(group as Object, pagenumber as Integer) _
as Object
If Not (group = currentgroup)
offset = pagenumber - 1
currentgroup = group
End If
Return pagenumber - offset
End Function
在页眉或页脚中使用该函数
=Code.GetGroupPageNumber(ReportItems!Category.Value,Globals!PageNumber)
但我们的问题比这更复杂。
我们还需要显示组的总页数以及当前页码,即我们应该显示“第 1 页,共 x 页”,其中页码和总页数都应该是特定于组的。使用上述方法,您无法提前计算组的总页数来显示在每一页上。
我们的解决方案
不幸的是,Reporting Services 目前没有此类原生支持。因此,我们不得不固定可以在一页上显示的数据行数(假设为 R = 40 行)。然后,从为该 RDL 获取数据的存储过程中,我们在数据集中插入一个列,该列指示“组所需的总页数”。然后我们使用该列来显示总页数。如果您可以采用此方法,也可以用类似的方式在数据集中包含一个当前页码的列。
#2. 如何将表格延伸到页面底部?
假设您在报表中显示客户的电话账单,并且要求即使账单数据在页面结束前很早就结束,但“账单表”的边框仍应延伸到页面底部。此外,之后,假设您需要在单独的 `table` 中显示客户“账单总计”。
解决方案
我建议两个解决方案
- 如果您可以在报表中采用与问题 #1 类似的方法——即固定可以在页面上显示的数据行数——那么您可以向数据集中插入一些空行来填充页面。因此,如果您的页面包含 40 行(将总表格分开),而某个客户有 22 行,您可以在数据集中(从您的存储过程本身)填充 40 – 22 = 18 行空行以填满页面。然后您只需在 RDL 中将表格边框应用于您的数据集。
- 另一种方法是使用报表 `Body` 的 `border`,而不是使用 `table border`。然后,您可以将“总表格”作为“页脚”的一部分。
#3. 如何实现动态高度的页面页眉和页脚?
假设您的 `Page Footer` 在 6 行中显示了 6 个客户地址字段(cust_name, cust_addr1, cust_addr2, cust_addr3, city, state, zip)。要求是,如果客户地址只有 4 行——即 cust_addr2 和 cust_addr3 为空——您需要隐藏这 2 行空行。在这种情况下,您的页脚高度也会缩短,为 `report body` 提供更多空间。
解决方案
请注意,RDL 没有此类原生支持。您必须将 `page footer` 的高度保持固定。唯一的选择是从报表中排除页眉和页脚,而是使用组页眉和组页脚,并将“在每页上重复页眉/页脚”设置为 `true`。
结论
我将很快继续在此文章中添加其他问题及其解决方案。请继续关注!!
历史
- 2007 年 8 月 20 日 -- 首次更新
- 2007 年 8 月 5 日 -- 发布原始版本