187 lines
7.3 KiB
MySQL
187 lines
7.3 KiB
MySQL
|
|
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: <<3C>ֱȣ<D6B1>XPS>
|
|||
|
|
-- Create date: <20230130>
|
|||
|
|
-- Last date: <20230915>
|
|||
|
|
-- Description: <<3C>û<EFBFBD>ȡ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嵥<EFBFBD><E5B5A5>ͬ<EFBFBD><CDAC><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>>
|
|||
|
|
-- =============================================
|
|||
|
|
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
|
|||
|
|
/*-----------------------------------------------------------------------------------------------------------------------*/
|
|||
|
|
--/*<EFBFBD><EFBFBD><EFBFBD>Ⱥϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|||
|
|
--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 /*<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD>ĸ*/
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|