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

185 lines
7.7 KiB
Transact-SQL

-- =============================================
-- Author: Steamware
-- Mod. date: 2014.05.22
-- Description: elaborazione OrdersHist Redditivity
-- =============================================
CREATE PROCEDURE [dbo].[stp_QLR_insNew]
(
@QuoteType CHAR(1) = 'R',
@Note NVARCHAR(2500) = '',
@row2proc INT = 100
)
AS
BEGIN
SET NOCOUNT ON;
-- declare variabili
DECLARE @CodQuote AS BIGINT,
@QuoteRev AS INT = 0,
@OrdNum AS NVARCHAR(50),
@OrdRow AS NVARCHAR(50),
@CodItem AS NVARCHAR(50),
@CodClient AS NVARCHAR(50),
@BatchQty AS INT,
@RawMat AS NVARCHAR(50),
@RawMatCost AS DECIMAL(18,6),
@RawMatExtraCost AS DECIMAL(18,6),
@CodInco AS NVARCHAR(5),
@PriceOff AS DECIMAL(9,6),
@OrdDate As DATETIME,
@OrdPrice AS DECIMAL(9,6),
@OrdQty AS INT,
@ProvvCost AS DECIMAL(9,6),
@oggi AS DATETIME = GETDATE(),
@LastIdx AS INT,
@noRow AS CHAR(1) = 'N'
SET XACT_ABORT ON;
SET @QuoteType = 'R' -- per il momento non lascio parametrico il quotetype R - redditività
-- se non esiste il contatore creo il record
IF NOT EXISTS ( SELECT * FROM dbo.ContatoriQuote WHERE Flusso = @QuoteType )
INSERT INTO dbo.ContatoriQuote SELECT @QuoteType, 0
-- verifico se ci sono record da elaborare
IF EXISTS ( SELECT * FROM dbo.OrdersHist WHERE CodQuote = 0 )
SET @noRow = 'N'
WHILE( @noRow = 'N' AND @row2proc > 0)
BEGIN
-- ===========================================================
-- stacco il CodQuote da usare e sbocco la tabella ( in realtà perdo un numero se poi non faccio insert )
-- se non eseguo procedure multiple contemporanee non serve
-- ===========================================================
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- credo non serva con OUTPUT
DECLARE @Table TABLE ( LastIdx INT )
BEGIN TRAN;
UPDATE dbo.ContatoriQuote
SET LastIdx = ( LastIdx % 1000000 ) + 1 -- si resetta dopo 1.000.000 righe ( in pratica ho tot righe x giorno )
OUTPUT inserted.LastIdx INTO @Table
WHERE Flusso = @QuoteType
SELECT @LastIdx = MAX(LastIdx) FROM @Table
SELECT @CodQuote = CONVERT( BIGINT, ( RIGHT(YEAR(@oggi),2) + dbo.f_padLeft(MONTH(@oggi), 2,'0') + dbo.f_padLeft(DAY(@oggi), 2,'0') + dbo.f_padLeft(@LastIdx, 8,'0') ) )
COMMIT;
-- ===========================================================
-- elaboro il primo ordine "libero" assegnando il CodQuote
-- se da errore la transazione mi annulla il codquote e quindi rimane elaborabile
-- altrimenti metto l'assegnazione nella tran precedente e poi decido cosa fare con quelli non completati con data EndCalc = NULL
-- ===========================================================
-- SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- SERIALIZABLE; -- REPEATABLE READ;
BEGIN TRANSACTION;
-- leggo il primo ordine da elaborare e assegno il CodQuote
WITH cteOrderFree AS
( -- leggo il primo ordine da elaborare e assegno il CodQuote
SELECT TOP(1) OrdNum, OrdRow FROM dbo.OrdersHist WHERE CodQuote = 0
)
UPDATE Ord
SET CodQuote = @CodQuote,
QuoteType = @QuoteType
FROM dbo.OrdersHist AS ord
INNER JOIN cteOrderFree AS cte
ON ord.OrdNum = cte.OrdNum AND ord.OrdRow = cte.OrdRow
-- leggo i valori di calcolo
SET @OrdNum = NULL
SELECT @OrdNum = OrdNum,
@OrdRow = OrdRow ,
@CodItem = hi.CodItem,
@CodClient = CodClient,
@BatchQty = BatchQty,
@RawMat = RawMat,
@RawMatCost = RawMatCost,
@RawMatExtraCost = RawMatExtraCost,
@CodInco = CodInco,
@PriceOff = PriceOff,
@OrdPrice = OrdPrice,
@OrdDate = OrdDate,
@OrdQty = OrdQty,
@ProvvCost = ProvvCost
FROM dbo.OrdersHist hi
INNER JOIN dbo.ItemDet AS It ON hi.CodItem = it.CodItem -- deve esistere il codice in anagrafica altrimenti non lo elaboro
WHERE CodQuote = @CodQuote AND QuoteType = @QuoteType
OPTION (RECOMPILE)
IF @OrdNum IS NOT NULL -- record precedente trovato
BEGIN
-- inserisco riga in QuoteList
INSERT INTO dbo.QuoteList( QuoteType, CodQuote, QuoteRev, CodClient, CodItem, UnitWeight, BatchQty, CodItemGroup, RawMat, CodInco, Note, PriceOff, OrdNum, OrdRow, OrdDate, OrdPrice, OrdQty )
SELECT @QuoteType, @CodQuote, @QuoteRev, @CodClient, CodItem, UnitWeight, @BatchQty, CodItemGroup, @RawMat, @CodInco, @Note , @PriceOff, @OrdNum, @OrdRow, @OrdDate ,@OrdPrice, @OrdQty
FROM dbo.ItemDet
WHERE CodItem = @CodItem
-- ora inserisco in QuoteRM
INSERT INTO dbo.QuoteRM(QuoteType, CodQuote, QuoteRev, NumRM, RawMat, RawMatCost, RawMatExtraCost)
VALUES (@QuoteType, @CodQuote, @QuoteRev, 1, @RawMat, @RawMatCost, @RawMatExtraCost)
-- ora inserisco ProvvCost in QuoteSimPar che mi serve dopo nei calcoli dopo
INSERT INTO dbo.QuoteSimPar(QuoteType, CodQuote, QuoteRev, NomePar, ValPar)
VALUES (@QuoteType, @CodQuote, @QuoteRev, 'ProvvCost', @ProvvCost)
-- ricalcolo!
EXEC dbo.stp_QL_fullDataUpdate @QuoteType , @CodQuote , @QuoteRev, 'Y';
-- aggiorno data-ora fine elaborazione
UPDATE dbo.OrdersHist
SET EndCalc = GETDATE()
WHERE CodQuote = @CodQuote AND QuoteType = @QuoteType;
--SELECT * FROM dbo.OrdersHist WHERE QuoteType = 'R' AND CodQuote = @CodQuote
--SELECT * FROM dbo.QuoteList WHERE QuoteType = 'R' AND CodQuote = @CodQuote
--SELECT * FROM dbo.QuoteRM WHERE QuoteType = 'R' AND CodQuote = @CodQuote
--SELECT TOP(1000) * FROM dbo.QuoteFull_R WHERE QuoteType = 'R' AND CodQuote = @CodQuote
END
ELSE
SET @noRow = 'Y' -- fine righe da elaborare
COMMIT TRAN;
SET @row2proc = @row2proc - 1
END -- END WHILE
RETURN
END
/*
-- Pulizia Tabelle di appoggio x QuoteType = 'R'
DELETE FROM dbo.QuoteOC WHERE QuoteType = 'R'
DELETE FROM dbo.QuoteParam WHERE QuoteType = 'R'
DELETE FROM dbo.QuoteWorkExt WHERE QuoteType = 'R'
DELETE FROM dbo.QuoteWorkInt WHERE QuoteType = 'R'
DELETE FROM dbo.QuoteRM WHERE QuoteType = 'R'
DELETE FROM dbo.QuoteList WHERE QuoteType = 'R'
DELETE FROM dbo.QuoteSimPar WHERE QuoteType = 'R'
SELECT TOP 1000 * FROM dbo.QuoteList WHERE QuoteType = 'R'
SELECT TOP 1000 * FROM dbo.QuoteRM WHERE QuoteType = 'R'
SELECT TOP 1000 * FROM dbo.QuoteOC WHERE QuoteType = 'R'
SELECT TOP 1000 * FROM dbo.QuoteParam WHERE QuoteType = 'R'
SELECT TOP 1000 * FROM dbo.QuoteWorkExt WHERE QuoteType = 'R'
SELECT TOP 1000 * FROM dbo.QuoteWorkInt WHERE QuoteType = 'R'
SELECT * FROM dbo.OrdersHist
SELECT * FROM dbo.QuoteFull_R WHERE QuoteType = 'R'
-- RIPULISCO TUTTO
TRUNCATE TABLE dbo.QuoteFull_R
UPDATE dbo.OrdersHist
SET CodQuote = 0
UPDATE dbo.ContatoriQuote
SET LastIdx = 0 WHERE Flusso = 'R'
-- SE RICARICO DA ZERO GLI ORDINI
TRUNCATE TABLE dbo.OrdersHist
*/