SSRS 递归层次结构中的奇怪行为
Strange Behaviour in Recursive Hierarchy in SSRS
我在为使用 T-SQL 和 SSRS 的客户开发的报告中遇到了一个有趣的问题。
我的客户要求我显示最多五个级别的条目层次结构,并使用报告参数来定义报告的深度。客户希望第 5 级是最低粒度级别,第 4 级是高于该级别的级别,依此类推。报告应显示最高级别,并能够向下钻取到报告参数定义的最低级别。
层级参差不齐,但确定报告级别的标准需要一个平衡的层级。
给出以下示例:
Level 1 A
|
-----------------------------------------
| | | |
Level 2 B C D E
| | |
| | ---------
| | | |
Level 3 F G H I -
| | |
| | |
| | |
Level 4 J K - L -
|
|
|
Level 5 M - - - -
为了实现客户的需求,顶层以下的每个级别都需要 "pushed down" 才能创建一个平衡的层次结构:
Level 1 A
|
-----------------------------------------
| | | |
Level 2 B X X X
| | | |
| | | |
| | | |
Level 3 F C D X
| | | |
| | --------- |
| | | | |
Level 4 J G X I X
| | | | |
| | | | |
| | | | |
Level 5 M K H L E
X 表示虚数 "inserted" 个节点。
我的报表需要显示原始层次结构中的节点,但要使用上面第二张图上的级别来确定显示的最大深度。因此,我并没有坚持平衡层级,而是简单地计算了每个原始节点的新深度。
我创建了一个 sql table 层次结构详细信息:
Create Table
Hierarchy
(
ID Int,
Name Varchar(100),
ParentID Int,
Ragged_Hierarchy_Depth Int,
Balanced_Hierarchy_Depth Int
);
Insert Into
Hierarchy
(
ID,
Name,
ParentID,
Ragged_Hierarchy_Depth,
Balanced_Hierarchy_Depth
)
Values
( 1, 'A', Null, 1, 1 ),
( 2, 'B', 1, 2, 2 ),
( 3, 'C', 1, 2, 3 ),
( 4, 'D', 1, 2, 3 ),
( 5, 'E', 1, 2, 5 ),
( 6, 'F', 2, 3, 3 ),
( 7, 'G', 3, 3, 4 ),
( 8, 'H', 4, 3, 5 ),
( 9, 'I', 4, 3, 4 ),
( 10, 'J', 6, 4, 4 ),
( 11, 'K', 7, 4, 5 ),
( 12, 'L', 9, 4, 5 ),
( 13, 'M', 10, 5, 5 );
为了演示这个问题,我创建了一个包含两个层次结构组和一个 Hierarchy_Level 整数参数的报告:
我已经在每个组的 ParentID 上实现了递归分组。对于每个组,我使用以下表达式进行过滤:
Ragged_Hierarchy : Ragged_Hierarchy_Depth.Value <= 参数!Hierarchy_Level.Value
Balanced_Hierarchy : Balanced_Hierarchy_Depth.Value <= 参数!Hierarchy_Level.Value
如果 (Level()>0),每个组的可见性设置为隐藏,并由行中的第一个文本框切换。
Ragged_Hierarchy 组正确显示,将级别隐藏在所选级别之下。但是,在 Balance_Hierarchy 组中,2-4 级有 expand/collapse 个图标,但下方没有任何可显示的图标。展开时它们不会深入到任何东西,但我似乎无法摆脱它们。当我将报告导出到 Excel 时,不需要的图标消失了 - 它们仅在在线报告中显示。
有没有一种方法可以防止这些图标出现,而无需诉诸代价高昂的解决方法?
我现在已经解决了这个问题。应用于 Balanced_Hierarchy 组的过滤器也需要应用于递归父表达式。
所以代替:
=Fields!ParentID.Value
表达式应该是:
=IIf(
(Fields!Balanced_Hierarchy_Depth.Value <= Parameters!Hierarchy_Level.Value),
Fields!ParentID.Value,
Nothing
)
似乎 SSRS 递归分组在 确定父子关系后应用组筛选器。因此需要在确定父子关系时应用过滤器。
我在为使用 T-SQL 和 SSRS 的客户开发的报告中遇到了一个有趣的问题。
我的客户要求我显示最多五个级别的条目层次结构,并使用报告参数来定义报告的深度。客户希望第 5 级是最低粒度级别,第 4 级是高于该级别的级别,依此类推。报告应显示最高级别,并能够向下钻取到报告参数定义的最低级别。
层级参差不齐,但确定报告级别的标准需要一个平衡的层级。
给出以下示例:
Level 1 A
|
-----------------------------------------
| | | |
Level 2 B C D E
| | |
| | ---------
| | | |
Level 3 F G H I -
| | |
| | |
| | |
Level 4 J K - L -
|
|
|
Level 5 M - - - -
为了实现客户的需求,顶层以下的每个级别都需要 "pushed down" 才能创建一个平衡的层次结构:
Level 1 A
|
-----------------------------------------
| | | |
Level 2 B X X X
| | | |
| | | |
| | | |
Level 3 F C D X
| | | |
| | --------- |
| | | | |
Level 4 J G X I X
| | | | |
| | | | |
| | | | |
Level 5 M K H L E
X 表示虚数 "inserted" 个节点。
我的报表需要显示原始层次结构中的节点,但要使用上面第二张图上的级别来确定显示的最大深度。因此,我并没有坚持平衡层级,而是简单地计算了每个原始节点的新深度。
我创建了一个 sql table 层次结构详细信息:
Create Table
Hierarchy
(
ID Int,
Name Varchar(100),
ParentID Int,
Ragged_Hierarchy_Depth Int,
Balanced_Hierarchy_Depth Int
);
Insert Into
Hierarchy
(
ID,
Name,
ParentID,
Ragged_Hierarchy_Depth,
Balanced_Hierarchy_Depth
)
Values
( 1, 'A', Null, 1, 1 ),
( 2, 'B', 1, 2, 2 ),
( 3, 'C', 1, 2, 3 ),
( 4, 'D', 1, 2, 3 ),
( 5, 'E', 1, 2, 5 ),
( 6, 'F', 2, 3, 3 ),
( 7, 'G', 3, 3, 4 ),
( 8, 'H', 4, 3, 5 ),
( 9, 'I', 4, 3, 4 ),
( 10, 'J', 6, 4, 4 ),
( 11, 'K', 7, 4, 5 ),
( 12, 'L', 9, 4, 5 ),
( 13, 'M', 10, 5, 5 );
为了演示这个问题,我创建了一个包含两个层次结构组和一个 Hierarchy_Level 整数参数的报告:
我已经在每个组的 ParentID 上实现了递归分组。对于每个组,我使用以下表达式进行过滤:
Ragged_Hierarchy : Ragged_Hierarchy_Depth.Value <= 参数!Hierarchy_Level.Value
Balanced_Hierarchy : Balanced_Hierarchy_Depth.Value <= 参数!Hierarchy_Level.Value
如果 (Level()>0),每个组的可见性设置为隐藏,并由行中的第一个文本框切换。
Ragged_Hierarchy 组正确显示,将级别隐藏在所选级别之下。但是,在 Balance_Hierarchy 组中,2-4 级有 expand/collapse 个图标,但下方没有任何可显示的图标。展开时它们不会深入到任何东西,但我似乎无法摆脱它们。当我将报告导出到 Excel 时,不需要的图标消失了 - 它们仅在在线报告中显示。
有没有一种方法可以防止这些图标出现,而无需诉诸代价高昂的解决方法?
我现在已经解决了这个问题。应用于 Balanced_Hierarchy 组的过滤器也需要应用于递归父表达式。
所以代替:
=Fields!ParentID.Value
表达式应该是:
=IIf(
(Fields!Balanced_Hierarchy_Depth.Value <= Parameters!Hierarchy_Level.Value),
Fields!ParentID.Value,
Nothing
)
似乎 SSRS 递归分组在 确定父子关系后应用组筛选器。因此需要在确定父子关系时应用过滤器。