You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SSRS报表中无需排序整列高亮重复物料编号?

解决SSRS BOM报表中重复物料编号高亮问题

问题背景

现有一款查看物料清单(BOM)的SSRS报表,展示涉及的物料、所属BOM及其他相关信息。需求如下:

  • 无需按物料编号列排序,需高亮该列中所有重复值(即使其他列信息不同,只要物料编号重复就需高亮,例如物料编号"001468")
  • 报表必须按Level层级排序(先显示所有顶层物料,再依次显示下层物料),因此无法使用SSRS的Previous函数
  • 重复项需设置为加粗红色显示,支持多个重复项的场景

现有递归CTE查询代码

2022年5月8日补充的当前使用的SQL查询:

WITH CTERBOM AS  
(
    SELECT PBL.[Production BOM No_], PBL.[Version Code], PBL.[No_], PBL.[Quantity per], 1 AS LVL
    FROM [DataBaseName$Production BOM Line] PBL
    LEFT JOIN [DataBaseName$Production BOM Header Extra] PBHEX ON PBHEX.[No_] = PBL.[Production BOM No_]
    WHERE PBL.[Production BOM No_] = '008722' AND PBHEX.[Active Version No_] = PBL.[Version Code]

    UNION ALL

    SELECT PBL2.[Production BOM No_], PBL2.[Version Code], PBL2.[No_], PBL2.[Quantity per], LVL + 1
    FROM [DataBaseName$Production BOM Line] PBL2
    INNER JOIN CTERBOM ON CTERBOM.[No_] = PBL2.[Production BOM No_]
)

SELECT
CTERBOM.[LVL]                           AS [Level],
CTERBOM.[No_]                           AS [Item No.],
CTERBOM.[Production BOM No_]                    AS [Production BOM No.],
CTERBOM.[Quantity per]                      AS [Qty. Per]

FROM CTERBOM
LEFT JOIN [DataBaseName$Production BOM Header Extra] PBHEX ON PBHEX.[No_] = CTERBOM.[Production BOM No_]

GROUP BY
CTERBOM.[LVL],
CTERBOM.[Production BOM No_],
CTERBOM.[No_],
CTERBOM.[Quantity per]

ORDER BY
CTERBOM.[LVL],
CTERBOM.[Production BOM No_],
CTERBOM.[No_]

解决方案

方法一:在SQL查询中添加重复标记字段

修改现有查询,新增统计物料编号出现次数的子查询,并添加标记字段,后续在SSRS中直接基于该字段设置格式:

WITH CTERBOM AS  
(
    SELECT PBL.[Production BOM No_], PBL.[Version Code], PBL.[No_], PBL.[Quantity per], 1 AS LVL
    FROM [DataBaseName$Production BOM Line] PBL
    LEFT JOIN [DataBaseName$Production BOM Header Extra] PBHEX ON PBHEX.[No_] = PBL.[Production BOM No_]
    WHERE PBL.[Production BOM No_] = '008722' AND PBHEX.[Active Version No_] = PBL.[Version Code]

    UNION ALL

    SELECT PBL2.[Production BOM No_], PBL2.[Version Code], PBL2.[No_], PBL2.[Quantity per], LVL + 1
    FROM [DataBaseName$Production BOM Line] PBL2
    INNER JOIN CTERBOM ON CTERBOM.[No_] = PBL2.[Production BOM No_]
),
-- 统计每个物料编号的出现次数
ItemOccurrences AS (
    SELECT [No_], COUNT(*) AS Count
    FROM CTERBOM
    GROUP BY [No_]
)

SELECT
CTERBOM.[LVL]                           AS [Level],
CTERBOM.[No_]                           AS [Item No.],
CTERBOM.[Production BOM No_]            AS [Production BOM No.],
CTERBOM.[Quantity per]                  AS [Qty. Per],
-- 标记是否为重复项
CASE WHEN ItemOccurrences.Count > 1 THEN 1 ELSE 0 END AS IsDuplicate

FROM CTERBOM
LEFT JOIN [DataBaseName$Production BOM Header Extra] PBHEX ON PBHEX.[No_] = CTERBOM.[Production BOM No_]
INNER JOIN ItemOccurrences ON CTERBOM.[No_] = ItemOccurrences.[No_]

GROUP BY
CTERBOM.[LVL],
CTERBOM.[Production BOM No_],
CTERBOM.[No_],
CTERBOM.[Quantity per],
ItemOccurrences.Count

ORDER BY
CTERBOM.[LVL],
CTERBOM.[Production BOM No_],
CTERBOM.[No_]

SSRS格式设置

选中报表中[Item No.]对应的文本框,分别设置以下表达式:

  • 字体颜色:=IIF(Fields!IsDuplicate.Value = 1, "Red", "Black")
  • 字体粗细:=IIF(Fields!IsDuplicate.Value = 1, "Bold", "Normal")

方法二:直接在SSRS中使用聚合函数判断

无需修改SQL查询,直接在SSRS文本框的格式表达式中,通过聚合函数统计当前物料编号在整个数据集内的出现次数:
选中[Item No.]文本框,设置:

  • 字体颜色:=IIF(Count(Fields!Item_No.Value, "你的数据集名称") > 1, "Red", "Black")
  • 字体粗细:=IIF(Count(Fields!Item_No.Value, "你的数据集名称") > 1, "Bold", "Normal")

注意:将表达式中的"你的数据集名称"替换为报表实际使用的数据集名称,该方式不受报表排序规则影响,能准确识别所有重复的物料编号。


内容的提问来源于stack exchange,提问作者adhocEY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:15:36