Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/06/2011, 16h37   #1
Membre habitué
 
Homme vincent howard
Chef de projet en SSII
Inscription : septembre 2008
Messages : 117
Détails du profil
Informations personnelles :
Nom : Homme vincent howard
Localisation : France

Informations professionnelles :
Activité : Chef de projet en SSII

Informations forums :
Inscription : septembre 2008
Messages : 117
Points : 147
Points : 147
Par défaut calcul moyenne prix

Bonjour à tous,

je voudrais calculer un pmpa à partir d'une table mouvement de stock, et ce de manière dynamique, est-ce que quelqu'un a une idée ou un début de piste

pour info un pmpa est un prix moyen pondéré d'achat

voici un exemple de calcul de pmpa :
ligne 1 qté=10 prix=1.00 pmp=1.00
ligne 2 qté=-3 pmp=toujours 1.00
ligne 3 qté=10 prix=2.00 pmp=1.63 (cad (7*1 + 10*2) / 17
...

est-ce que c'est possible avec une seule requête

merci d'avance pour vos réponses
vhoward99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 18h33   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
est-ce que c'est possible avec une seule requête
Surement mais j’avoue ne pas avoir compris votre calcul?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 18h39   #3
Membre habitué
 
Homme vincent howard
Chef de projet en SSII
Inscription : septembre 2008
Messages : 117
Détails du profil
Informations personnelles :
Nom : Homme vincent howard
Localisation : France

Informations professionnelles :
Activité : Chef de projet en SSII

Informations forums :
Inscription : septembre 2008
Messages : 117
Points : 147
Points : 147
c'est pas grave, disons que le résultat (une moyenne mettons) doit être calculé à partir des lignes n-1 et ainsi de suite
vhoward99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 19h42   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
De quelles informations disposez vous dans votre table des transactions ?
Avez vous un PMP de base ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 20h19   #5
Membre habitué
 
Homme vincent howard
Chef de projet en SSII
Inscription : septembre 2008
Messages : 117
Détails du profil
Informations personnelles :
Nom : Homme vincent howard
Localisation : France

Informations professionnelles :
Activité : Chef de projet en SSII

Informations forums :
Inscription : septembre 2008
Messages : 117
Points : 147
Points : 147
Bonjour,

merci pour votre aide

je dispose de la quantité mouvementée et du prix, à partir de là je dois calculer le stock et le pmp au fil de l'eau

mvt no 1
qté mouvementée = 10
prix = 1
stock restant = 10
pmp = 1

mvt no 2
qté mouvementée = -3
prix = null
stock restant = 7
pmp = 1

mvt no 3
qté mouvementée = 10
prix = 2
stock restant = 17
pmp = 1.59

le stock c'est facile à comprendre, le pmp 1.59 est obtenu comme ceci :
(valeur stock n-1 + valeur stock n) / (stock n-1 + stock n) soit
(7.00 + 20.00) / (7 + 10) = 1.59
vhoward99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 20h33   #6
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Ah ben oui un PMP .. forcément la 1ere valeur correspond forcément au 1er prix d'achat

Vous pouvez essayer ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
DECLARE @t TABLE
(
 id_tran INT,
 qte INT,
 prix DECIMAL(5,2)
);
 
INSERT @t VALUES (1, 10, 1);
INSERT @t VALUES (2, -3, 1);
INSERT @t VALUES (3, 10, 2);
 
WITH CTE 
AS
(
	SELECT *, CAST(prix AS DECIMAL(15,2)) AS pmp
	FROM @t
	WHERE id_tran = 1
	UNION ALL 
	SELECT 
		T.id_tran,
		T.qte,
		T.prix,
		CAST((((CTE.qte + T.qte) * CTE.pmp) + T.qte * T.prix) / (CTE.qte + T.qte + T.qte) AS DECIMAL(15,2))
	FROM @t AS T
	INNER JOIN CTE
	 ON CTE.id_tran + 1 = T.id_tran 
)
SELECT *
FROM CTE;
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 20h40   #7
Membre habitué
 
Homme vincent howard
Chef de projet en SSII
Inscription : septembre 2008
Messages : 117
Détails du profil
Informations personnelles :
Nom : Homme vincent howard
Localisation : France

Informations professionnelles :
Activité : Chef de projet en SSII

Informations forums :
Inscription : septembre 2008
Messages : 117
Points : 147
Points : 147
malheureusement je suis sur 2000, j'ai l'impression que les CTE ne passent pas
vhoward99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 20h52   #8
Membre habitué
 
Homme vincent howard
Chef de projet en SSII
Inscription : septembre 2008
Messages : 117
Détails du profil
Informations personnelles :
Nom : Homme vincent howard
Localisation : France

Informations professionnelles :
Activité : Chef de projet en SSII

Informations forums :
Inscription : septembre 2008
Messages : 117
Points : 147
Points : 147
je valide la réponse, j'ai essayé sur un sql2008 et ça passe

merci encore, ça me servira de tte façon

pour ma base 2000 j'ai fais donc une fonction avec renvoi de table, pour ceux que ça interesse voici :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
CREATE FUNCTION FCT_STK_detail (@art_id int)  
RETURNS @PAMPTable TABLE (stk_id int PRIMARY KEY,
	stk_type varchar(50),
	stk_quantite decimal(18,2),
	stk_prix decimal(18,2),
	stk_date datetime,
	ble_numero varchar(50),
	ble_fournisseur_nom varchar(50),
	stock decimal(18,2),
	pmp decimal(18,2)
)
AS  
 
begin
 
declare @stk_id int
declare @stk_type varchar(50)
declare @stk_quantite decimal(18,2)
declare @stk_prix decimal(18,2)
declare @stk_date datetime
declare @ble_numero varchar(50)
declare @ble_fournisseur_nom varchar(50)
declare @pmp decimal(18,2)
declare @stock decimal(18,2)
 
SET @pmp=0
SET @stock=0
 
declare PAMP cursor scroll FOR  
SELECT     stk_id, stk_type, stk_quantite, stk_prix, stk_date, ble_numero, ble_fournisseur_nom 
FROM         dbo.STK_stock LEFT OUTER JOIN
                      dbo.BLL_bon_livraison_ligne ON dbo.STK_stock.BLL_id = dbo.BLL_bon_livraison_ligne.BLL_id LEFT OUTER JOIN
                      dbo.BLE_bon_livraison ON dbo.BLL_bon_livraison_ligne.BLE_id = dbo.BLE_bon_livraison.BLE_id
WHERE stk_stock.art_id=@art_id
ORDER BY stk_date
open PAMP
	fetch next FROM PAMP INTO @stk_id, @stk_type, @stk_quantite, @stk_prix, @stk_date, @ble_numero, @ble_fournisseur_nom
	while @@fetch_status = 0
	begin
		IF (@stock + @stk_quantite) = 0
			SET @pmp = 0
		else IF @stk_quantite > 0
			SET @pmp =  ((@stock * @pmp) + (@stk_prix*@stk_quantite)) / (@stock + @stk_quantite)
 
		SET @stock=@stock + @stk_quantite
 
		INSERT @PAMPTable SELECT @stk_id, @stk_type, @stk_quantite, @stk_prix, @stk_date, @ble_numero, @ble_fournisseur_nom, @stock, @pmp
		fetch next FROM PAMP INTO @stk_id, @stk_type, @stk_quantite, @stk_prix, @stk_date, @ble_numero, @ble_fournisseur_nom
	end
	close PAMP
	deallocate PAMP
 
	RETURN
END
vhoward99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 11h54   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Je n'ai pas tout compris le mode de calcul (dans votre exemple, valeur stock n = 17 * 2 = 34 et non 20 ?) , mais si on considère plutôt

(valeur stock n-1 + valeur mouvement n) / (stock n-1 + qte mouvementée n) , on peut faire comme ceci sachant que stock n-1
+ qté mouvementée = stock n)

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
DECLARE @t TABLE
(
 id_tran INT,
 qte INT,
 prix DECIMAL(5,2)
);
 
INSERT @t VALUES (1, 10, 1);
INSERT @t VALUES (2, -3, NULL);
INSERT @t VALUES (3, 10, 2);
 
 
SELECT 
	id_tran,
	qte, 
	prix,
	COALESCE(
		(
			(
				(SELECT TOP(1) prix FROM @t A WHERE A.id_tran < Y.id_tran AND prix IS NOT NULL ORDER BY id_tran DESC)  --prix n-1
				*
				(SELECT SUM(qte) FROM @t B WHERE B.id_tran < Y.id_tran ) --qte mouvementée n-1
				+
				prix * qte
			)	
		/
			(SELECT SUM(qte) FROM @t C WHERE C.id_tran <= Y.id_tran) --stock n
		)
		, 
		(SELECT TOP(1) prix FROM @t D WHERE D.id_tran <= Y.id_tran AND prix IS NOT NULL ORDER BY id_tran DESC)
	) AS pmp	
FROM @t Y

Je me suis basé sur les id pour "l'ordre" des mouvements, mais visiblement vous avez une colonne date, basez vous dessus.

Comme je disais, je ne suis pas certain du calcul, le résultat de la requête ci-dessus est donc peut être faux, mais vous pouvez l'adapter sur le même principe pour vous passer de votre curseur...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 11h36   #10
Modérateur
 
Homme
Administrateur de base de données
Inscription : août 2007
Messages : 1 158
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Belgique

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : août 2007
Messages : 1 158
Points : 1 617
Points : 1 617
Comment le stock est il gerer ?

Lors de votre mouvement en sortie, le prix n'est pas indique.
Est il gere en FIFO (first-in-first-out) ou bien en LIFO (last-in-last-out) ?
Cela aura un impact sur votre PMP par la suite...
Ptit_Dje est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h21.


 
 
 
 
Partenaires

Hébergement Web