Suivi des articles d'un stock (PEPS)

--Requête implémentant le suivi des artives d'un stock suivant la méthode Premier entré, premier sorti

--(PEPS)

--Table SQL temporaire contenant les produits

DECLARE @produitTbl TABLE

(

id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,

nbProd INT NOT NULL,

jour INT NOT NULL,

cours FLOAT NOT NULL,

totProdAchat INT ,

totProdVente INT,

coursMoyen FLOAT

)

--Achat en vente de ce produit (une opération par jour)

INSERT INTO @produitTbl(nbProd,jour,cours) VALUES(5,1,5)

INSERT INTO @produitTbl(nbProd,jour,cours) VALUES(15,2,2)

INSERT INTO @produitTbl(nbProd,jour,cours) VALUES(15,4,12)

INSERT INTO @produitTbl(nbProd,jour,cours) VALUES(20,6,43)

INSERT INTO @produitTbl(nbProd,jour,cours) VALUES(-4,3,20)

INSERT INTO @produitTbl(nbProd,jour,cours) VALUES(-10,5,15)

INSERT INTO @produitTbl(nbProd,jour,cours) VALUES(-25,7,12)

--Calcul des sommes des produits achetés et vendus pour chaque jour

UPDATE tempTABLED

SET tempTABLED.totProdAchat = tempTABLEB.totProdAchat,tempTABLED.coursMoyen = tempTABLEB.coursMoyen

FROM (

SELECT tempTABLEC.id,SUM(tempTABLEB.nbProd) AS totProdAchat,

SUM(tempTABLEB.cours * tempTABLEB.nbProd)/SUM(tempTABLEB.nbProd) AS coursMoyen

FROM @produitTbl AS tempTABLEB INNER JOIN @produitTbl AS tempTABLEC

ON tempTABLEB.jour <= tempTABLEC.jour

WHERE tempTABLEB.nbProd > 0

GROUP BY tempTABLEC.id

) AS tempTABLEB INNER JOIN @produitTbl AS tempTABLED

ON tempTABLEB.id = tempTABLED.id

UPDATE tempTABLEC

SET totProdVente =(SELECT SUM(tempTABLEA.nbprod) AS totProdVente

FROM @produitTbl AS tempTABLEA

WHERE tempTABLEA.jour <= tempTABLEC.jour AND tempTABLEA.nbProd < 0 )

FROM @produitTbl AS tempTABLEC

UPDATE @produitTbl SET totProdVente = 0 WHERE totProdVente IS NULL

--Pour la vente du jour 7, rechercher quels produits achetés ont été utilisés

--La méthode Premier Entré/Premier Sorti (PEPS ou FIFO) est utilisée

--Changer le jour pour changer de vente

--Total des ventes avant et après la vente du jour spécifié

DECLARE @totProdVentePrec INT

DECLARE @totProdVenteUlt INT

SELECT @totProdVentePrec = totProdVente - nbProd,@totProdVenteUlt = totProdVente

FROM @produitTbl

WHERE jour = 7 AND nbProd < 0

--Cours moyen PEPS

DECLARE @coursMoyenPeps FLOAT

SET @coursMoyenPeps = 0

DECLARE @jour INT

DECLARE @nbProd INT

DECLARE @totProdAchat INT

DECLARE @totProdVente INT

DECLARE @cours FLOAT

DECLARE articleVenduCursor CURSOR FOR

SELECT jour,nbProd,totProdAchat,totProdVente,cours

FROM @produitTbl

WHERE totProdachat > -@totProdVentePrec AND totProdVente >= @totProdVentePrec AND nbProd > 0

ORDER BY jour

OPEN articleVenduCursor;

FETCH NEXT FROM articleVenduCursor

INTO @jour,@nbProd,@totProdAchat,@totProdVente,@cours

WHILE @@FETCH_STATUS = 0 AND @totProdVentePrec <> @totProdVenteUlt

BEGIN

IF @totProdAchat < - @totProdVenteUlt

BEGIN

SELECT @jour AS jourAchat,@nbProd AS TotalProduitDeCeJourAchete,@totProdAchat AS TotalProduitAcheté

, - @totProdAchat - @totProdVentePrec AS ProduitDeCeJourConsomme,@cours AS cours

--Calcul du montant des produits consommés

SET @coursMoyenPeps = (- @totProdAchat - @totProdVentePrec) * @cours + @coursMoyenPeps

SET @totProdVentePrec = - @totProdAchat

END

ELSE

BEGIN

SELECT @jour AS jourAchat,@nbProd AS TotalProduitDeCeJourAchete,@totProdAchat AS TotalProduitAcheté

,@totProdVenteUlt-@totProdVentePrec AS ProduitDeCeJourConsomme,@cours AS cours

--Calcul du montant des produits consommés

SET @coursMoyenPeps = ( @totProdVenteUlt - @totProdVentePrec) * @cours + @coursMoyenPeps

SET @totProdVentePrec = @totProdVenteUlt

END

FETCH NEXT FROM articleVenduCursor

INTO @jour,@nbProd,@totProdAchat,@totProdVente,@cours

END

CLOSE articleVenduCursor;

DEALLOCATE articleVenduCursor;

--Calcul du cours moyen PEPS

SELECT @coursMoyenPeps AS MontantProduitsAchetés,nbProd AS NombreProduitsAchetés,

@coursMoyenPeps / nbProd AS CoursPepsProduitsAchetés,coursMoyen AS CoursMoyenProduitsAchetes

FROM @produitTbl

WHERE jour = 7 AND nbProd < 0