Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev
WinDev Forum d'entraide sur la programmation en WinDev
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/01/2013, 17h13   #1
AlelMourad
Invité de passage
 
Homme
Analyste d'exploitation
Inscription : janvier 2013
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Emirats Arabes

Informations professionnelles :
Activité : Analyste d'exploitation
Secteur : Arts - Culture

Informations forums :
Inscription : janvier 2013
Messages : 3
Points : 0
Points : 0
Par défaut Aide calcul quantité en stock

Bonjour tout le monde
Je cherche depuis quelques jours une solution à mon problème.
Mon projet consiste à gérer la gestion de stock des produits. Ce que je veux faire c'est de gérer les stocks.
j'ai 3 fichiers, Ligne Prod-Livraison « relation composée BL-Produit » :"ID_BL_Prod , N° BL, IDProd ,Quantité Liv ", Produit:" IDProd, Nom Produit, Prix HT", Stocks :"N° Stock , IDProd, Quantité en stock ".
Je veux que lorsque je clique sur ajouter, chaque produit livré diminue en stock .
Par exemple la Qté En Stock du produit X = 200, si dans ma table (Table fichier) je livre ce produit avec Qté=50 la Qté En Stock de celui-ci devient 150 (y compris la Qté en stock du fichier stocks bien sûr) et ainsi de suite pour chaque produit.
J’ai essayé plusieurs procédures d’indice produit mais ca n’a pas marcher (La Qté en stock du produit prédécesseur ou successeur soustraire la qté du produit indicé (selon action insertion – ajout – ou modif de la Qté)
Voici mon code :
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
PROCEDURE AjouteLigneBL()

nRefProduit			est un entier
nIndiceProduit		est un entier

nRefProduit = COMBO_Produits..Valeur
nIndiceProduit = TableCherche(TABLE_Bon_Liv.COL_Num_Prod,nRefProduit)

SI nIndiceProduit = -1 ALORS 
 
	HLitRecherchePremier(Stocks, Num_Prod,TABLE_Bon_Liv.COL_Num_Prod)		
	
	SI HTrouve(Stocks) = Vrai ALORS  		
		Stocks.Qte_en_Stock = Stocks.Qte_en_Stock - (SAI_Qte_BLExt) 	
	FIN	

HModifie(Stocks)	
	// Ajoute une ligne pour ce produit
TableAjouteLigne(TABLE_Bon_Liv, 0, Bon_Liv.Num_BL,Produit.Num_Prod, Produit.Des_Prod,SAI_Qte_BL, Stocks.Qte_en_Stock)
	
	TableEnregistre(TABLE_Bon_Liv)
		
	
SINON  //1 : Ajouter
	//2 : Modifier
	//3 : Annuler
	
	SELON Dialogue ("La référence du produit indiquée est déjà présente dans la commande.")
		// Ajouter
									
CAS 1	Stocks.Qte_en_Stock += TABLE_Bon_Liv.COL_Qte_Livree_Ext[nIndiceProduit] 	
	TABLE_Bon_Liv.COL_Qte_Livree_Ext[nIndiceProduit] += SAI_Qte_BLExt
			
	Stocks.Qte_en_Stock -= TABLE_Bon_Liv.COL_Qte_Livree_Ext[nIndiceProduit]	
	HModifie(Stocks)			
	TABLE_Bon_Liv.COL_Qte_Stock[nIndiceProduit] = stocks.Qte_en_Stock
Que dois-je faire? Pouvez-vous m'aider s'il vous plaît ?

Merci bien.
AlelMourad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h24   #2
michel.souris
Membre actif
 
Homme
Développeur informatique
Inscription : mars 2009
Messages : 158
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2009
Messages : 158
Points : 196
Points : 196
Envoyer un message via MSN à michel.souris
Bonjour,

Je ne suis pas sûr de bien comprendre votre problème....

Ce que je sais c'est qu'une gestion de stock nécessite généralement une table d'entrée sortie où chaque mouvement a un sens (le plus simple de gérer le sens 1 pour les entrées et -1 pour les sorties afin de calculer les quantités avec une simple multiplication).

Le stock initial + la somme des mouvements multipliés par leurs sens permettra alors de connaitre la quantité actuellement en stock.

Lors d'un inventaire c'est la démarche inverse, on mets à jour le stock de la table des produits et la différence permet de calculer le mouvement nécessaire (en 1 ou -1).

Je ne sais pas si ça vous aidera....
__________________
SQL : le véritable Esperanto
PHP/HTML/JS/CSS : et avec ça tu fais fessebouc !
Windev : ***** et **** parce que ***** même si ****** bien

"Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)
michel.souris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h51   #3
AlelMourad
Invité de passage
 
Homme
Analyste d'exploitation
Inscription : janvier 2013
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Emirats Arabes

Informations professionnelles :
Activité : Analyste d'exploitation
Secteur : Arts - Culture

Informations forums :
Inscription : janvier 2013
Messages : 3
Points : 0
Points : 0
Merci michel.souris
par exemple l'ajout dans la table:

Chaise 260
Table 340

Chaise - Qte Liv 10 * En Stk 250
Table - 20 * 230 calculé 250 moin 20
--
évidement je sais,l'augmentation de la Qté en stock ce fait par l'achat 'Entrées' inversement aux sorties "ce que j'ai dans l'analyse *Entrées,Sorties et Stocks* comme fichiers.si j'ai bien compris votre réponse un seul fichier Mouvement stocks gère tous le stock
AlelMourad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 18h03   #4
tatayo
Expert Confirmé
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 550
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 550
Points : 3 098
Points : 3 098
Bonjour,
Chez nous on a deux tables:
Une pour les encours de stock
Une pour les mouvements de stock.

La mise à jour des encours de stock passe par 2 triggers:
Le premier trigger est sur la table des lignes de document: la création/modification d'une ligne de document crée ou modifie un mouvement de stock
Le deuxième trigger est sur la table des mouvements: la création/modification d'un mouvement modifie l'encours de stock corrrespondant

Pour les calculs, dans les premier trigger il suffit de soustraire la valeur "avant modification" et d'ajouter la valeur "après modification".

Ainsi tous les cas sont gérés, et le fait de passer par des triggers permet de s'affranchir de l'interface utilisateur.

Chez nous comme on enregistre autant les mouvement "réels" (qui influent sur le stock) que "prévisionnels" (qui n'influent pas sur le stock), la table des mouvements est quelque peu volumineuse, ce qui ne pose pas de problème avec les bons indexes.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2013, 19h25   #5
michel.souris
Membre actif
 
Homme
Développeur informatique
Inscription : mars 2009
Messages : 158
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2009
Messages : 158
Points : 196
Points : 196
Envoyer un message via MSN à michel.souris
Citation:
Envoyé par tatayo Voir le message
Bonjour,

La mise à jour des encours de stock passe par 2 triggers:
Le premier trigger est sur la table des lignes de document: la création/modification d'une ligne de document crée ou modifie un mouvement de stock
Le deuxième trigger est sur la table des mouvements: la création/modification d'un mouvement modifie l'encours de stock corrrespondant

Pour les calculs, dans les premier trigger il suffit de soustraire la valeur "avant modification" et d'ajouter la valeur "après modification".

Ainsi tous les cas sont gérés, et le fait de passer par des triggers permet de s'affranchir de l'interface utilisateur.
Gros +1 pour les triggers !
Citation:
si j'ai bien compris votre réponse un seul fichier Mouvement stocks gère tous le stock
Une table sert à gérer les entrées sorties
L'autre table sert à gérer l'état de votre stock (on pourrait également que vous stockiez d'autre information dans cette table si vous deviez par exemple gérer des origines et des zones de stockage).

Si tu n'as pas la possibilité de faire tourner de trigger (parce que tu es en HF classic par exemple) tu peux faire tourner un script qui assure la cohérence des données.

En ce qui concerne ton script... J'avoue je n'y comprend pas grand chose...

Là je n'ai pas Windev sous la main mais j'ai l'impression que :

Code :
1
2
3
4
5
6
nIndiceProduit = TableCherche(TABLE_Bon_Liv.COL_Num_Prod,nRefProduit)

SI nIndiceProduit = -1 ALORS 

	HLitRecherchePremier(Stocks, Num_Prod,TABLE_Bon_Liv.COL_Num_Prod)
C'est plutôt bizarre... tu cherche la valeur de ta combo dans ta table au début puis tu dis que si tu trouve pas dans ta table tu bas chercher dans ton fichier la ligne sélectionnée (enfin je crois moi je mets plutôt COL_Num_Prod[TABLE_Bon_Liv] si je veux la ligne courante) donc forcément, enfin il me semble, que tu vas trouver n'importe quoi. Je crois que tu devrais plutôt chercher la valeur de ta combo dans ton fichier.

Code :
1
2
3
4
5
6
7
8
9
10
	SI HTrouve(Stocks) = Vrai ALORS 
		Stocks.Qte_en_Stock = Stocks.Qte_en_Stock - (SAI_Qte_BLExt) 
	FIN 

	HModifie(Stocks) 
	// Ajoute une ligne pour ce produit
	TableAjouteLigne(TABLE_Bon_Liv, 0, Bon_Liv.Num_BL,Produit.Num_Prod, Produit.Des_Prod,SAI_Qte_BL, 	Stocks.Qte_en_Stock)

	TableEnregistre(TABLE_Bon_Liv)
Ensuite ici tu ne traite pas tout les cas.

Si tu trouve ton stock tout va bien, ton curseur se positionne sur le bon enregistrement tu modifie ton stock "de la bonne ligne" en base de données.

Par contre si tu appelle plusieurs fois à la suite ta fonction le curseur reste sur la même position (enfin je pense) du coup je sais pas trop ce que tu fais !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SINON
//1 : Ajouter
//2 : Modifier
//3 : Annuler

SELON Dialogue ("La référence du produit indiquée est déjà présente dans la commande.")
// Ajouter

	CAS 1 Stocks.Qte_en_Stock += TABLE_Bon_Liv.COL_Qte_Livree_Ext[nIndiceProduit] 
		TABLE_Bon_Liv.COL_Qte_Livree_Ext[nIndiceProduit] += SAI_Qte_BLExt

		Stocks.Qte_en_Stock -= TABLE_Bon_Liv.COL_Qte_Livree_Ext[nIndiceProduit] 
		HModifie(Stocks) 
		TABLE_Bon_Liv.COL_Qte_Stock[nIndiceProduit] = stocks.Qte_en_Stock
Là tu t'y prends mal. Déjà tu devrais décrémenter ton stock de la quantité à ajouter au BL.

Donc :
Code :
1
2
3
Stocks.Qte_en_Stock-=SAI_Qte_BLExt
HModifie(Stocks)
Ensuite tu modifie ton affichage :
Code :
1
2
3
TABLE_Bon_Liv.COL_Qte_Livree_Ext[nIndiceProduit] += SAI_Qte_BLExt
TABLE_Bon_Liv.COL_Qte_Stock[nIndiceProduit] -= SAI_Qte_BLExt
En plus je crois que tu oublie de modifier la position de ton curseur, tu ne fais pas de HLitRecherche sur la table Stocks....

Et du manière général, si je peux permettre, teste le retour de tes fonctions et traite les SINON.

[EDIT]
Et passe ton code au pas à pas !
[/EDIT]
__________________
SQL : le véritable Esperanto
PHP/HTML/JS/CSS : et avec ça tu fais fessebouc !
Windev : ***** et **** parce que ***** même si ****** bien

"Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)
michel.souris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 16h54   #6
AlelMourad
Invité de passage
 
Homme
Analyste d'exploitation
Inscription : janvier 2013
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Emirats Arabes

Informations professionnelles :
Activité : Analyste d'exploitation
Secteur : Arts - Culture

Informations forums :
Inscription : janvier 2013
Messages : 3
Points : 0
Points : 0
Salut michel.souris , tatayo , merci d'avoir répondus , de vos aides et précieuses informations
j'ajouterai les fichiers mouvement et encours du stock en liaison avec le le fichier produit et fournisseur ainsi que le client , pour les intégrités réferencielle ça sera un combat
Mouvement :"IdMouv,Num_Four,Num_Prod,Libelle*Entrées,Sorties*,Qté,Date,
et Num_Client" qui peut être sera mon probleme -Num_Client-

le premier trigger j'ai pas d'idées de ses champs ...

voici une partie de mon analyse comment était :


Lors de l’ajout initial d’un produit ne pose aucun problème en Qté du stock (calculée parfaitement)



le problème que j'avais c'est que lors de l'ajout ou modification d'une Qté à la livrée d'un produit existe dans la table :
QtéStock = 390+2 - 22 = 380


la soustraction se fait entre la qté du dernier ajouté*dernière position du curseur* et la somme : Col_Qté_Livrée+Sai_Qté_Liv :
800 - 22 = 780


c se que j'ai voulu résourde s'il y'a un script pour ça..et merci pour vos lumières
AlelMourad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 09h38   #7
michel.souris
Membre actif
 
Homme
Développeur informatique
Inscription : mars 2009
Messages : 158
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2009
Messages : 158
Points : 196
Points : 196
Envoyer un message via MSN à michel.souris
Citation:
Envoyé par AlelMourad Voir le message
Salut michel.souris , tatayo , merci d'avoir répondus , de vos aides et précieuses informations
j'ajouterai les fichiers mouvement et encours du stock en liaison avec le le fichier produit et fournisseur ainsi que le client , pour les intégrités réferencielle ça sera un combat
Mouvement :"IdMouv,Num_Four,Num_Prod,Libelle*Entrées,Sorties*,Qté,Date,
et Num_Client" qui peut être sera mon probleme -Num_Client-

le premier trigger j'ai pas d'idées de ses champs ...

voici une partie de mon analyse comment était :


Lors de l’ajout initial d’un produit ne pose aucun problème en Qté du stock (calculée parfaitement)



le problème que j'avais c'est que lors de l'ajout ou modification d'une Qté à la livrée d'un produit existe dans la table :
QtéStock = 390+2 - 22 = 380


la soustraction se fait entre la qté du dernier ajouté*dernière position du curseur* et la somme : Col_Qté_Livrée+Sai_Qté_Liv :
800 - 22 = 780


c se que j'ai voulu résourde s'il y'a un script pour ça..et merci pour vos lumières
Bonjour,

Je voudrais bien vous aider mais malheureusement je ne pense pas comprendre pas tout ce que vous cherchez à dire.

La chose que je constate sur votre MCD c'est qu'il y a une table ENTREE et une table SORTIE au lieu d'avoir une table MOUVEMENT unique qui gère les entrées et les sorties.

Ensuite vos exemples de calculs sont erronés...

QtéStock = 390+2 - 22 = 380 >>>> QtéStock = 390+2 - 22 = 370

Col_Qté_Livrée+Sai_Qté_Liv :
800 - 22 = 780 >>> 800 - 22 = 778

Ca ne facilite pas la compréhension de votre problème.
Peut être est-ce volontaire afin de montrer ce qui vous dérange ?
__________________
SQL : le véritable Esperanto
PHP/HTML/JS/CSS : et avec ça tu fais fessebouc !
Windev : ***** et **** parce que ***** même si ****** bien

"Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)
michel.souris est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h09.


 
 
 
 
Partenaires

Hébergement Web