我有一个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并以此方式存储数据来生成表?还是需要对我的数据库架构进行修改?
答案 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);
返回的数据将如下所示:
然后,您可以创建一个报告,根据上面的查询添加数据源和数据集。然后,您可以将表添加到报表中,它只需要具有一列。在该列中显示数据集的字段FOLDER
。
这样做,更改 Details 组(在“行组”下)的属性:
PATH
字段作为 Group表达式 PARENT
字段添加为递归父级 如果我们看一下结果,那看起来还不太好:
要显示一些缩进的子代,我们可以在FOLDER TextBox的 Padding Left 属性的表达式中使用Level
函数(取自Microsoft的示例):
=CStr(2 + (Level()*10)) + "pt"
现在,我想我们到达了想去的地方: