Files
GateDge2023_ljy/07.珠海英搏尔/SQLQuery2.sql
PastSaid 9725ab5376 a
2024-12-05 15:39:19 +08:00

187 lines
7.3 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.

USE [MESAPI_V2]
GO
/****** Object: StoredProcedure [dbo].[rb_GetMergePPBOMKeyMartQty] Script Date: 2024/9/23 15:53:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <沃比XPS>
-- Create date: <20230130>
-- Last date: <20230915>
-- Description: <得获取合并生产用料清单相同主料的需求>
-- =============================================
ALTER PROCEDURE [dbo].[rb_GetMergePPBOMKeyMartQty]
@MO varchar(255),@MOSeq INT,@allmart bit=1,@OrgID INT=1
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRAN
/*-----------------------------------------------------------------------------------------------------------------------*/
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)
)
INSERT INTO #matergroup(FID,FENTRYID,FMATERIALID,FSeq,FQTY,FBaseQTY,FPositionNO)
SELECT t1.FID,t1.FENTRYID,FMATERIALID,FSEQ,FMUSTQTY,FBASEMUSTQTY,FPositionNO
FROM T_PRD_PPBOMENTRY t1
INNER JOIN T_PRD_PPBOMENTRY_C tc ON tc.FID = t1.FID AND tc.FENTRYID = t1.FENTRYID AND tc.FSUPPLYORG= @OrgID
WHERE t1.FMOBILLNO = @MO AND FMOENTRYSEQ = @MOSeq AND FMATERIALTYPE = 1
AND FMUSTQTY > CASE @allmart WHEN 0 THEN -1 ELSE 0 END
AND T1.FMATERIALID IN (
SELECT FMATERIALID FROM T_PRD_PPBOMENTRY
WHERE FID=t1.FID AND FMATERIALTYPE = 1
AND FMUSTQTY > CASE @allmart WHEN 0 THEN -1 ELSE 0 END
GROUP BY FMATERIALID
HAVING COUNT(1) > 1
)
--SELECT * FROM #matergroup
/*-----------------------------------------------------------------------------------------------------------------------*/
IF EXISTS(SELECT 1 FROM #matergroup)
BEGIN
/*-----------------------------------------------------------------------------------------------------------------------*/
--/*优先合并到替代主料*/
--create table #group (FMATERIALID int,FEntryID INT primary key)
--insert into #group
--SELECT p.FMATERIALID,p.FENTRYID FROM #matergroup g INNER JOIN T_PRD_PPBOMENTRY p ON P.FID=G.FID AND P.FENTRYID=G.FENTRYID
--WHERE p.FREPLACEGROUP in(
-- SELECT FREPLACEGROUP FROM T_PRD_PPBOMENTRY WHERE FMOBILLNO=@MO and FMOENTRYSEQ=@MOSeq GROUP BY FREPLACEGROUP HAVING count(*)>1
--)
--UPDATE M SET FQTY=(SELECT ROUND(SUM(ISNULL(FQTY,0)),U.FPrecision) FROM #matergroup q INNER JOIN T_BD_MATERIALSTOCK s ON s.FMATERIALID=q.FMATERIALID
-- INNER JOIN T_BD_UNIT u ON u.FUNITID=s.FStoreUnitID GROUP BY s.FMATERIALID,U.FPrecision HAVING s.FMATERIALID=M.FMATERIALID)
-- ,FBaseQTY=(SELECT ROUND(SUM(ISNULL(FBaseQTY,0)),U.FPrecision) FROM #matergroup q INNER JOIN T_BD_MATERIALSTOCK s ON s.FMATERIALID=q.FMATERIALID
-- INNER JOIN T_BD_UNIT u ON u.FUNITID=s.FStoreUnitID GROUP BY s.FMATERIALID,U.FPrecision HAVING s.FMATERIALID=M.FMATERIALID)
--FROM #matergroup M INNER JOIN #group g ON m.FENTRYID=g.FEntryID
--WHERE g.FEntryID in(SELECT MIN(FEntryID) FEntryID FROM #group GROUP BY FMATERIALID)
UPDATE M SET FQTY=(
SELECT ROUND(SUM(ISNULL(FQTY,0)),U.FPrecision)
FROM #matergroup q
INNER JOIN T_BD_MATERIALSTOCK s ON s.FMATERIALID = q.FMATERIALID
INNER JOIN T_BD_UNIT u ON u.FUNITID = s.FStoreUnitID
GROUP BY s.FMATERIALID,U.FPrecision
HAVING s.FMATERIALID=M.FMATERIALID),FBaseQTY = (
SELECT ROUND(SUM(ISNULL(FBaseQTY,0)),U.FPrecision)
FROM #matergroup q
INNER JOIN T_BD_MATERIALSTOCK s ON s.FMATERIALID=q.FMATERIALID
INNER JOIN T_BD_UNIT u ON u.FUNITID=s.FStoreUnitID
GROUP BY s.FMATERIALID,U.FPrecision
HAVING s.FMATERIALID=M.FMATERIALID
)
FROM #matergroup M
WHERE FSEQ in(
SELECT MIN(FSEQ) FSEQ
FROM #matergroup
GROUP BY FMATERIALID
)
--and not exists(
-- SELECT FENTRYID FROM #group WHERE FENTRYID=m.FENTRYID
--)
UPDATE M SET FQTY=0,FBaseQTY=0
FROM #matergroup M
WHERE FSEQ not in(
SELECT MIN(FSEQ) FSEQ FROM #matergroup GROUP BY FMATERIALID
)
--and FENTRYID NOT IN(
-- SELECT MIN(FENTRYID) FENTRYID FROM #group WHERE FMATERIALID=M.FMATERIALID GROUP BY FMATERIALID
--)
/*-----------------------------------------------------------------------------------------------------------------------*/
DECLARE @PQTY DECIMAL(38,10),@PBASEQTY DECIMAL(38,10)
SELECT @PQTY=FQTY,@PBASEQTY=FBASEQTY FROM T_PRD_PPBOM WHERE FMOBILLNO=@MO and FMOENTRYSEQ=@MOSeq
DECLARE @i int=1,@j int
SELECT @j=max(IndexID) FROM #matergroup
while @i<=@j
begin
declare @molecule DECIMAL(38,10),@md decimal(38,10),@out_molecule int,@out_denominator int
SELECT @molecule=FQTY FROM #matergroup WHERE IndexID=@i
if @molecule>0 /*当应发数量为0时不需要处理分子、分母*/
begin
UPDATE #matergroup SET FNUMERATOR=ROUND(@molecule/@PQTY,4),FDENOMINATOR=1
WHERE IndexID=@i
end
SET @i=@i + 1
end
--drop table #group
/*-----------------------------------------------------------------------------------------------------------------------*/
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
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
DROP TABLE #matergroup
COMMIT TRAN
END TRY
BEGIN CATCH
--SELECT
-- ERROR_NUMBER() AS ErrorNumber
-- ,ERROR_SEVERITY() AS ErrorSeverity
-- ,ERROR_STATE() AS ErrorState
-- ,ERROR_PROCEDURE() AS ErrorProcedure
-- ,ERROR_LINE() AS ErrorLine
-- ,ERROR_MESSAGE() AS ErrorMessage;
--ROLLBACK TRAN
END CATCH
SET NOCOUNT OFF;
END