Files
C2P/C2P_Project/dbo/Stored Procedures/stp_TPS_upsert.sql
T
2014-07-18 16:58:50 +02:00

177 lines
6.2 KiB
Transact-SQL

-- =============================================
-- Author: S.E. Locatelli
-- Create date: 2013.12.13
-- Description: Crea TabProdSc (tabella produttività/scarti)
-- =============================================
CREATE PROCEDURE [dbo].[stp_TPS_upsert]
(
@dateFrom DATETIME, -- data da cui iniziare a caricare
@dateTo DATETIME -- data fino a cui caricare
)
AS
BEGIN
SET XACT_ABORT ON;
BEGIN TRAN
SET NOCOUNT ON;
-- svuoto tabella...
TRUNCATE TABLE TabProdSc
-- riempio di nuovo valori! chiave AMIL
INSERT INTO TabProdSc
SELECT
dd.CodItem + '-' + pl.RawMat + '-' + pl.CodPlant + '-' + CAST(dd.HoleNum AS NVARCHAR(19)) AS KeyAMIL
, dd.CodDiesGroup
, dd.CodItem + '-' + pl.RawMat AS KeyAM
, dd.CodItem, pl.RawMat, pl.CodPlant, dd.HoleNum
, 0 AS NumSMED -- numero cambi, da sistemare...
, SUM(QtyOUT) AS KgTeorici
, SUM(QtyIN) AS KgLordi
, SUM(Duration) AS Durata
FROM ProductionLog pl
INNER JOIN DiesDet dd ON pl.CodDies=dd.CodDies
WHERE pl.ProcessNum='01' and pl.EventType=1
AND pl.okPr = 1
AND pl.okSc = 1
AND pl.EventStart BETWEEN @dateFrom AND @dateTo
GROUP BY dd.CodItem, pl.RawMat, dd.CodDiesGroup, pl.CodPlant, dd.HoleNum
ORDER BY dd.CodItem, pl.RawMat, dd.CodDiesGroup, SUM(QtyOUT) DESC
-- riempio di nuovo valori! chiave CMIL
INSERT INTO TabProdSc
SELECT
id.CodItemGroup + '-' + pl.RawMat + '-' + pl.CodPlant + '-' + CAST(dd.HoleNum AS NVARCHAR(19)) AS KeyAMIL
, dd.CodDiesGroup
, id.CodItemGroup + '-' + pl.RawMat AS KeyAM
, id.CodItemGroup, pl.RawMat, pl.CodPlant, dd.HoleNum
, 0 AS NumSMED -- numero cambi, da sistemare...
, SUM(QtyOUT) AS KgTeorici
, SUM(QtyIN) AS KgLordi
, SUM(Duration) AS Durata
FROM ProductionLog pl INNER JOIN DiesDet dd ON pl.CodDies=dd.CodDies
INNER JOIN ItemDet id ON dd.CodItem = id.CodItem
WHERE pl.ProcessNum='01' and pl.EventType=1
AND pl.okPr = 1 AND pl.okSc = 1
AND pl.EventStart BETWEEN @dateFrom AND @dateTo
GROUP BY id.CodItemGroup, pl.RawMat, dd.CodDiesGroup, pl.CodPlant, dd.HoleNum
ORDER BY id.CodItemGroup, pl.RawMat, dd.CodDiesGroup, SUM(QtyOUT) DESC
-- calcolo cambi SMED
-- con cte
; WITH cteCambiPre
AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY CodPlant, EventStart ASC) AS Row,
CodPlant, RawMat, EventStart, ProcessNum, CodDies, CodClient, OrderNum, BatchNum
FROM ProductionLog pl
WHERE pl.ProcessNum='01' and pl.EventType=1
AND pl.okPr = 1 AND pl.okSc = 1
AND pl.EventStart BETWEEN @dateFrom AND @dateTo
)
, cteCambi
AS
(
-- PARTE AMIL
SELECT dd.CodItem + '-' + a.RawMat + '-' + a.CodPlant + '-' + CAST(dd.HoleNum AS NVARCHAR(19)) as KeyAMIL
, dd.CodDiesGroup
, a.*
--, b.Row
--, ISNULL(b.Row, 0) AS Cambio -- se 0 c'è cambio
--, CASE ISNULL(b.Row, 0) WHEN 0 THEN 1 ELSE 0 END AS Cambio2
, CASE ISNULL(b.Row, 0) WHEN 0 THEN 1 ELSE 0 END AS Cambio2
FROM cteCambiPre AS a
LEFT JOIN cteCambiPre AS b
ON a.Row-1 = b.Row
AND a.CodPlant = b.CodPlant AND a.CodDies = b.CodDies
INNER JOIN DiesDet dd ON a.CodDies=dd.CodDies
WHERE b.Row IS NULL -- se voglio vedere solo i cambi
--ORDER BY a.CodPlant, a.EventStart
UNION
-- PARTE CMIL
SELECT id.CodItemGroup + '-' + a.RawMat + '-' + a.CodPlant + '-' + CAST(dd.HoleNum AS NVARCHAR(19)) as KeyAMIL
, dd.CodDiesGroup
, a.*
--, b.Row
--, ISNULL(b.Row, 0) AS Cambio -- se 0 c'è cambio
--, CASE ISNULL(b.Row, 0) WHEN 0 THEN 1 ELSE 0 END AS Cambio2
, CASE ISNULL(b.Row, 0) WHEN 0 THEN 1 ELSE 0 END AS Cambio2
FROM cteCambiPre AS a
LEFT JOIN cteCambiPre AS b
ON a.Row-1 = b.Row
AND a.CodPlant = b.CodPlant AND a.CodDies = b.CodDies
INNER JOIN DiesDet dd ON a.CodDies=dd.CodDies
INNER JOIN ItemDet id ON dd.CodItem = id.CodItem
WHERE b.Row IS NULL -- se voglio vedere solo i cambi
--ORDER BY a.CodPlant, a.EventStart
)
UPDATE tps
SET NumSMED = cc.NumSMED
FROM TabProdSc tps
INNER JOIN (
SELECT KeyAMIL, CodDiesGroup, SUM(Cambio2) as NumSMED
FROM cteCambi
GROUP BY KeyAMIL, CodDiesGroup
--ORDER BY KeyAMIL, CodDiesGroup
) AS cc
ON tps.KeyAMIL= cc.KeyAMIL AND tps.CodDiesGroup = cc.CodDiesGroup
-- -- altro metodo, forse + veloce...
-- DROP TABLE test
-- CREATE TABLE [dbo].[test](
-- [Row] [bigint] IDENTITY(1,1) NOT NULL,
-- [CodPlant] [nvarchar](50) NOT NULL,
-- [EventStart] [datetime] NOT NULL,
-- [ProcessNum] [nvarchar](50) NOT NULL,
-- [CodDies] [nvarchar](50) NOT NULL,
-- [CodClient] [nvarchar](50) NOT NULL,
-- [OrderNum] [nvarchar](50) NOT NULL,
-- [BatchNum] [nvarchar](50) NOT NULL,
-- CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
-- (
-- [Row] ASC
-- )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
-- ) ON [PRIMARY]
-- INSERT INTO TEST
-- SELECT CodPlant, EventStart, ProcessNum, CodDies, CodClient, OrderNum, BatchNum
-- FROM ProductionLog pl
-- WHERE pl.ProcessNum='01' and pl.EventType=1
-- ORDER BY CodPlant, EventStart
---- SELECT * FROM Test
-- SELECT a.*
-- , b.Row
-- , ISNULL(b.Row, 0) AS Cambio -- se 0 c'è cambio
-- , CASE ISNULL(b.Row, 0) WHEN 0 THEN 1 ELSE 0 END AS Cambio2
-- FROM test AS a
-- LEFT JOIN test AS b
-- ON a.Row - 1 = b.Row -- aggancio record precedente
-- AND a.CodPlant = b.CodPlant AND a.CodDies = b.CodDies
-- WHERE b.Row IS NULL -- solo i cambi
-- ORDER BY a.CodPlant, a.EventStart
-- salvo nuova revisione dati di produzione...
INSERT INTO RevHistory
SELECT 'P', ISNULL(MAX(RevNum),0) + 1, GETDATE(), 'Aggiornamento dati di produzione fase 01 ' + CONVERT(NVARCHAR(20), @dateFrom, 120) + ' --> ' +CONVERT(NVARCHAR(20), @dateTo, 120)
FROM RevHistory
WHERE RevType = 'P'
COMMIT TRAN
END