185 lines
7.7 KiB
Transact-SQL
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
|
|
|
|
*/ |