docs: 今日工作汇报 + 入库质检SP修复(4个bug) — 甲方34项需求分类/优先级/风险/明日计划
This commit is contained in:
152
fix_质量管理_入库质检任务_查询.sql
Normal file
152
fix_质量管理_入库质检任务_查询.sql
Normal file
@@ -0,0 +1,152 @@
|
||||
-- ============================================================
|
||||
-- 修复: [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
|
||||
Reference in New Issue
Block a user