在SSRS 2016中通过字符串定界进行递归层次结构分组?

时间:2018-07-20 17:08:56

标签: sql-server reporting-services ssrs-2008 hierarchy sqlclr

我有一个SQL Server数据库作为我的数据源,我的行包含一个用\分隔的路径

例如:

“ \ Foo \ Bar”

是一个包含

的文件夹

“ \ Foo \ Bar \ Baz”。

我的数据库包含一个存储绝对路径的列,我希望有一个基于文件夹对子文件夹的所有权的递归层次结构表。

我的数据存储如下:

+--------------+
| PATH         |
+--------------+
| \Foo         |
+--------------+
| \Foo\Bar     |
+--------------+
| \Foo\Bar\Baz |
+--------------+
| \Foo\Bar\Qux |
+--------------+
| \Foo2        |
+--------------+

我想这样代表它

+----------+
| PATH     |
+----------+
| \Foo     |
+----------+
|   \Bar   |
+----------+
|     \Baz |
+----------+
|     \Qux |
+----------+
| \Foo2    |
+----------+

我已经为该过程编写了一些有用的CLR存储过程:

一个允许我获取给定父路径的子级(例如,传递“ \ Foo \ Bar”返回“ \ Foo \ Bar \ Baz”和“ \ Foo \ Bar \ Qux”行)

另一个允许我提取路径的最底层名称(例如,从“ \ Foo \ Bar \ Baz”中提取“ \ Baz”)。

是否可以使用SSRS Recursive Hierarchy Grouping Structure并以此方式存储数据来生成表?还是需要对我的数据库架构进行修改?

2 个答案:

答案 0 :(得分:0)

我知道了。对于担任我职务的任何人,这是您的工作:

使用所需的值创建一个表。

在您的路径字段(或具有分层定界符的等效字符串)上添加行组。

右键单击新行组,然后选择“组属性”。

添加一个新的“组表达式”,即“层次结构”字段上的“组”。

转到高级标签。

单击递归父级的表达式(fx)按钮。

在这里,您将使用正则表达式来表示什么是父对象。例如,我的表情是:

=System.Text.RegularExpressions.Regex.Match(Fields!Qualifier.Value, ".*(?=\\\\)").Value

其中“ Qualifier”是字段名称,而我的定界符是\字符。

要使其适应您的用法,请将粗体字段名称更改为您的名称,然后将正则表达式父匹配模式更改为适合您的模式的

= System.Text.RegularExpressions.Regex.Match(字段!限定符。值,“ 。*(?= \\)”)。值

我的正则表达式示例为here,它实际上是完整路径减去最后一个元素和定界符。

如果有人对此有疑问,请随时提问。这是一个巨大的痛苦,因为没有类似的文献记录。

答案 1 :(得分:0)

要能够使用递归分组功能,您将需要一个父子层次结构,该层次可用于将父级与其子级连接在一起。例如,您可以基于表使用类似这样的查询,该查询还将检索最后一个文件夹名称和父文件夹的路径(flen是文件夹名称的长度):

SELECT [PATH]
  , RIGHT([PATH], p.flen) AS FOLDER
  , LEFT([PATH], LEN([PATH]) - p.flen) AS [PARENT]
FROM FolderTable
  CROSS APPLY (VALUES(CHARINDEX('\',REVERSE([PATH])))) p (flen);

返回的数据将如下所示:

The Dataset

然后,您可以创建一个报告,根据上面的查询添加数据源和数据集。然后,您可以将表添加到报表中,它只需要具有一列。在该列中显示数据集的字段FOLDER

这样做,更改 Details 组(在“行组”下)的属性:

  • General 属性下,添加PATH字段作为 Group表达式
  • 高级属性下,将PARENT字段添加为递归父级

如果我们看一下结果,那看起来还不太好:

Result Without Padding

要显示一些缩进的子代,我们可以在FOLDER TextBox的 Padding Left 属性的表达式中使用Level函数(取自Microsoft的示例):

=CStr(2 + (Level()*10)) + "pt"

现在,我想我们到达了想去的地方:

Formatted Result