323 lines
14 KiB
Transact-SQL
323 lines
14 KiB
Transact-SQL
-- 库存查询需求量性能优化:直连基础表判断订单完成状态,减少重视图展开
|
|
-- 修改人:Ld 修改时间:2026-07-14 16:35:00;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_零件基本件_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_零件明细表_基本件'))
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX IX_Ld_零件基本件_物料组件_20260714
|
|
ON dbo.PDM_零件明细表_基本件 (物料流水号, 组件流水号)
|
|
INCLUDE (零件数量, 已领数量);
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_零件标准外购_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_零件明细表_标准件和外购件'))
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX IX_Ld_零件标准外购_物料组件_20260714
|
|
ON dbo.PDM_零件明细表_标准件和外购件 (物料流水号, 组件流水号)
|
|
INCLUDE (零件数量, 已领数量);
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_临时领料_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_装配执行_临时领料明细'))
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX IX_Ld_临时领料_物料组件_20260714
|
|
ON dbo.车间装配管理_装配执行_临时领料明细 (物料流水号, 组件流水号)
|
|
INCLUDE (实领数);
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_基本件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_基本件_20260714
|
|
ON dbo.车间装配管理_领料单明细 (基本件流水号)
|
|
INCLUDE (已领数量);
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_标准外购_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_标准外购_20260714
|
|
ON dbo.车间装配管理_领料单明细 (标准件和外购件流水号)
|
|
INCLUDE (已领数量);
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细'))
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX IX_Ld_领料明细_物料组件_20260714
|
|
ON dbo.车间装配管理_领料单明细 (物料流水号, 组件流水号)
|
|
INCLUDE (已领数量);
|
|
END;
|
|
GO
|
|
|
|
ALTER VIEW dbo.物料管理_需求量_视图
|
|
AS
|
|
WITH 组件订单 AS
|
|
(
|
|
SELECT
|
|
c.组件流水号,
|
|
c.是否分配,
|
|
o.订单类型,
|
|
o.是否提交,
|
|
p.是否启用
|
|
FROM dbo.PDM_组件名称 c
|
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
|
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
|
|
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
|
|
),
|
|
需求 AS
|
|
(
|
|
SELECT b.物料流水号, SUM(ISNULL(b.零件数量, 0)) AS 需求量
|
|
FROM dbo.PDM_零件明细表_基本件 b
|
|
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
|
WHERE co.是否分配 = 1
|
|
AND co.订单类型 <> 3
|
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 直接用基础字段排除已完成订单
|
|
GROUP BY b.物料流水号
|
|
|
|
UNION ALL
|
|
|
|
SELECT s.物料流水号, SUM(ISNULL(s.零件数量, 0)) AS 需求量
|
|
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
|
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
|
WHERE co.是否分配 = 1
|
|
AND co.订单类型 <> 3
|
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 直接用基础字段排除已完成订单
|
|
GROUP BY s.物料流水号
|
|
|
|
UNION ALL
|
|
|
|
SELECT t.物料流水号, SUM(ISNULL(t.实领数, 0)) AS 需求量
|
|
FROM dbo.车间装配管理_装配执行_临时领料明细 t
|
|
LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
|
|
WHERE t.物料流水号 IS NOT NULL
|
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料同口径排除已完成订单
|
|
GROUP BY t.物料流水号
|
|
),
|
|
需求汇总 AS
|
|
(
|
|
SELECT 物料流水号, SUM(需求量) AS 需求量
|
|
FROM 需求
|
|
GROUP BY 物料流水号
|
|
),
|
|
已领 AS
|
|
(
|
|
SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
|
FROM dbo.车间装配管理_领料单明细 l
|
|
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
|
|
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
|
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 扣减已领数时同步排除已完成订单
|
|
GROUP BY b.物料流水号
|
|
|
|
UNION ALL
|
|
|
|
SELECT s.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
|
FROM dbo.车间装配管理_领料单明细 l
|
|
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
|
|
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
|
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 扣减已领数时同步排除已完成订单
|
|
GROUP BY s.物料流水号
|
|
|
|
UNION ALL
|
|
|
|
SELECT l.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
|
FROM dbo.车间装配管理_领料单明细 l
|
|
LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
|
|
WHERE l.物料流水号 IS NOT NULL
|
|
AND ISNULL(l.物料流水号, 0) <> 0
|
|
AND ISNULL(l.基本件流水号, 0) = 0
|
|
AND ISNULL(l.标准件和外购件流水号, 0) = 0
|
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件扣减已领数时同步排除已完成订单
|
|
GROUP BY l.物料流水号
|
|
),
|
|
已领汇总 AS
|
|
(
|
|
SELECT 物料流水号, SUM(已领数) AS 已领数
|
|
FROM 已领
|
|
GROUP BY 物料流水号
|
|
)
|
|
SELECT
|
|
d.物料流水号,
|
|
CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 需求量
|
|
FROM 需求汇总 d
|
|
LEFT JOIN 已领汇总 l ON d.物料流水号 = l.物料流水号;
|
|
GO
|
|
|
|
ALTER PROCEDURE [dbo].[物料管理_需求量_更新]
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
DELETE FROM dbo.物料管理_需求量;
|
|
|
|
INSERT INTO dbo.物料管理_需求量
|
|
SELECT 物料流水号, 需求量
|
|
FROM dbo.物料管理_需求量_视图
|
|
WHERE 需求量 > 0;
|
|
END;
|
|
GO
|
|
|
|
ALTER PROCEDURE [dbo].[仓储管理_报缺补货_需求量明细_查询]
|
|
@物料流水号 INT = 15448
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
;WITH 组件订单 AS
|
|
(
|
|
SELECT
|
|
c.组件流水号,
|
|
o.订单编号,
|
|
c.是否分配,
|
|
o.订单类型,
|
|
o.是否提交,
|
|
p.是否启用,
|
|
ISNULL(k.简称, '') AS 简称
|
|
FROM dbo.PDM_组件名称 c
|
|
INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
|
|
INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
|
|
INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
|
|
LEFT JOIN dbo.客户关系管理系统_客户名称 k ON p.客户流水号 = k.客户流水号
|
|
),
|
|
需求明细 AS
|
|
(
|
|
SELECT
|
|
co.订单编号,
|
|
b.组件流水号,
|
|
b.物料流水号,
|
|
SUM(ISNULL(b.零件数量, 0)) AS 需求量,
|
|
N'生产订单需求' AS 来源
|
|
FROM dbo.PDM_零件明细表_基本件 b
|
|
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
|
WHERE co.是否分配 = 1
|
|
AND co.订单类型 <> 3
|
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单
|
|
AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号)
|
|
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
|
|
|
|
UNION ALL
|
|
|
|
SELECT
|
|
co.订单编号,
|
|
s.组件流水号,
|
|
s.物料流水号,
|
|
SUM(ISNULL(s.零件数量, 0)) AS 需求量,
|
|
N'生产订单需求' AS 来源
|
|
FROM dbo.PDM_零件明细表_标准件和外购件 s
|
|
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
|
WHERE co.是否分配 = 1
|
|
AND co.订单类型 <> 3
|
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单
|
|
AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号)
|
|
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
|
|
|
|
UNION ALL
|
|
|
|
SELECT
|
|
co.订单编号,
|
|
t.组件流水号,
|
|
t.物料流水号,
|
|
SUM(ISNULL(t.实领数, 0)) AS 需求量,
|
|
N'临时领料需求' AS 来源
|
|
FROM dbo.车间装配管理_装配执行_临时领料明细 t
|
|
LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
|
|
WHERE t.物料流水号 IS NOT NULL
|
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料明细不显示已完成订单
|
|
AND (@物料流水号 IS NULL OR t.物料流水号 = @物料流水号)
|
|
GROUP BY co.订单编号, t.组件流水号, t.物料流水号
|
|
),
|
|
已领明细 AS
|
|
(
|
|
SELECT
|
|
co.订单编号,
|
|
b.组件流水号,
|
|
b.物料流水号,
|
|
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
|
FROM dbo.车间装配管理_领料单明细 l
|
|
INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
|
|
INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
|
|
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单
|
|
AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号)
|
|
GROUP BY co.订单编号, b.组件流水号, b.物料流水号
|
|
|
|
UNION ALL
|
|
|
|
SELECT
|
|
co.订单编号,
|
|
s.组件流水号,
|
|
s.物料流水号,
|
|
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
|
FROM dbo.车间装配管理_领料单明细 l
|
|
INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
|
|
INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
|
|
WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单
|
|
AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号)
|
|
GROUP BY co.订单编号, s.组件流水号, s.物料流水号
|
|
|
|
UNION ALL
|
|
|
|
SELECT
|
|
co.订单编号,
|
|
l.组件流水号,
|
|
l.物料流水号,
|
|
SUM(ISNULL(l.已领数量, 0)) AS 已领数
|
|
FROM dbo.车间装配管理_领料单明细 l
|
|
LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
|
|
WHERE l.物料流水号 IS NOT NULL
|
|
AND ISNULL(l.物料流水号, 0) <> 0
|
|
AND ISNULL(l.基本件流水号, 0) = 0
|
|
AND ISNULL(l.标准件和外购件流水号, 0) = 0
|
|
AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件明细扣减已领数时同步排除已完成订单
|
|
AND (@物料流水号 IS NULL OR l.物料流水号 = @物料流水号)
|
|
GROUP BY co.订单编号, l.组件流水号, l.物料流水号
|
|
),
|
|
已领汇总 AS
|
|
(
|
|
SELECT 订单编号, 组件流水号, 物料流水号, SUM(已领数) AS 已领数
|
|
FROM 已领明细
|
|
GROUP BY 订单编号, 组件流水号, 物料流水号
|
|
),
|
|
明细 AS
|
|
(
|
|
SELECT
|
|
d.订单编号,
|
|
d.组件流水号,
|
|
d.物料流水号,
|
|
d.需求量,
|
|
ISNULL(l.已领数, 0) AS 已领数,
|
|
CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 最终需求量,
|
|
d.来源
|
|
FROM 需求明细 d
|
|
LEFT JOIN 已领汇总 l
|
|
ON d.物料流水号 = l.物料流水号
|
|
AND d.组件流水号 = l.组件流水号
|
|
AND ISNULL(d.订单编号, '') = ISNULL(l.订单编号, '')
|
|
)
|
|
SELECT
|
|
d.订单编号,
|
|
d.组件流水号,
|
|
d.物料流水号,
|
|
d.需求量,
|
|
d.已领数,
|
|
d.最终需求量,
|
|
ISNULL(co.简称, '') AS 简称,
|
|
d.来源
|
|
FROM 明细 d
|
|
LEFT JOIN 组件订单 co ON d.组件流水号 = co.组件流水号
|
|
ORDER BY d.订单编号, d.组件流水号, d.来源;
|
|
|
|
;WITH 汇总 AS
|
|
(
|
|
SELECT 物料流水号, 需求量
|
|
FROM dbo.物料管理_需求量_视图
|
|
WHERE (@物料流水号 IS NULL OR 物料流水号 = @物料流水号)
|
|
)
|
|
SELECT
|
|
物料流水号,
|
|
需求量 AS 总需求量,
|
|
0 AS 总已领数,
|
|
需求量 AS 总最终需求量
|
|
FROM 汇总
|
|
ORDER BY 物料流水号;
|
|
END;
|
|
GO
|