如何使用分组和分页符来创建双面 s-s-rS 徽章报告? (Microsoft SQL Server 2012 报表生成器)

Posted

技术标签:

【中文标题】如何使用分组和分页符来创建双面 s-s-rS 徽章报告? (Microsoft SQL Server 2012 报表生成器)【英文标题】:How can I use grouping and page breaks to create a 2-sided s-s-rS badge report? (Microsoft SQL Server 2012 Report Builder) 【发布时间】:2021-10-22 04:01:31 【问题描述】:

我正在为 Avery 5392 徽章库存(每页 6 个)设计 s-s-rS 徽章报告,该报告还将在徽章背面打印每位佩戴者的记录 ID。

我在我的 SELECT 语句中设置了 RowNumber 和 RowMod 列,以便我可以将每列仅 3 行数据过滤到我的设计元素中,并分别控制左侧或右侧报表元素中的行。我还将 PageNumber 设置为可能的分页符分组选项。

请将此虚拟表视为我实际使用的数据的代理:

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 |

我需要我的报表元素在左列(List 1)中显示前 3 行 Name,然后是接下来的 3 行 Name 在右栏中(列表 2)。然后,在下一页上,我需要使用相同的数据翻转 Mod 方向以在 right 列中显示 ID 的前 3 行(List 3 ),然后是 left 列中接下来的 3 行 IDList 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 页重复该过程,依此类推。

【问题讨论】:

添加一个按前/后分组的外部组,并在组属性中设置分页符“之间”。 每个佩戴者没有两行数据可以识别为“前数据”和“后数据”。每人只有一排。我对所有 4 个数据区域使用相同的数据集。您是否建议我使用单独的数据集? 如果您共享数据集输出和当前报告设计的样本,可能会更容易。这可能意味着稍微重构数据,如果不看更多就很难说清楚。我可能会选择使用单个矩阵而不是两个表,但是获得,您这样做可能有一个很好的理由,在我看到数据和设计之前是不可见的。 我愿意重构数据,但遗憾的是我无法分享这些信息的样本。使用单独的矩阵是因为这是我从研究中发现的唯一方法,它应该允许第二页信息显示与前一页相同的人,并翻转列。使用这种技术使用单个矩阵会抱怨内部成员。可能只是这必须以与我正在尝试的方法完全不同的方式完成,或者这是不可能的。 您不需要分享您的真实信息样本,只要它具有相同的结构即可。只需将名称、头衔或其他任何内容更改为随机的东西。如果您提供 4 页的数据并根据您的样本勾勒出报告中的显示方式,则“可能”有一种更简单的方法来处理整个事情。现在是晚上 10 点之后,所以我暂时不会再接这个了,但如果你没有进一步了解,请发布示例虚拟数据等,我会看看我能做什么 【参考方案1】:

我已经获取了您的示例数据并重新编写了查询以提供我在需要时会使用的数据。它可能不完全适合您的设置,但应该足够接近以进行修改。

我基本上从数据集查询中输出页码以及行号和列号,然后我们可以在矩阵控件中使用它们。

这是修改后的查询..

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 拖到 col 占位符,将 Caption 拖到数据占位符。然后,我添加了一个按 PageN OddEven 分组的父组。在“PageN”行组的组属性中,我将排序设置为 PageN 和 OddEven,并在每个实例之间设置一个分页符。

为了说明,我留下了一些不需要的行和列,我还在列组(灰色单元格)内添加了一个列作为填充,这可能对对齐有用。

报告设计如下所示

最终的输出是这样的

第 1 页:

第 2 页:

第 3 页:

第 4 页:

等等……

删除多余的行和列后,所有页面都应出现在每个页面上的相同位置。

【讨论】:

当您说“然后我添加了一个按 PageN OddEven 分组的父组。在“PageN”行组的组属性中,我将排序设置为 PageN和 OddEven 并在每个实例之间设置一个分页符。”您的意思是您有 1 个使用 PageN(在 RowN 上)的父行组,然后在该组的排序中,您添加了 2 列进行排序:PageN 和“然后按”OddEven?或者您是否使用表达式创建了某种组合?你能澄清一下吗? “PageN”行组,按PageNOddEven 分组。它还按PageNOddEven 排序。如果这没有帮助,请告诉我,我将在今晚晚些时候发布 RowGroup 属性的屏幕截图。 由于ID需要打印在佩戴者徽章的背面,因此需要在佩戴者姓名后面的页面上的相反栏中。请参阅您上一个屏幕截图中的 Gwen。她的名字在第 3 页的左侧。她的 ID 是 100007,所以它应该在第 4 页的右侧而不是左侧。如果它像第 3 页上的她的名字一样留在左侧,那么它最终会出现在第 4 页上 Joshi 徽章的背面。 简单修复,只需将最终SQL语句中的ColN更改为CASE ColN WHEN 1 THEN 0 ELSE 1 END即可颠倒ID数据列的顺序。我已经更新了答案以匹配新的查询输出

以上是关于如何使用分组和分页符来创建双面 s-s-rS 徽章报告? (Microsoft SQL Server 2012 报表生成器)的主要内容,如果未能解决你的问题,请参考以下文章

插入表格会在 s-s-rS 报告中创建分页符

TCPDF:HTML 表格和分页符

从 \bibliography 中删除参考书目标题和分页符

如何从Google表格下载具有特定边距和分页符的PDF文件?

在 s-s-rS 报表中插入分页符

rdlc 分页操作和分页统计