SSRS报表生成序列编号异常:子报表编号未重置为1
解决SSRS主/子报表编号独立重置的问题
我来帮你搞定这个头疼的编号问题!你现在遇到的核心问题就是主报表和子报表共用了同一个全局计数变量,导致子报表的编号直接接着主报表的数往下走,没法独立从头开始。咱们直接从代码和配置入手解决:
问题根源
原来的内嵌代码里的计数变量是全局作用域的,子报表作为主报表的一部分,会直接继承这个变量的当前值,不会自动重置,所以才会出现编号延续的情况。
具体解决方案
第一步:重构内嵌代码,给主/子报表分开设计数变量
把报表的内嵌代码改成下面这样,专门给主、子报表各搞一套独立的层级计数变量和方法,让它们互不干扰:
' 主报表专属的编号变量 Private mainLevel1 As Integer = 0 Private mainLevel2 As Integer = 0 ' 子报表专属的编号变量 Private subLevel1 As Integer = 0 Private subLevel2 As Integer = 0 ' 主报表:重置一级编号(比如主报表开头或者分组前调用) Public Sub ResetMainLevel1() mainLevel1 = 0 mainLevel2 = 0 End Sub ' 主报表:生成一级编号(调用一次就自动+1) Public Function GetMainLevel1() As String mainLevel1 += 1 mainLevel2 = 0 ' 一级编号变了,二级就得重置 Return mainLevel1.ToString() End Function ' 主报表:生成二级编号 Public Function GetMainLevel2() As String mainLevel2 += 1 Return mainLevel1.ToString() & "." & mainLevel2.ToString() End Function ' 子报表:重置一级编号(子报表加载时必须调用) Public Sub ResetSubLevel1() subLevel1 = 0 subLevel2 = 0 End Sub ' 子报表:生成一级编号 Public Function GetSubLevel1() As String subLevel1 += 1 subLevel2 = 0 Return subLevel1.ToString() End Function ' 子报表:生成二级编号 Public Function GetSubLevel2() As String subLevel2 += 1 Return subLevel1.ToString() & "." & subLevel2.ToString() End Function
第二步:主报表里对应调用方法
- 主报表的一级组行/页眉里,用
=Code.GetMainLevel1()来生成一级编号;如果需要主报表开头重置编号,就在主报表的初始化事件里加=Code.ResetMainLevel1()。 - 主报表的二级组行里,用
=Code.GetMainLevel2()生成二级编号。
第三步:子报表里配置重置和调用
- 子报表的一级组初始化事件里,一定要加
=Code.ResetSubLevel1(),这样子报表一加载,计数就从零开始了。 - 子报表的一级组行用
=Code.GetSubLevel1(),二级组行用=Code.GetSubLevel2()。
额外注意点
- 要是子报表被主报表多次调用,记得每次调用子报表前都触发
ResetSubLevel1(),可以在主报表里子报表控件的BeforeRender事件里加这个方法调用。 - 确认子报表的Processing Mode是
Local,远程模式下变量作用域可能会有问题。
测试验证
预览报表的时候,先看主报表的编号是不是正常(比如1 测试数据、1.1 测试数据),再看子报表的部分,应该是从1重新开始计数,不会再跟着主报表的尾巴走啦!
内容的提问来源于stack exchange,提问作者Muktabai Chavan
相关产品推荐
相关产品推荐

