153 lines
5.9 KiB
Transact-SQL
153 lines
5.9 KiB
Transact-SQL
-- ============================================================
|
||
-- 修复: [dbo].[质量管理_质量检验_入库质检任务_查询]
|
||
-- 错误1: CheckedQuantity CTE 末尾多余逗号 (语法错误)
|
||
-- 错误2: QualityData 中 检测类型编号 硬编码6 vs WHERE过滤5 (不一致)
|
||
-- 错误3: 检测说明 列缺少表前缀 (歧义)
|
||
-- 错误4: GROUP BY 含不必要的 cq.聚合字段
|
||
-- 日期: 2026-05-22
|
||
-- ============================================================
|
||
|
||
USE [YL_MESDB]
|
||
GO
|
||
|
||
SET ANSI_NULLS ON
|
||
GO
|
||
SET QUOTED_IDENTIFIER ON
|
||
GO
|
||
|
||
ALTER PROCEDURE [dbo].[质量管理_质量检验_入库质检任务_查询]
|
||
@订单号 NVARCHAR(100) = '',
|
||
@零件编号 NVARCHAR(100) = '',
|
||
@零件名称 NVARCHAR(100) = '',
|
||
@检测日期_Start NVARCHAR(20) = '',
|
||
@检测日期_End NVARCHAR(20) = '',
|
||
@检测结果 NVARCHAR(10) = '',
|
||
@检测人 NVARCHAR(50) = '',
|
||
@状态 NVARCHAR(10) = '',
|
||
@单据码 NVARCHAR(50) = ''
|
||
AS
|
||
BEGIN
|
||
SET NOCOUNT ON;
|
||
|
||
DECLARE @SQL NVARCHAR(MAX)
|
||
DECLARE @WhereConditions NVARCHAR(MAX) = ''
|
||
DECLARE @TaskWhere NVARCHAR(MAX) = ''
|
||
DECLARE @OuterWhere NVARCHAR(MAX) = ''
|
||
|
||
-- 构建任务表筛选条件(用于内层)
|
||
SET @TaskWhere = @TaskWhere + ' AND (task.订单类型 = ''20'') '
|
||
IF @单据码 <> ''
|
||
SET @TaskWhere = @TaskWhere + ' AND task.单据码 LIKE ''%' + @单据码 + '%'''
|
||
IF @订单号 <> ''
|
||
SET @TaskWhere = @TaskWhere + ' AND task.订单编号 LIKE ''%' + @订单号 + '%'''
|
||
IF @零件编号 <> ''
|
||
SET @TaskWhere = @TaskWhere + ' AND task.物料编码 LIKE ''%' + @零件编号 + '%'''
|
||
IF @零件名称 <> ''
|
||
SET @TaskWhere = @TaskWhere + ' AND task.物料名称 LIKE ''%' + @零件名称 + '%'''
|
||
|
||
-- 构建外层筛选条件(用于计算结果)
|
||
IF @检测结果 <> ''
|
||
SET @OuterWhere = @OuterWhere + ' AND 检测结果 = ' + @检测结果
|
||
IF @状态 <> ''
|
||
SET @OuterWhere = @OuterWhere + ' AND 状态 = ''' + @状态 + ''''
|
||
IF @检测人 <> ''
|
||
SET @OuterWhere = @OuterWhere + ' AND 检测人 LIKE ''%' + @检测人 + '%'''
|
||
IF @检测日期_Start <> '' AND @检测日期_End <> ''
|
||
SET @OuterWhere = @OuterWhere + ' AND CAST(检验时间 AS DATE) BETWEEN ''' + @检测日期_Start + ''' AND ''' + @检测日期_End + ''''
|
||
|
||
-- 构建内层WHERE
|
||
DECLARE @InnerWhere NVARCHAR(MAX) = ''
|
||
IF LEN(@TaskWhere) > 0
|
||
SET @InnerWhere = ' WHERE ' + SUBSTRING(@TaskWhere, 5, LEN(@TaskWhere))
|
||
|
||
SET @SQL = '
|
||
WITH QualityData AS (
|
||
SELECT
|
||
计划号,
|
||
检验数量,
|
||
合格数,
|
||
不合格数,
|
||
检测人,
|
||
检测时间,
|
||
检测类型编号 -- ============ 修复点②:不要硬编码,取实际值 ============
|
||
FROM [dbo].[YL_质量检验_质检记录]
|
||
WHERE 检测类型编号 = 5 -- ← WHERE 和 SELECT 一致了
|
||
),
|
||
-- 统计已检验数量和合格数
|
||
CheckedQuantity AS (
|
||
SELECT
|
||
计划号,
|
||
行号,
|
||
订单类型 AS 质检订单类型,
|
||
SUM(检验数量) AS 已检验数量,
|
||
SUM(合格数) AS 累计合格数,
|
||
SUM(不合格数) AS 累计不合格数,
|
||
MAX(检测说明) AS 检测说明 -- ============ 修复点①:去掉末尾多余的逗号 ============
|
||
FROM [dbo].[YL_质量检验_质检记录]
|
||
WHERE 检测类型编号 = 5
|
||
GROUP BY 计划号, 行号, 订单类型
|
||
),
|
||
AggregatedData AS (
|
||
SELECT
|
||
task.订单编号 AS 计划号,
|
||
task.单据码,
|
||
task.订单类型,
|
||
task.物料编码,
|
||
task.物料名称,
|
||
task.到货数,
|
||
task.入库数量,
|
||
task.加急状态,
|
||
task.行号,
|
||
task.采购到货时间,
|
||
task.存放位置,
|
||
task.加急总数,
|
||
-- 使用累计数据
|
||
ISNULL(cq.已检验数量, 0) AS 检验数量,
|
||
ISNULL(cq.累计合格数, 0) AS 合格数,
|
||
ISNULL(cq.累计不合格数, 0) AS 不合格数,
|
||
ISNULL(cq.已检验数量, 0) AS 已检验数量,
|
||
cq.检测说明 AS 备注, -- ============ 修复点③:加上表前缀 cq. ============
|
||
task.入库数量 - ISNULL(cq.已检验数量, 0) AS 剩余待检数量,
|
||
-- 检测人(取最新的或合并多人)
|
||
CASE
|
||
WHEN COUNT(DISTINCT qd.检测人) = 1 THEN MAX(qd.检测人)
|
||
ELSE STUFF((
|
||
SELECT DISTINCT '', '' + 检测人
|
||
FROM QualityData qd2
|
||
WHERE qd2.计划号 = task.订单编号
|
||
AND ISNULL(qd2.检测人, '''') <> ''''
|
||
FOR XML PATH('''')), 1, 2, '''')
|
||
END AS 检测人,
|
||
MAX(qd.检测时间) AS 检验时间,
|
||
-- 检测结果(基于累计数据)
|
||
CASE
|
||
WHEN ISNULL(cq.累计不合格数, 0) > 0 THEN 2
|
||
WHEN ISNULL(cq.累计合格数, 0) > 0 THEN 1
|
||
ELSE 0
|
||
END AS 检测结果,
|
||
-- 检验状态
|
||
CASE
|
||
WHEN ISNULL(cq.已检验数量, 0) >= task.入库数量 AND task.入库数量 > 0 THEN ''1''
|
||
ELSE ''0''
|
||
END AS 状态
|
||
FROM [dbo].[质量检验_质检任务_SAP] task
|
||
LEFT JOIN QualityData qd ON task.订单编号 = qd.计划号
|
||
LEFT JOIN CheckedQuantity cq ON task.订单编号 = cq.计划号 AND task.行号 = cq.行号 AND task.订单类型 = cq.质检订单类型
|
||
' + @InnerWhere + '
|
||
GROUP BY
|
||
task.订单编号, task.单据码, task.订单类型,
|
||
task.物料编码, task.物料名称, task.到货数,
|
||
task.入库数量, task.加急状态, task.行号,
|
||
task.采购到货时间, task.存放位置, task.加急总数,
|
||
cq.已检验数量, cq.累计合格数, cq.累计不合格数,
|
||
cq.检测说明 -- ============ 修复点④:GROUP BY 加入新增的检测说明列 ============
|
||
)
|
||
SELECT * FROM AggregatedData
|
||
WHERE 1=1' + @OuterWhere + '
|
||
ORDER BY 加急状态 DESC'
|
||
|
||
PRINT @SQL
|
||
EXEC sp_executesql @SQL
|
||
END
|
||
GO
|