SSRS中递归层次中的奇异行为

时间:2015-08-10 16:12:16

标签: sql-server tsql reporting-services sql-server-2012 hierarchy

我在使用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          -         -          -         -

为了达到客户想要的目标,最高级别以下的每个级别都需要“按下”,以创建平衡的层次结构:

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表示想象中的“插入”节点。

我的报告需要在原始层次结构中显示节点,但要使用上面第二个图中的级别来确定显示的最大深度。因此,我没有持久化平衡层次结构,而只是计算每个原始节点的新深度。

我创建了一个包含层次结构详细信息的sql表:

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整数参数的报告:

SSRS Design View

我已经在每个组的ParentID上实现了递归分组。对于每个组,我使用以下表达式进行过滤:

Ragged_Hierarchy:Ragged_Hierarchy_Depth.Value< =参数!Hierarchy_Level.Value
Balanced_Hierarchy:Balanced_Hierarchy_Depth.Value< = Parameters!Hierarchy_Level.Value

如果(Level()> 0)并且由行中的第一个文本框切换,则将每个组的可见性设置为隐藏。

SSRS Report

Ragged_Hierarchy组正确显示,隐藏级别低于所选级别。但是,在Balance_Hierarchy组中,当它们下面没有任何内容显示时,会有2-4级的展开/折叠图标。它们在扩展时不会向下钻取任何东西,但我似乎无法摆脱它们。当我将报告导出到Excel时,不需要的图标会消失 - 它只显示在他们显示的在线报告中。

有没有办法阻止这些图标出现,而无需采用昂贵的解决方法?

1 个答案:

答案 0 :(得分:1)

我现在已经解决了这个问题。应用于Balanced_Hierarchy组的过滤器也需要应用于递归父表达式。

所以而不是:

=Fields!ParentID.Value

表达式应为:

=IIf(
    (Fields!Balanced_Hierarchy_Depth.Value <= Parameters!Hierarchy_Level.Value),
    Fields!ParentID.Value,
    Nothing
)

在确定父子关系后,SSRS递归分组似乎会应用组过滤器。因此,需要在确定父子关系时应用过滤器。