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