Files
yl/MES_Manage_View_V20/fix_质量管理_入库质检任务_查询.sql
2026-05-23 14:07:11 +08:00

153 lines
5.9 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- 修复: [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