如何使用分组和分页符来创建 2-sided SSRS 徽章报告? (微软 SQL Server 2012 报表生成器)
How can I use grouping and page breaks to create a 2-sided SSRS badge report? (Microsoft SQL Server 2012 Report Builder)
我正在为 Avery 5392 徽章库存(每页 6 个)设计一个 SSRS 徽章报告,该报告还将在他们的徽章背面打印每个佩戴者的记录 ID。
我在我的 SELECT 语句中设置了 RowNumber 和 RowMod 列,这样我就可以过滤到我的设计元素中,每列只有 3 行数据,并控制哪些行在左侧或右侧报告元素,分别。我还将 PageNumber 设置为分页符的可能分组选项。
请将此虚拟 table 视为我实际使用的数据的代理:
CREATE TABLE #Badges (ID INT PRIMARY KEY, Name VARCHAR(50))
INSERT INTO #Badges VALUES
(100001, 'Anna')
, (100002, 'Bart')
, (100003, 'Cathy')
, (100004, 'Daniel')
, (100005, 'Ericka')
, (100006, 'Fred')
, (100007, 'Gwen')
, (100008, 'Harry')
, (100009, 'Idita')
, (100010, 'Joshi')
, (100011, 'Katie')
, (100012, 'Leo')
, (100013, 'Manuela')
, (100014, 'Nando')
, (100015, 'Olga')
, (100016, 'Park')
, (100017, 'Quang')
, (100018, 'Rhys')
, (100019, 'Sarina')
, (100020, 'Theo')
, (100021, 'Udeyume')
, (100022, 'Victor')
, (100023, 'Wynona')
, (100024, 'Xavier');
SELECT ((ROW_NUMBER() OVER (ORDER BY a.RowNumber) + 5) / 6) AS PageNumber
, a.*
FROM (SELECT ROW_NUMBER() OVER (ORDER BY b.Name) AS RowNumber
, ROW_NUMBER() OVER (ORDER BY b.Name) % 6 AS RowMod
, b.*
FROM #Badges AS b) AS a
DROP TABLE #Badges
我有一个 4 方形的独立报告元素(目前使用“列表”),看起来有点像这样...
|清单 1 |清单 2 |
|清单 4 |清单 3 |
我需要我的报表元素在左列(列表 1)中显示 名称 的前 3 行,然后是下一个右列中的 3 行 名称 (列表 2)。然后,在接下来的页面上,我需要使用相同的数据翻转 Mod 方向,以在 right[=] 中显示 ID 的前 3 行53=] 列(List 3),然后是 left 列中 ID 的下 3 行(列表 4)。
第 1 页看起来像这样...
Col 1 (List 1)
Col 2 (List 2)
Anna
Daniel
Bart
Ericka
Cathy
Fred
...第 2 页看起来像这样...
Col 1 (List 4)
Col 2 (List 3)
100004
100001
100005
100002
100006
100003
然后我想在第 3 页重复该过程,依此类推。
我已经获取了您的示例数据并修改了查询以提供我在需要时会使用的数据。它可能不完全适合您的设置,但应该足够接近以进行修改。
我基本上是从数据集查询中输出页码以及行号和列号,然后我们可以在 Matrix 控件中使用它们。
这是修改后的查询..
DECLARE @Badges TABLE(ID INT PRIMARY KEY, Name VARCHAR(50))
INSERT INTO @Badges VALUES
(100001, 'Anna')
, (100002, 'Bart')
, (100003, 'Cathy')
, (100004, 'Daniel')
, (100005, 'Ericka')
, (100006, 'Fred')
, (100007, 'Gwen')
, (100008, 'Harry')
, (100009, 'Idita')
, (100010, 'Joshi')
, (100011, 'Katie')
, (100012, 'Leo')
, (100013, 'Manuela')
, (100014, 'Nando')
, (100015, 'Olga')
, (100016, 'Park')
, (100017, 'Quang')
, (100018, 'Rhys')
, (100019, 'Sarina')
, (100020, 'Theo')
, (100021, 'Udeyume')
, (100022, 'Victor')
, (100023, 'Wynona')
, (100024, 'Xavier');
WITH t (rN, PageN, RowN, ColN, ID, Name)
AS (
SELECT
ROW_NUMBER() OVER (ORDER BY b.Name) AS rN
, ((ROW_NUMBER() OVER (ORDER BY b.Name) - 1) / 6) +1 AS PageN
, ((ROW_NUMBER() OVER (ORDER BY b.Name) - 1) % 3) + 1 AS RowN
, ((ROW_NUMBER() OVER (ORDER BY b.Name) - 1) /3) % 2 AS ColN
, b.*
FROM @Badges AS b
)
SELECT PageN, 1 AS OddEven, RowN, ColN, [Name] as Caption from t
UNION
SELECT PageN, 2, RowN, CASE ColN WHEN 1 THEN 0 ELSE 1 END, CAST([ID] as varchar(50)) as Caption from t ;
这给出了以下结果(未全部显示)
我创建了一个新报表并添加了一个矩阵。我将 RowN 字段拖到行占位符,将 ColN 拖到列占位符,将标题拖到数据占位符。然后我添加了一个按 PageN and OddEven 分组的 parent 组。在“PageN”行组的组属性中,我将排序设置为 PageN 和 OddEven,并在每个实例之间设置分页符。
为了便于说明,我在其中留下了一些不需要的行和列,我还在列组(灰色单元格)中添加了一列作为填充,这可能对对齐内容很有用。
最终输出如下所示
等等...
删除多余的行和列后,所有页面都应出现在每一页的相同位置。
我正在为 Avery 5392 徽章库存(每页 6 个)设计一个 SSRS 徽章报告,该报告还将在他们的徽章背面打印每个佩戴者的记录 ID。
我在我的 SELECT 语句中设置了 RowNumber 和 RowMod 列,这样我就可以过滤到我的设计元素中,每列只有 3 行数据,并控制哪些行在左侧或右侧报告元素,分别。我还将 PageNumber 设置为分页符的可能分组选项。
请将此虚拟 table 视为我实际使用的数据的代理:
CREATE TABLE #Badges (ID INT PRIMARY KEY, Name VARCHAR(50))
INSERT INTO #Badges VALUES
(100001, 'Anna')
, (100002, 'Bart')
, (100003, 'Cathy')
, (100004, 'Daniel')
, (100005, 'Ericka')
, (100006, 'Fred')
, (100007, 'Gwen')
, (100008, 'Harry')
, (100009, 'Idita')
, (100010, 'Joshi')
, (100011, 'Katie')
, (100012, 'Leo')
, (100013, 'Manuela')
, (100014, 'Nando')
, (100015, 'Olga')
, (100016, 'Park')
, (100017, 'Quang')
, (100018, 'Rhys')
, (100019, 'Sarina')
, (100020, 'Theo')
, (100021, 'Udeyume')
, (100022, 'Victor')
, (100023, 'Wynona')
, (100024, 'Xavier');
SELECT ((ROW_NUMBER() OVER (ORDER BY a.RowNumber) + 5) / 6) AS PageNumber
, a.*
FROM (SELECT ROW_NUMBER() OVER (ORDER BY b.Name) AS RowNumber
, ROW_NUMBER() OVER (ORDER BY b.Name) % 6 AS RowMod
, b.*
FROM #Badges AS b) AS a
DROP TABLE #Badges
我有一个 4 方形的独立报告元素(目前使用“列表”),看起来有点像这样...
|清单 1 |清单 2 |
|清单 4 |清单 3 |
我需要我的报表元素在左列(列表 1)中显示 名称 的前 3 行,然后是下一个右列中的 3 行 名称 (列表 2)。然后,在接下来的页面上,我需要使用相同的数据翻转 Mod 方向,以在 right[=] 中显示 ID 的前 3 行53=] 列(List 3),然后是 left 列中 ID 的下 3 行(列表 4)。
第 1 页看起来像这样...
Col 1 (List 1) | Col 2 (List 2) |
---|---|
Anna | Daniel |
Bart | Ericka |
Cathy | Fred |
...第 2 页看起来像这样...
Col 1 (List 4) | Col 2 (List 3) |
---|---|
100004 | 100001 |
100005 | 100002 |
100006 | 100003 |
然后我想在第 3 页重复该过程,依此类推。
我已经获取了您的示例数据并修改了查询以提供我在需要时会使用的数据。它可能不完全适合您的设置,但应该足够接近以进行修改。
我基本上是从数据集查询中输出页码以及行号和列号,然后我们可以在 Matrix 控件中使用它们。
这是修改后的查询..
DECLARE @Badges TABLE(ID INT PRIMARY KEY, Name VARCHAR(50))
INSERT INTO @Badges VALUES
(100001, 'Anna')
, (100002, 'Bart')
, (100003, 'Cathy')
, (100004, 'Daniel')
, (100005, 'Ericka')
, (100006, 'Fred')
, (100007, 'Gwen')
, (100008, 'Harry')
, (100009, 'Idita')
, (100010, 'Joshi')
, (100011, 'Katie')
, (100012, 'Leo')
, (100013, 'Manuela')
, (100014, 'Nando')
, (100015, 'Olga')
, (100016, 'Park')
, (100017, 'Quang')
, (100018, 'Rhys')
, (100019, 'Sarina')
, (100020, 'Theo')
, (100021, 'Udeyume')
, (100022, 'Victor')
, (100023, 'Wynona')
, (100024, 'Xavier');
WITH t (rN, PageN, RowN, ColN, ID, Name)
AS (
SELECT
ROW_NUMBER() OVER (ORDER BY b.Name) AS rN
, ((ROW_NUMBER() OVER (ORDER BY b.Name) - 1) / 6) +1 AS PageN
, ((ROW_NUMBER() OVER (ORDER BY b.Name) - 1) % 3) + 1 AS RowN
, ((ROW_NUMBER() OVER (ORDER BY b.Name) - 1) /3) % 2 AS ColN
, b.*
FROM @Badges AS b
)
SELECT PageN, 1 AS OddEven, RowN, ColN, [Name] as Caption from t
UNION
SELECT PageN, 2, RowN, CASE ColN WHEN 1 THEN 0 ELSE 1 END, CAST([ID] as varchar(50)) as Caption from t ;
这给出了以下结果(未全部显示)
我创建了一个新报表并添加了一个矩阵。我将 RowN 字段拖到行占位符,将 ColN 拖到列占位符,将标题拖到数据占位符。然后我添加了一个按 PageN and OddEven 分组的 parent 组。在“PageN”行组的组属性中,我将排序设置为 PageN 和 OddEven,并在每个实例之间设置分页符。
为了便于说明,我在其中留下了一些不需要的行和列,我还在列组(灰色单元格)中添加了一列作为填充,这可能对对齐内容很有用。
最终输出如下所示
等等...
删除多余的行和列后,所有页面都应出现在每一页的相同位置。