Fonction de calcul de stock par ordre d'insertion

Fonction de calcul de stock par ordre d'insertion - PHP - Programmation

Marsh Posté le 04-05-2008 à 12:35:55    

Bonjour a tous,
 
j'ai un petit problème auquel je ne trouve pas de solution, je vais essayer d'être clair pour vous l'expliquer.
 
Je cherche un moyen de calculer la valeur restante en fonction de l'ordre d'incrémentation dans ma base des entrées Commandes.
Ex:
Dans un tableau j'ai les 3 lignes suvantes:
 
-REFERENCE1        QUANTITE(5)           ID(1)         devrait afficher==> 5 en stock
-REFERENCE2        QUANTITE(1)           ID(2)
-REFERENCE1        QUANTITE(2)           ID(3)         devrait afficher==>  2 en stock
 
Dans une table stock, j'ai la valeur de mon stock pour chaque reference, j'ai par exemple 10 en quantite pour la reference REFERENCE1
Je voudrais afficher en face de chaque reference le stock restant apres decompte des references suivant leur ID ASC
Quelle fonction permet de faire cela ?
Merci de votre aide.....

Reply

Marsh Posté le 04-05-2008 à 12:35:55   

Reply

Marsh Posté le 04-05-2008 à 12:48:16    

Je suis pas sûr d'avoir bien compris.
Version neuneu: si tu as la quantité en stock pourquoi tu veux la calculer :??: :whistle:
 
Version autre: t'as ton stock avec la quantité réelle, tu voudrais décompter les quantités en commande donc qui vont sortir sous peu et avoir la quantité réellement disponible c'est bien ça :??:
Si c'est ça, pourquoi tu décrémentes pas quand ça passe en commande :??:

Reply

Marsh Posté le 04-05-2008 à 13:12:04    

Je decremente deja a la commande.
Ce que je cherche a faire c'est un afficher par exemple Dispo ou non dispo suivant l'ordre d'arrivé de la commande.  
 
Je m'explique, je me suis peut etre mal exprimé:
J'ai 3 commandes sur un meme produit (disons 1 pieces par commande) et j'en ai seulement 2 en stock, je voudrais que pour les 2 premieres commandes ca me dise que c'est dispo mais pas pour la derniere, car j'ai que 2 produits en stock et 3 produits ont été commandés.
 
Sachant que je vais gérer l'ordre par l'id da la commande, donc par chronologie.

Reply

Marsh Posté le 04-05-2008 à 15:08:53    

Si tu décrémentes ton stock au moment où est enregistrée la commande, je vois pas trop où est le problème.

 

Avec un stock de 1 pièce :

 

Une première commande est enregistrée, la pièce est disponible donc dans une association entre le produit et la commande tu peux avoir un champ disponibilité qui vaudra vrai pour ce premier cas.

 

Ensuite, à la seconde commande, tu te retrouve avec un stock à 0. Dans ce cas dans ton association entre le produit et la commande, ton champ indiquant la disponibilité vaut faux.

 

Et puis si tu dois gérer différente quantité de commande, à ce moment là ton champ indiquant la disponibilité des produits peut être un champ numérique indiquant combien de produits étaient disponibles à la commande.

 

Ce que je comprend pas, c'est qu'apparemment tu cherche à calculer les disponibilité après avoir enregistré les commandes alors qu'il est bien plus simple de les calculer au moment où tu enregistre la commande, non?


Message édité par dwogsi le 04-05-2008 à 15:09:58

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 04-05-2008 à 19:33:31    

Humm c'est pas facile a expliquer en fait.
L'application est une gestion commerciale developpée par mes soins.
Voila je cherche comment faire pour lorsque je mets a jour mon stock via mon admin, pour qu'a la volée, une fonction passe en boucle ma table produits_vendus pour modifier le statut et le passé en dispo, tout en prenant en compte la quantité en commande pour chaque produit et la quantité en stock.
 
Ex:  
stock = 20
 
Commande 1 = 10 (qté)
Commande 2 = 5 (qté)
Commande 3 = 7 (qté)
 
Je souhait faire une fonction qui va me donner pour resultat:
Commande 1 = Ok (donc on update le statut a dispo)
Commande 2 = OK (on update aussi le statut)
Commande 3 = pas dispo (car stock - 10 - 5 - 7 = -2 ) ==> En gros il ne reste pas assez de produit en stock pour mettre ce produit en dispo.
 
J'espere avoir été clair cette fois ci. ?
 
Merci de votre aide, car la je seche

Reply

Marsh Posté le 05-05-2008 à 01:59:17    

Je comprends toujours pas mieux :D
 
En voyant la chose simplement, tu as un stock. Si la quantité de la commande est inférieure ou égale à ce stock => ok
Sinon la commande ne peut être honorée en l'état.
 
Après si tu veux gérer une commande que tu peux pas honorer c'est autre chose. Mais au final t'as une quantité connue que tu gères en temps réel, tu sais donc avant de valider une commande si t'en a assez ou pas.

Reply

Marsh Posté le 05-05-2008 à 11:53:07    

En fait je m'embrouille tout seul !
Je vais essayer de faire ca autrement:
 
J'ai 3 tables: facture, facture_has_objet et stock
je voudrais faire la requête suivante
 
Sélectionner toutes les entrées dans la table facture
dont au moins une des entrées de la table facture_has_objet à une quantité inférieur à la quantité de ma table stock.
Sachant que s'il n'y pas d'équivalence entre la table facture_has_objet et stock, alors la valeur de stock = 0.
 
Je veux donc afficher toutes les commandes dont au moins un des produits commandé n'est pas en quantité suffisante dans le stock.
 
Table facture
idfacture
 
 
Table facture_has_objet
facture_idfacture
reference
quantite
 
Table stock
idstock
reference
quantite
 
Merci  de votre aide


Message édité par pipo83 le 05-05-2008 à 11:57:32
Reply

Marsh Posté le 05-05-2008 à 12:22:50    

Ah bah voilà un problème énoncé clairement :D
Tu crois pas que tu pourrais faire un effort de réflexion à :??: Et au passage c'est du sql pas du php :o
 

Reply

Marsh Posté le 05-05-2008 à 12:28:18    

Code :
  1. SELECT
  2.  f1.idFacture
  3. FROM
  4.  facture f1
  5.  INNER JOIN facture_has_object h1 ON h1.facture_idFacture = f1.idFacture
  6. WHERE
  7.  h1.quantite > (
  8.   SELECT
  9.     coalesce(s.quantite,0) - sum(h2.quantite)
  10.   FROM
  11.     facture_has_object h2
  12.     LEFT OUTER JOIN stock s ON s.reference = h2.reference
  13.   WHERE
  14.     h2.facture_idFacture < f1.idFacture
  15. )


ça doit faire ce que tu demandes, aux erreurs de syntaxe près.
Par contre, les perfs de cette requête vont être absolument lamentables. Pense à bien mettre tes indexs sur tous les champs où cela sera nécessaire.
Si c'est encore trop lent, revois la structure de ta base :o


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 05-05-2008 à 16:34:50    

Je suppose que ligne 14 il faut lire = à la place de <

Reply

Marsh Posté le 05-05-2008 à 16:34:50   

Reply

Marsh Posté le 05-05-2008 à 16:45:48    

Le code que tu m'as donné ne me retourne pas le résultat souhaité

 

Ce que je veux faire c'est afficher toutes les commandes dont au moins un des produits commandé n'est pas en quantité suffisante dans le stock.

 

Sachant que la table stock est alimentée à a chaque fois que je rentre un produit en stock (reception), par contre si un produit en commande n'a jamais été receptionné, il n'a pas d'entrée dans cette table stock.

 


Voila mon code de départ avant que je ne me demande si on ne pouvais pas faire ca de facon plus propre, ca va peut etre vous aider à comprendre ce que je cherche a faire

 


Code :
  1. <?php
  2. $sql = "SELECT * FROM facture LEFT JOIN facture_has_objet ON facture.idfacture = facture_has_objet.facture_idfacture
  3. WHERE facture.etatcomfact = '1' ORDER BY facture.idfacture DESC";
  4. $req = mysql_query($sql) or die(mysql_error());
  5. echo $sql;
  6. ?>
  7. <table width="100%" border="1" cellspacing="2" cellpadding="2">
  8.   <tr>
  9.     <td width="15%">ID cde</td>
  10.     <td width="13%">Ref client</td>
  11.     <td width="13%">reference</td>
  12.     <td width="39%">Désignation</td>
  13.     <td width="11%">qt&eacute;</td>
  14.     <td width="9%">stock</td>
  15.   </tr>
  16. <?php
  17. while($commande = mysql_fetch_array($req)) {
  18. $sql_stock = "SELECT * FROM stock WHERE reference = $commande[reference]";
  19. $req_stock = mysql_query($sql_stock);
  20. $stock = @mysql_fetch_array($req_stock);
  21.  if (isset($stock['quantite'])) {
  22.  $dispo = $stock['quantite'];
  23.  } else {
  24.  $dispo = 0;
  25.  }
  26.  if ($dispo < $commande['quantite']) {
  27. ?>
  28.   <tr>
  29.     <td><?php echo $commande['facture_idfacture'];?></td>
  30.     <td><?php echo $commande['ref_client'];?></td>
  31.     <td><?php echo $commande['reference'];?></td>
  32.     <td><?php echo $commande['facture_description'];?></td>
  33.     <td><?php echo $commande['quantite'];?></td>
  34.     <td align="center"><?php echo $dispo;?></td>
  35.   </tr>
  36. <?php
  37. }
  38. }
  39. ?>
  40. </table>

Message cité 1 fois
Message édité par pipo83 le 05-05-2008 à 16:47:00
Reply

Marsh Posté le 05-05-2008 à 20:11:52    

Je pense que tu devrais apprendre les bases du SQL...  :whistle:  
http://sql.developpez.com/sqlaz/jointures/


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 06-05-2008 à 16:27:06    

Merci du conseil mais j'ai deja regardé par ici !
 
Si je demande un peu d'aide sur ce site c'est que je n'y suis pas parvenu par mes moyens. Effectivement je ne maitrise pas trop la partie jointure et sous requete.


Message édité par pipo83 le 06-05-2008 à 16:34:23
Reply

Marsh Posté le 06-05-2008 à 16:49:48    

pipo83 a écrit :

Le code que tu m'as donné ne me retourne pas le résultat souhaité


Ouais bin malgré toutes tes explications, j'arrive toujours pas a voir le résultat que tu souhaites obtenir.

pipo83 a écrit :

Ce que je veux faire c'est afficher toutes les commandes dont au moins un des produits commandé n'est pas en quantité suffisante dans le stock.


Oui mais le problème vu la structure de ta bdd c'est que la table stock ne contient pas le stock mais la somme des entrées sans tenir compte des  sorties ( ou alors j'ai rien compris).
Admettons la situation suivante:
1/ Ajout de 10 pour la reference 1
2/ Ajout de 5 pour la référence 1
3/ Commande de 12 pour la référence 1
4/ Ajout de 3 pour la référence 1
D'après tes explications, dans la table stock pour la référence 1, j'aurais 18 en quantité au lieu de 6.
Donc pour savoir si le stock est suffisant, il faut prendre en compte les factures précédentes. Enfin c'est ce que j'avais compris de ton "apres decompte des references suivant leur ID ASC".
Et bien la requête donnée plus haut c'est exactement ce qu'elle fait.
Le > avait pour but de remonter les factures non couvertes par le stock, si tu veux celles couvertes remplace le par <=

 

Si maintenant ta table stock est toujours à jour, une simple jointure suffit:

Code :
  1. SELECT
  2.       *
  3.      FROM
  4.       facture f1
  5.       INNER JOIN facture_has_object h1 ON h1.facture_idFacture = f1.idFacture
  6.       LEFT OUTER JOIN stock s ON s.reference = h1.reference
  7.      WHERE
  8.       h1.quantite > coalesce(s.quantite,0)


Message édité par anapajari le 06-05-2008 à 16:50:47

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 06-05-2008 à 17:30:05    

Citation :

Oui mais le problème vu la structure de ta bdd c'est que la table stock ne contient pas le stock mais la somme des entrées sans tenir compte des  sorties ( ou alors j'ai rien compris).


 
 
Ma table stock contient bien la valeur du stock et non pas les entrées. En fait cette table stock je la mets a  jour quand dans mon admin je valide la reception du produit.  Par contre si une référence n'a jamais étée receptionné dans mon admin, elle n'est pas présente dans la table stock, car je ne l'ai jamais recue !
 
Je ne cherche a faire de décompte de stock mais a afficher dans un tableau la liste des commandes dont au moins un des produits (de la table facture_has_objet) n'est pas en quantité suffisante (dans la table stock) ou dont la référence n'a pas été trouvée dans la table stock (c'est la cas par ex des références que je n'ai jamais validé comme reçues dans mon admin)


Message édité par pipo83 le 06-05-2008 à 17:33:10
Reply

Marsh Posté le 08-05-2008 à 21:30:30    

Merci Anapajari !
J'ai réussi en bidouillant avec ta réponse.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed