Files
Mapo-IOB-WIN/EgwProxy.SqlDb.Test/SqlFromDebug/GetMachineProdData.sql
T
2023-03-15 10:30:20 +01:00

110 lines
3.2 KiB
Transact-SQL

ALTER PROCEDURE [dbo].GetMachineProdData
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN tran
-- dichiarazioni variabili x recupero dati
DECLARE @LastIdx INT = 0
DECLARE @NewIdx INT = 0
-- recupero valore ultima riga stato processata...
SELECT @LastIdx = ISNULL(LastIdx,0)
FROM SyncState
WHERE TableName = 'ToMachineProdData'
-- recupero nuovo MAX idx
SELECT @NewIdx = ISNULL(MAX(ID),0)
FROM syn_M2ERP_PRODORDERS
-- eseguo SOLO SE ho dati aggiuntivi...
IF(@NewIdx > @LastIdx)
BEGIN
/* --------------------------------------------------
* Invierò solo VARIAZIONI dei valori
* - CurrentProdOrder (iniziato/concluso)
* - Quantità Produzione
*
* andando ad incrociare ogni record col precedente...
* -------------------------------------------------- */
-- processo dati ORDINI
;WITH cteCurrOrd AS
(
SELECT ID
,ProdOrder
,Targa as IdxMacchina
,[DateTime] AS DtEvento
,ProdOrderState
,ProdQty
FROM syn_M2ERP_PRODORDERS
WHERE ID > @LastIdx AND ID <= @NewIdx
)
, ctePrevOrd AS
(
SELECT ID
,ProdOrder
,Targa as IdxMacchina
,[DateTime] AS DtEvento
,ProdOrderState
,ProdQty
FROM syn_M2ERP_PRODORDERS
WHERE ID >= @LastIdx AND ID < @NewIdx
)
, cteActDec AS
(
SELECT curr.DtEvento as DtEve
,curr.IdxMacchina
,CASE
WHEN curr.ProdOrderState = 1 THEN 'StartOrd'
--WHEN curr.ProdOrderState = 2 THEN 'PauseOrd'
WHEN curr.ProdOrderState = 3 THEN 'EndOrd'
--WHEN curr.ProdOrderState = 6 THEN 'InsOrd'
ELSE 'NONE'
END AS OrdAction
,CASE
WHEN LEFT(curr.ProdOrder, 4) = 'PODL' THEN REPLACE(curr.ProdOrder,'PODL','')
ELSE 0 END AS IdxPodl
,CASE
WHEN LEFT(curr.ProdOrder, 3) = 'ODL' THEN REPLACE(curr.ProdOrder,'ODL','')
ELSE 0 END AS IdxOdl
,curr.ProdOrder as CodComm
,curr.ProdQty as PzCount
FROM cteCurrOrd curr
INNER JOIN ctePrevOrd prev
ON curr.ID = prev.ID+1
WHERE (curr.ProdOrder <> prev.ProdOrder)
OR (curr.ProdOrderState <> prev.ProdOrderState)
OR (curr.ProdQty <> prev.ProdQty)
)
-- lego i valori col precedente x calcolare se siano variati x insert valori
INSERT INTO MachineProdData(DtEve, IdxMacchina, Action, IdxPodl, IdxOdl, CodComm, PzCount)
SELECT DtEve, IdxMacchina, OrdAction, IdxPodl, IdxOdl, CodComm, PzCount
FROM cteActDec
WHERE OrdAction <> 'NONE'
-- aggiorno valore indice processato
MERGE SyncState AS tgt
USING (SELECT @NewIdx as LastIdx, 'ToMachineProdData' AS TableName) as src (LastIdx, TableName)
ON (tgt.TableName = src.TableName)
WHEN MATCHED THEN
UPDATE SET LastIdx = src.LastIdx
,Note = 'UPDATED from ' + CAST(@LastIdx AS NVARCHAR(50))
,LastUpdate = GETDATE()
WHEN NOT MATCHED THEN
INSERT (LastIdx, TableName, Note, LastUpdate)
VALUES (src.LastIdx, src.TableName, 'CREATED', GETDATE());
END
COMMIT tran
END
GO