Files
GateDge2023_ljy/07.珠海英搏尔/MES获取物料清单合并数据.sql
PastSaid 9725ab5376 a
2024-12-05 15:39:19 +08:00

115 lines
5.0 KiB
Transact-SQL

--exec rb_GetMergePPBOMKeyMartQty 'WO2407100313',1,1,1
DECLARE @MO varchar(255),@MOSeq INT,@allmart bit=1,@OrgID INT=1
SET @MO = 'WO2407100313'
SET @MOSeq = 1
IF EXISTS (SELECT 1 WHERE OBJECT_ID('tempdb..#MATERGROUP') IS NOT NULL)
BEGIN
DROP TABLE [dbo].[#MATERGROUP]
END
CREATE TABLE #MATERGROUP(
INDEXID INT IDENTITY(1,1)
,FID INT
,FENTRYID INT PRIMARY KEY
,FSEQ INT
,FMATERIALID INT
,FQTY DECIMAL(38,10)
,FBASEQTY DECIMAL(38,10)
,FNUMERATOR INT DEFAULT 1
,FDENOMINATOR INT DEFAULT 1
,FPOSITIONNO NVARCHAR(4000)
,FReplaceGroup int NOT NULL
)
--获取需求数量不为0的子项明细
INSERT INTO #matergroup(FID,FENTRYID,FMATERIALID,FSeq,FQTY,FBaseQTY,FPositionNO,FReplaceGroup)
SELECT t1e.FID,t1e.FENTRYID,FMATERIALID,FSEQ,FMUSTQTY,FBASEMUSTQTY,FPositionNO,t1e.FReplaceGroup
FROM T_PRD_PPBOMENTRY t1e
INNER JOIN T_PRD_PPBOMENTRY_C t1e_c ON t1e_c.FENTRYID = t1e.FENTRYID AND t1e_c.FSUPPLYORG= @OrgID
WHERE t1e.FMOBILLNO = @MO AND FMOENTRYSEQ = @MOSeq AND t1e.FMATERIALTYPE = 1 --标准件
AND FMUSTQTY > CASE @allmart WHEN 0 THEN -1 ELSE 0 END
AND t1e.FMATERIALID IN (
SELECT FMATERIALID FROM T_PRD_PPBOMENTRY
WHERE FID=t1e.FID AND FMATERIALTYPE = 1
AND FMUSTQTY > CASE @allmart WHEN 0 THEN - 1 ELSE 0 END
GROUP BY FMATERIALID
HAVING COUNT(1) > 1
)
IF EXISTS(SELECT 1 FROM #matergroup)
BEGIN
/*---------------------------------------查询替代件start-------------------------------------------*/
INSERT INTO #matergroup(FID,FENTRYID,FMATERIALID,FSeq,FQTY,FBaseQTY,FPositionNO,FReplaceGroup)
SELECT t1e.FID,t1e.FENTRYID,t1e.FMATERIALID,t1e.FSEQ,FMUSTQTY,FBASEMUSTQTY,t1e_c.FPositionNO,t1e.FReplaceGroup
FROM T_PRD_PPBOMENTRY t1e
INNER JOIN T_PRD_PPBOMENTRY_C t1e_c ON t1e_c.FENTRYID = t1e.FENTRYID
INNER JOIN #matergroup tt on tt.FID = t1e.FID AND tt.FReplaceGroup = t1e.FREPLACEGROUP
WHERE 1=1
AND t1e.FMATERIALTYPE = 3
--AND t1e.FENTRYID != tt.FENTRYID
AND t1e.FMUSTQTY > CASE @allmart WHEN 0 THEN -1 ELSE 0 END
/*---------------------------------------查询替代件end---------------------------------------------*/
/*------------------------------------------计算合并数量start---------------------------------*/
UPDATE t0 SET FQTY = ISNULL(t1.FQTY,0) ,FBaseQTY = ISNULL(t1.FBaseQTY,0)
FROM #matergroup t0
OUTER APPLY (
SELECT t1.FMATERIALID,ROUND(SUM(ISNULL(tt.FQTY,0)),t2.FPrecision) AS 'FQTY'
,ROUND(SUM(ISNULL(tt.FBaseQTY,0)),t2.FPrecision) AS 'FBaseQTY'
,MIN(tt.FSEQ) AS 'MinSeq'
FROM #matergroup tt
INNER JOIN T_BD_MATERIALSTOCK t1 on t1.FMATERIALID = tt.FMATERIALID
INNER JOIN T_BD_UNIT t2 on t2.FUNITID = t1.FStoreUnitID
GROUP BY t1.FMATERIALID,t2.FPRECISION
HAVING t1.FMATERIALID = t0.FMATERIALID AND MIN(tt.FSEQ) = t0.FSEQ
) t1
/*------------------------------------------计算合并数量end---------------------------------*/
/*-----------------------------------------分子分母start---------------------------------*/
MERGE INTO #matergroup tt
USING T_PRD_PPBOM t0 on (tt.FID = t0.FID AND tt.FQTY > 0)
WHEN MATCHED
THEN UPDATE SET tt.FNUMERATOR = ROUND(tt.FQTY/t0.FQTY,4),tt.FDENOMINATOR = 1;
/*-----------------------------------------分子分母end---------------------------------*/
SELECT
MP.FNUMBER FParentMaterial,bom.FNUMBER FBOMID,p2.FMoId,B.FMOBILLNO,B.FMOEntrySeq,b.FMOEntryID,p2.FBaseQty
,y.FNUMBER FMOType,u2.FNUMBER FBaseUnitID,u3.FNUMBER FUnitID,p2.FParentOwnerTypeId
,m2.FNUMBER FMaterialID2,FChangeType,u1.FNUMBER FUnitID2,A.FMUSTQTY,p2.FQTY FProduceQty
,p2.FBILLNO FPPBOMNo,B.FID FPPBOMId,B.FENTRYID FPPBOMEntryId,B.FSeq FPPBOMEntrySeq
,d1.FNUMBER FWORKSHOPID,g.FNUMBER FOWNERID,g.FNUMBER FSUPPLYORG,B.FReplaceGroup,A.FPositionNO
,B.FMATERIALTYPE 'FMaterialType'
FROM (
SELECT '2' FChangeType,p1.FMUSTQTY FMustQty,p1.FID,p1.FENTRYID,FPositionNO
FROM #matergroup m
INNER JOIN T_PRD_PPBOMENTRY p1 ON p1.FID = m.FID and p1.FENTRYID = m.FENTRYID
union
SELECT '3' FChangeType,m.FQTY FMustQty,p1.FID,p1.FENTRYID,CASE m.FQTY WHEN 0 THEN FPositionNO ELSE STUFF
(
(
SELECT ','+FPositionNO
FROM (SELECT DISTINCT FPositionNO,FMATERIALID FROM #matergroup m1 WHERE m1.FID=m.FID) B
WHERE (FMATERIALID=m.FMATERIALID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'
),1,1,''
) END AS FPositionNO
FROM #matergroup m
INNER JOIN T_PRD_PPBOMENTRY p1 ON p1.FID = m.FID and p1.FENTRYID = m.FENTRYID
) A
INNER JOIN T_PRD_PPBOMENTRY B ON B.FID=A.FID and B.FENTRYID=A.FENTRYID
INNER JOIN T_BD_MATERIAL m2 ON m2.FMATERIALID=B.FMATERIALID
INNER JOIN T_BD_UNIT u1 ON u1.FUNITID=B.FUNITID
INNER JOIN T_PRD_PPBOM p2 ON p2.FID=B.FID
INNER JOIN T_BD_DEPARTMENT d1 ON d1.FDEPTID=p2.FWORKSHOPID
INNER JOIN T_PRD_PPBOMENTRY_C p3 ON p3.FID=B.FID and p3.FENTRYID=B.FENTRYID
INNER JOIN T_ORG_Organizations g ON g.forgid=p2.FParentOwnerId
inner JOIN T_BD_MATERIAL MP ON MP.FMATERIALID=p2.FMATERIALID
INNER JOIN T_ENG_BOM bom ON bom.FID=p2.FBOMID
INNER JOIN T_BD_UNIT u2 ON u2.FUNITID=p2.FBASEUNITID
INNER JOIN T_BD_UNIT u3 ON u3.FUNITID=p2.FUNITID
INNER JOIN T_BAS_BILLTYPE y ON y.FBILLTYPEID=p2.FMOType
ORDER BY B.FID,B.FENTRYID,FChangeType
END