PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 20-10-2011 20:03:19

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Calcul d'un indice de jour de stock

Bonjour à tous,

Je m'arrache les cheveux pour calculer un indice de jour de stock, en gros, combien de temps en moyenne reste un enregistrement dans ma base de données.

J'ai donc une table avec deux champs DateTime sous Mysql : DateReception et DateExpedition

Voici la structure de ma table:
IdProduit - IdProvenance - NumeroLivraison - DateReception - DateExpedition

J'avoue que j'ai essayé des dizaines et des dizaines de solutions, mais aucunes ne fonctionnes.

Avez vous une solution concernant le problème cité ? Est ce qu'il faut à votre avis utiliser des fonctions Mysql (AVG, SUM) ou qu'il faut passer par PHP en sachant qu'il y a 150 - 200 enregistrements à comparer ?

J'ai essayé de faire des recherches sur google mais il y a à boire et à manger, j'ai un peu essayé tout ce que j'ai vue sans succès ...

Merci à vous,

Antho

Hors ligne

#2 21-10-2011 00:40:18

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Bonsoir,

Tu as de la chance, j'ai beaucoup de mal pour ne par dire énormément à résister à un problème MySQL. wink
Laisse moi reformuler pour voir si j'ai bien compris ta question, car c'est la première chose à faire pour réussir facilement à établir la bonne requête.
Tu veux connaître combien de temps en moyenne chaque produit de ta base de donnée reste en stock?, dis-nous juste à quel format tu veux que ce temps soit exprimé (en jours? en mois? sous la forme "1 mois, 3 jours et 5s" ou "1,4 mois", etc...)
Dans tous les cas, soit précis dans ta réponse, et on te sors d'affaire wink

EDIT: j'oubliais, tu veux la réponse pour une période donnée ? du style l'année en cours? etc.. (bcp plus pertinent sur une grosse base de données)

Dernière modification par Jc (21-10-2011 00:44:00)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 21-10-2011 10:04:22

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

A la bonheur ! J'en bave déjà lol !

Tu as parfaitement compris mon problème, je veux savoir en combien mes produits restent en stock mais pas forcément pour chaque produit mais pour le global.

Par exemple :

Sur les 5000 derniers enregistrements, les produits sont restés 14.7 jours en moyenne en stock

Je souhaite que le résultat soit exprimé en jours.

Merci JC !!

Hors ligne

#4 21-10-2011 17:51:47

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Calcul d'un indice de jour de stock

Saluton,
Faire un AVG d'un TIME_DIFF avec un formatage, y-a vraiment pas de quoi baver.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 21-10-2011 21:47:04

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Bonsoir,

Voici la requête pour les 5000 derniers enregistrements. Filtre à adapter selon tes besoins (année, etc...). Si tu as moins de 5000 enregistrements dans ta base fait un <= pour avoir un résultat.


SELECT  AVG(UNIX_TIMESTAMP(DateExpedition)-UNIX_TIMESTAMP(DateReception))/86400 FROM myTable GROUP BY IdProduit HAVING count(IdProduit)=5000 ORDER BY DateReception DESC
 

Note: la requête ci-dessus pour être exact ne recense pas les 5000 derniers enregistrements mais les 5000 dernières receptions, que tu peux remplacer par les expéditions.

++

Dernière modification par Jc (21-10-2011 21:55:36)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#6 22-10-2011 07:35:19

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

Maljuna Kris a écrit :

Saluton,
Faire un AVG d'un TIME_DIFF avec un formatage, y-a vraiment pas de quoi baver.

J'avais déjà essayé mais j'avais un résultat un peu bizarre (pour ne pas dire étrange :-p) ...

Jc a écrit :

Bonsoir,

Voici la requête pour les 5000 derniers enregistrements. Filtre à adapter selon tes besoins (année, etc...). Si tu as moins de 5000 enregistrements dans ta base fait un <= pour avoir un résultat.


SELECT  AVG(UNIX_TIMESTAMP(DateExpedition)-UNIX_TIMESTAMP(DateReception))/86400 FROM myTable GROUP BY IdProduit HAVING count(IdProduit)=5000 ORDER BY DateReception DESC
 

Note: la requête ci-dessus pour être exact ne recense pas les 5000 derniers enregistrements mais les 5000 dernières receptions, que tu peux remplacer par les expéditions.

++

Merci beaucoup JC

Je n'ai jamais vue une requête comme ça mais j'ai une question. Dois-je faire une boucle pour afficher le résultat si oui, comment afficher le résultat de façon groupé (par exemple : Moyenne: '14' jours) ? Car quand je fais un While, j'ai un résultat avec des milliers de chiffres hmm ...

Merci à vous pour votre aide, vous êtes incroyables !

Dernière modification par Anthotill (22-10-2011 07:42:40)

Hors ligne

#7 22-10-2011 07:52:59

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Bonjour,

En fait tu n'as besoin d'aucune boucle. La requête te retourne 1 seul résultat, celui que tu cherches.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#8 22-10-2011 08:00:26

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Pour répondre exactement à ta question, tu fais un truc du genre: 

print "moyenne=".$result[0]." jours";

.

Bonne continuation.

Dernière modification par Jc (22-10-2011 08:00:50)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 22-10-2011 08:05:43

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

Jc a écrit :

Pour répondre exactement à ta question, tu fais un truc du genre: 

print "moyenne=".$result[0]." jours";

.

Bonne continuation.

Merci tu es sympa.

A l'affichage j'obtiens : moyenne 0.00005787 jours roll

J'ai rajouté à la requête  WHERE DateExpedition != '0000-00-00 00:00:00' car parfois des produits (volés par exemple) ne sorte pas du stock côté logiciel (maaaalllhheereusement !)

Hors ligne

#10 22-10-2011 08:14:07

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

En fait la requête calcule le temps moyen en secondes, et c'est pour cela qu'il faut diviser par 86400 pour l'avoir en jours. Pour ta condition, je n'ai pas eu le temps de vérifier le comportement de la requête mais il te faut l'inclure dans le HAVING et non pas le rajouter dans un WHERE.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#11 22-10-2011 08:21:27

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

Jc a écrit :

il te faut l'inclure dans le HAVING et non pas le rajouter dans un WHERE.

J'aimerais comprendre, cela est-il plus performant ou c'est parce que c'est plus "propre" ?

Au niveau du résultat obtenu, en faisant ORDER BY DateEpexidiotn j'obtiens quelque chose de plus cohérent.

Jc a écrit :

Pour ta condition, je n'ai pas eu le temps de vérifier le comportement de la requête

Raison de plus pour te remercier infiniment de ton aide, prendre le temps que tu n'as pas pour m'aider (et aider les autres) c'est très gentil.

Dernière modification par Anthotill (22-10-2011 08:23:30)

Hors ligne

#12 22-10-2011 08:29:05

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Bon excuses ^^
Je viens de test, et il faut que tu fasses,


SELECT  AVG(UNIX_TIMESTAMP(DateExpedition)-UNIX_TIMESTAMP(DateReception))/86400 FROM myTable WHERE DateExpedition <> '0000-00-00 00:00:00'
 

Pour un tri sur les 5000 derniers enregistrements je reviens vers toi, car il faut passer par un autre style de requête et j'ai pas le temps maintenant.
Par contre elle est suffisante pour les tris normaux (année courrante, mois donné, etc...)

Dernière modification par Jc (22-10-2011 08:31:29)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#13 22-10-2011 08:32:05

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

Jc a écrit :

Bon excuses ^^

Lol ha non, je ne sais vraiment pas (il est vrai également que je n'ai jamais fait un HAVING de ma vie ...

Au vue de ta réponse, je n'ose même pas essayer ORDER BY DateExpedition LIMIT 5000 mad:mad: je vais attendre que tu es plus de temps lol

Hors ligne

#14 22-10-2011 08:49:47

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Bon, cette fois c'est testé, histoire de ne pas te faire languir.

1) La précédente est bonne pour tous les enregistrements de ta table et pour des tris normaux du style "WHERE DateExpedition BETWEEN x AND y" ...
2) pour le faire sur les 5000 derniers enregistrements, dans le même contexte que la première requête que je t'ai donné la voici (elle fonctionne^^)


SELECT  AVG(UNIX_TIMESTAMP(t1.DateExpedition)-UNIX_TIMESTAMP(t1.DateReception))/86400 as moy FROM (SELECT id, DateExpedition, DateReception FROM myTable GROUP BY id HAVING COUNT(id) =5000 AND DateExpedition<>'0000-00-00' ORDER BY DateReception DESC) as t1
 

Bonne continuation


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#15 22-10-2011 08:59:19

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

Jc a écrit :

Bon, cette fois c'est testé, histoire de ne pas te faire languir.

1) La précédente est bonne pour tous les enregistrements de ta table et pour des tris normaux du style "WHERE DateExpedition BETWEEN x AND y" ...
2) pour le faire sur les 5000 derniers enregistrements, dans le même contexte que la première requête que je t'ai donné la voici (elle fonctionne^^)


SELECT  AVG(UNIX_TIMESTAMP(t1.DateExpedition)-UNIX_TIMESTAMP(t1.DateReception))/86400 as moy FROM (SELECT id, DateExpedition, DateReception FROM myTable GROUP BY id HAVING COUNT(id) =5000 AND DateExpedition<>'0000-00-00' ORDER BY DateReception DESC) as t1
 

Bonne continuation

Poua ! une requête imbriquée (ci c'est comme ça que ça s'appel), ma hantise ! En tout cas elle fonctionne et je n'ai pas eu le temps de languir, ayant abandonné tout espoir de te voir revenir à la rescousse ! lol

Je pense qu'il faudrait que je m’intéresse à ce type de requête car je suis souvent obligé à faire plusieurs requête dans mes différents code.

Merci à toi c'est super !

Dernière modification par Anthotill (22-10-2011 09:01:31)

Hors ligne

#16 22-10-2011 09:23:02

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

re,

Si tu ne sais pas quoi faire, j'aime bien les chocolats wink l'adresse est sur mon site^^


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#17 27-10-2011 07:27:44

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

Salut,

Ça aurait été avec plaisir pour la boîte de chocolat lol mais malheureusement j'ai un petit bug.

Nous avons reçu une livraison aujourd'hui, l'indice de stock est passé d'une valeur cohérente (~15 jours) à 114.12 jours (il y avait 23 produits avant et nous en avons reçu 128) !

Voici mon code :
[code: php]           
<?php
require('include/connexion.php');   
$SQL_MOY_ROTATION = "
SELECT AVG(UNIX_TIMESTAMP(t1.DateExpedition)-UNIX_TIMESTAMP(t1.DateReception))/86400 as Resultat
FROM (SELECT id, DateExpedition, DateReception
FROM gstock_produits
GROUP BY id
HAVING COUNT(id) <= 5000 AND DateExpedition != '0000-00-00 00:00:00'
ORDER BY DateReception DESC) as t1";
$REQ_MOY_ROTATION = mysql_query($SQL_MOY_ROTATION) or die('Erreur SQL !<br SELECT>'.$SQL_MOY_ROTATION.'<br>'.mysql_error());
mysql_close($db);
               
$ResultatMoyenne = mysql_fetch_assoc($REQ_MOY_ROTATION);
               
echo '',$ResultatMoyenneRound = round($ResultatMoyenne['Resultat'], 2),'';
?>[/code]

Est ce qu'il y a quelques choses que j'ai mal fait ou ?

Dernière modification par Anthotill (27-10-2011 07:29:47)

Hors ligne

#18 27-10-2011 10:28:59

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Bonjour,

Je savais que j'allais te manquer...^^ big_smile
Parmis les 128 produits reçus combien ont été réexpédiés? Quelle est la valeur dans la DB de "DateExpedition" pour ces produits (les non réexpédiés)? serait-elle de type NULL?

Dernière modification par Jc (27-10-2011 10:31:01)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#19 27-10-2011 14:23:38

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Re,

D'ailleurs je viens de réaliser que ma question est inutile car si le résultat de ta requête a changé c'est que forcément tu as des dates d'expédition qui sont définies en NULL par défaut.
Outre le fait qu'il vaut 100 fois mieux de définir une date par défaut en '0000-00-00 00:00:00' qu'en NULL à partir du moment où elle est indéxée, je te laisse optimiser ta base comme tu l'entends.

Par contre voici la requête corrigée pour couvrir tous les cas de figure.


SELECT AVG(UNIX_TIMESTAMP(t1.DateExpedition)-UNIX_TIMESTAMP(t1.DateReception))/86400 as Resultat
FROM (SELECT id, DateExpedition, DateReception
          FROM gstock_produits
          GROUP BY id HAVING COUNT(id) <= 5000 AND (DateExpedition != '0000-00-00 00:00:00' OR DateExpedition NOT NULL)
          ORDER BY DateReception DESC) as t1
 

++

Dernière modification par Jc (27-10-2011 14:24:47)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#20 27-10-2011 14:29:11

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Allez encore une p'tite optimisation pour la route wink (nan nan c'est pas pour le chocolat smile )


SELECT AVG(UNIX_TIMESTAMP(t1.DateExpedition)-UNIX_TIMESTAMP(t1.DateReception))/86400 as Resultat
FROM (SELECT id, DateExpedition, DateReception
          FROM gstock_produits
          GROUP BY id
          HAVING COUNT(id) <= 5000 AND UNIX_TIMESTAMP(DateExpedition)>0
          ORDER BY DateReception DESC) as t1
 

Dernière modification par Jc (27-10-2011 14:30:04)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#21 27-10-2011 14:52:00

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

Jc a écrit :

Allez encore une p'tite optimisation pour la route wink (nan nan c'est pas pour le chocolat smile )


SELECT AVG(UNIX_TIMESTAMP(t1.DateExpedition)-UNIX_TIMESTAMP(t1.DateReception))/86400 as Resultat
FROM (SELECT id, DateExpedition, DateReception
          FROM gstock_produits
          GROUP BY id
          HAVING COUNT(id) <= 5000 AND UNIX_TIMESTAMP(DateExpedition)>0
          ORDER BY DateReception DESC) as t1
 

Merci pour ta réponse, avec la solution ci-dessous j'obtiens -3386 jours mad

Le champ DateExpedition est un datetime dont le default est 0000-00-00 00:00:00

Théoriquement, la valeur de Resultat ne doit pas être impactée par les DateExpedition qui ont comme valeur 000-00-00 00:00:00 puisqu'on les exclus de notre calcul.

La j'avoue que je ne sais pas quoi faire ni dire ....

Dernière modification par Anthotill (27-10-2011 14:52:25)

Hors ligne

#22 27-10-2011 15:00:06

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Bonjour,

Vérifie comment tes enregistrements ont été enregistrés... comme par exemple l'enregistrement d'une date de reception dans une date d'expédition d'où le résultat négatif et la prise en compte desdits enregistrements..

Dernière modification par Jc (27-10-2011 15:00:34)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#23 27-10-2011 15:10:43

Anthotill
Membre
Inscription : 14-03-2010
Messages : 81

Re : Calcul d'un indice de jour de stock

Jc a écrit :

Bonjour,

Vérifie comment tes enregistrements ont été enregistrés... comme par exemple l'enregistrement d'une date de reception dans une date d'expédition d'où le résultat négatif et la prise en compte desdits enregistrements..

Bien vue, la dernière livraison comporte des dates de Réception à 0000-00-00 00:00:00 ! Il y en a même beaucoup plus que ce que je pensais (134 en tout) c'est de ma faute j'ai oublié de remettre le NOW() dans mon insertion !

Si je les exclus en faisant dans le HAVING : AND UNIX_TIMESTAMP(DateReception)>0 ça n'a pas d'effet sur le résultat ?

Dernière modification par Anthotill (27-10-2011 15:13:09)

Hors ligne

#24 27-10-2011 15:49:19

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Bonjour,

Non il ne faut toucher à rien. Ta requête de production est la bonne donc on y touche pas.
Il te faut restaurer la cohérence de tes enregistrements.
On est à la limite du service commercial ^^
Si tu veux que j'intervienne sur ta base pas de soucis.
Sinon voici la méthode:
Il te faut agir directement dans ta base sur ton serveur ou via PHPmyAdmin et attention car il s'agit de données de production. Il te faudra donc intervenir uniquement sur les enregistrements corrompus, et par groupe de date. Tu réinitialises les dates d'expeditions, et tu remets à jour les bonnes dates de receptions sur les mêmes enregistrements.
N'intervient pas manuellement mais uniquement par requête en vérifiant les algos de ton process au préalable.
Par contre si tu te plantes et que tu n'as pas noté l'ordre de tes modifs et les requêtes exactes appliquées à ta base, je ne pourrais plus rien faire.

++

Dernière modification par Jc (27-10-2011 16:00:29)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#25 27-10-2011 15:58:52

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Calcul d'un indice de jour de stock

Re,

Un conseil, au lieu de mettre un now() dans ta requête d'insertion, fait le dans ta définition de champ. Mets DateReception en TIMESTAMP et comme premier TIMESTAMP dans le schéma de ta table et en valeur par défaut mets CURRENT_TIMESTAMP.
Ensuite à l'insertion, soit tu ne cites pas le champs soit tu mets NULL, et si tu veux mettre une autre date que now() tu mets la valeur que tu veux dans la requête d'insert.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums