Voici un petit morceau pour expliquer mon problème pour les produits qui ont la ligne Salami et le produit Mazraa le résultat correct doit etre comme ça comme dans la base de données
On peut voir que dans ce json il ya des problèmes:
1/ des produits ont la meme ligne et produit mais sont séparés dans des lignes json séparées.
2/ pour le calcul de quantité chaque produit qui est a une heure ou date différente est dans une ligne json séparée.
Ce que je cherche
le calcul de quantité pour chaque mois dans le json doit etre la somme des qte (somme de chaque mois séparés)pour chaque produits identiques dans la ligne et le produit
- il n'est pas important quand on va grouper les produit qui ont la meme ligne et produits de remplacer quelques données comme la date et heure puisque les porduits identiques(ligne,produit) peuvent prendre les données du premier produit du groupes des produits identiques.
- seulement la partie mois qui va changer de calcul puisque pour chaque groupe de produit identique:
pour le mois 1 = qte(prod1 dans le mois 1) + qte(prod2 dans le mois 2) + ......
....
pour le mois 12 = qte(prod1 dans le mois 12) + qte(prod2 dans le mois 12) + ......
Explication avec json:
Le résultat doit avoir la meme structure du json suivant puique le but et seulement de grouper et corriger les calquls des qte dans chaque mois:
On peut voir que le groupement a été bien passé et le json a gardé la meme structure mais le plus important est que les calculs de qte pour chaque mois est correcte maintenant puisque dans la bd il ya deux produits Mazraa ont une qte pour le mois 8 100,220 = 100+ 220 = 320
et ont un seul produit Mazraa qui aussi une qte mais dans le mois 10 alors 250 = 250
tous ça est montré dans le json.
Je suis entrain de chercher une solution pour obtenir le json que je cherche depuis une semaine mais c'est trop complexe.
Voici la partie PHP:
public function getProductsStatsByMonths(){
$today = date("Y-m-d");
$date_arr = explode("-", $today);
$year = $date_arr[0];
$month = $date_arr[1];
$day = $date_arr[2];
$prods = array();
$months = array(
1 ,
2 ,
3 ,
4 ,
5 ,
6 ,
7 ,
8 ,
9 ,
10 ,
11 ,
12
);
$lignes = array();
$products = array();
$prodmonths = array();
$final = array();
$st = $this->conn->prepare("SELECT ligne from production group by ligne");
$st->execute();
while($row = $st->fetch(pdo::FETCH_ASSOC)){
array_push($lignes,$row["ligne"]);
}
foreach ($lignes as $ln){
$stmt = $this->conn->prepare("SELECT qte as total , id ,ligne, produit, date, heure FROM production where YEAR(date) = ? and ligne= ? ");
$stmt->execute([$year,$ln]);
$products = [];
while($row = $stmt->fetch(pdo::FETCH_ASSOC)){
$p = new ProductsByCategory($row["id"],$row["ligne"],$row["produit"],$row["date"],$row["heure"],$row["total"],-1,$year);
$date_arrrow = explode("-", $row["date"]);
$rowmonth = $date_arrrow[1];
$prodmonths = [];
foreach ($months as $month){
if(($rowmonth == $month) ){
array_push($prodmonths,new Months($month,(int) $row["total"]));
}else if ($rowmonth != $month){
array_push($prodmonths,new Months($month,0));
}
}
$p->months = $prodmonths;
array_push($products,$p);
}
$a = new ProductionByMonth($ln,$products);
array_push($final,$a);
}
echo json_encode($final);
}
le but majeur est de corriger les calculs et de grouper avec conserver la structure génerale du array json comme j'ai montré dans le json cible que je voudrais obtenir.
J'éspere que je vais trouver une solution puisque je suis entrain de chercher plus d'une semaine.
A voir également:
Filtrer et grouper un array json et faire des calculs php
Comment penses tu que nous puissions te répondre ... vu comment est écrite ta question et vu les code alambiqué que tu nous montres....
Sans parler du fait que nous ne savons rien de la structure de ta bdd ni de ce qu'elle contient
On ne sait pas non plus ce que font tes class ProductsByCategory .. ProductionByMonth ...
Et enfin.. faire des requêtes dans une boucle .. aie.. mauvaise pratique ...
Je pense que tu pourrais obtenir le résultat souhaité en faisant déjà la bonne requête...
Il ne resterait plus qu'à traiter l'array obtenu pour le remettre en forme comme tu le désires.
Déjà, que donne la requête ( à faire directement dans ta bdd via phpmyadmin par exemple.. )
SELECT YEAR(date) as Annee
, MONTH(date) as Mois
, DATE_FORMAT(date,'Ym') as YM
, SUM(qte) as total ,
, ligne
, produit
,date
, heure
FROM production
GROUP BY DATE_FORMAT(date,'Ym'), line, produit
Avec une requête de ce genre, tu devrais approcher du résultat souhaites ( faudra peut-être jouer sur le GROUP BY (en inversant l'ordre des champs ))
Bonjour Jordane 45,
merci pour votre réponse
la structure de la bd:
le problème dans fetchAll() est qu'elle va etre plus difficile a traiter parceque il y'a beaucoup de array_push etc ..
pour la classe ProductsBYCategory:
<?php
class ProductsByCategory {
//atributes
public $id;
public $ligne;
public $produit;
public $date;
public $heure;
public $qte;
public $months = array();
public $year;
//constructor
public function __construct($id,$ligne,$produit,$date,$heure,$qte, $months, $year) {
$this->id = $id;
$this->ligne = $ligne;
$this->produit = $produit;
$this->date = $date;
$this->heure = $heure;
$this->qte = $qte;
$this->months = $months;
$this->year = $year;
}
}
Pour la classe getProductsSTatsBYMonths:
pour la classe ProductsBYCategory:
<?php
class ProductionByMonth {
//atributes
public $ligne;
public $products;
//constructor
public function __construct($ligne,$products) {
$this->ligne = $ligne;
$this->products = $products;
}
}
}
J'ai essayé avec group by mais cela va écraser les qte lors de la requete quand il y'a des produits qui ont le meme ligne et produit mais dans une date ou heure différente , c'est pourquoi je préfere le traitement de groupement par array, et grouper tous les données identiques dans les deux champs(ligne,produit) pour calculer correctement les qte mois par mois
J'ai tout essayé pour une semaine mais vraiment j'ai échoué.
J'ai essayé avec group by mais cela va écraser les qte lors de la requete quand il y'a des produits qui ont le meme ligne et produit mais dans une date ou heure différente ,
Tu as regardé la requête que je t'ai envoyé ??
Tu as vu que dans le group by j'y ai mis plusieurs champs ???
L'as tu , au moins, testé ???
https://forums.commentcamarche.net/forum/affich-37310301-extraire-les-produits-qui-n-ont-pas-une-qte-dans-un-mois-donnee#1
??
merci pour votre réponse
la structure de la bd:
le problème dans fetchAll() est qu'elle va etre plus difficile a traiter parceque il y'a beaucoup de array_push etc ..
pour la classe ProductsBYCategory:
Pour la classe getProductsSTatsBYMonths:
pour la classe ProductsBYCategory:
J'ai essayé avec group by mais cela va écraser les qte lors de la requete quand il y'a des produits qui ont le meme ligne et produit mais dans une date ou heure différente , c'est pourquoi je préfere le traitement de groupement par array, et grouper tous les données identiques dans les deux champs(ligne,produit) pour calculer correctement les qte mois par mois
J'ai tout essayé pour une semaine mais vraiment j'ai échoué.
Tu as regardé la requête que je t'ai envoyé ??
Tu as vu que dans le group by j'y ai mis plusieurs champs ???
L'as tu , au moins, testé ???