Bonjour,
Voilà tout est dans le titre.
Je suis obligé de l afire plein de fois, ce qui me donne des temps de réponse très très long.
Notamment pour des tableaux à double entrée (état des vents par exemple)
Merci d'avance de votre aide.
Bonjour,
Voilà tout est dans le titre.
Je suis obligé de l afire plein de fois, ce qui me donne des temps de réponse très très long.
Notamment pour des tableaux à double entrée (état des vents par exemple)
Merci d'avance de votre aide.
Ben tu fais pas de boucles
Non, plus sérieusement, pourrais-tu être plus clair, nous montrer ton bout de code sql ... ainsi que ton SGBD.
Cdlt
Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !
Bonjour,
Avec une telle masse d'informations que tu nous fournis, c'est pas gagné.
Ok, merci de ton aide, voici un état des ventes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <table width="99%" cellpadding="0" cellspacing="0" border="1" bordercolor="#999999" style="empty-cells: show; border-collapse: collapse;"> <tr class="entete_tableau"> <td colspan="14" align="center">État des ventes</td> </tr> <tr class="entetecellule"> <td>Article</td> <?php //Boucle pour lister les mois $retour_mois = mysql_query("SELECT nom_mois, id_mois, num_mois FROM mois ORDER BY id_mois"); $mois = array(); while ($donnees_mois = mysql_fetch_array($retour_mois)) { $mois[$donnees_mois['id_mois']] = $donnees_mois['num_mois'];?> <td width="7%"><?php echo $donnees_mois['nom_mois']; ?></td> <?php } ?> <td width="5%">Total</td></tr> <?php $retour_article = mysql_query("SELECT id_article FROM article WHERE groupe_stat='$famille' AND groupe_produit='$sous_famille' ORDER BY id_article"); while ($donnees_article = mysql_fetch_array($retour_article)) { ?> <tr> <td align="left"> <?php echo $donnees_article['id_article']; ?> </td> <?php $retour_mois = mysql_query("SELECT nom_mois, id_mois, num_mois FROM mois ORDER BY id_mois"); while ($donnees_mois = mysql_fetch_array($retour_mois)) { ?> <td> <?php $retour_vente_mois = mysql_query(" SELECT SUM(quantite) AS somme FROM commande_detail cd JOIN commande c ON cd.num_cmde=c.num WHERE YEAR(c.date_commande)='$annee_rch' AND MONTH(c.date_commande)='".$donnees_mois['num_mois']."' AND cd.article='".$donnees_article['id_article']."' GROUP BY cd.article, MONTH(c.date_commande) ORDER BY cd.article, MONTH(c.date_commande)"); $donnees_vente_mois = mysql_fetch_array($retour_vente_mois); echo $donnees_vente_mois['somme']; ?></td> <?php } ?> </tr><?php } ?> </table> </center>
En fait je liste les mois, puis les produits, et pour chaque croisement je fais la somme donc si 100 produits alors 12*100 requêtes !
Voilà, merci d'avance.
Heu, c'est clair que c'est très crade ! :S
Je pense qu'il y a une solution en sql, au lieu de faire 3 appels de requêtes (une pour les mois, une autre pour les articles, et une dernière pour leur combinaison ...), si tu fais une seule requête avec un GROUP BY, ca devrait marcher je crois.
SELECT ...
FROM ...
WHERE ...
GROUP BY id_mois, id_article
Je suis un peu rouillé en sql, mais un truc comme ça devrait te permettre d'alléger sérieusement tes temps de réponses ...
Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !
Oui merci, en fait je l'ai déjà fait :
Le soucis est dans l'affichage des données,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 $retour_vente_mois = mysql_query("SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois FROM commande_detail cd JOIN commande c ON cd.num_cmde=c.num JOIN article a ON cd.article=a.id_article WHERE YEAR(c.date_commande)='$annee_rch' GROUP BY article, MONTH(c.date_commande) ORDER BY article, MONTH(c.date_commande)"); while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois)) { $id_article = $donnees_vente_mois['article']; $somme = $donnees_vente_mois['somme']; $mois = $donnees_vente_mois['mois']; $articles[$id_article][$mois] = $somme; }
Comment faire un jolie tableau avec cette reqûete ?
Là je t'avoues que c'est une autre paire de manches ...
Comme ça je ne vois pas trop désolé, il faut s'y pencher sérieusement dessus et là je n'en ai pas le courage dsl ...
Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !
Oui je suis d'accord avec toi, mias le souci (le vrai) c'est comment dire que pour chaqsue mois tu créé une colonne et pour chaque produit tu créé une ligne.
Merci d'avance!
Eh oui lespoches, ce n'est pas aussi facile que cela ... Je vais essayer de trouver une solution ce matin ... Dis moi si tu y arrives.
pour m'aider, peux-tu me donner un exemple de résultats que tu as stp ... ainsi que l'idée du tableau que tu voudrais ?
Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !
Oui alors les résultats sont du style :
article;mois;montant
Donc pour chaque article je dois avoir 12 lignes avec le montant pour chqaue mois.
Ce qui fait un truc du style :
E567;01;4
E567;02;2
E567;03;6
E567;04;5
Et j'aimerais avoir en colonne les mois et en ligne les articles.
Donc pour chaque ligne il faut comparer avec l'avant ernière afin de voir si elle est similaire, si oui je créé une colonne, si non je créé une ligne.
Un truc dans ce genre... pas gagngé...
Pour ce faire, tu vas devoir en fait récupérer avant la liste des mois et la liste des articles ..., et ensuite tu pourras faire une correspondance !
Ou un truc dans le genre, attention, je n'ai pas testé je n'ai pas Apache sous la main ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 <?php $retour_mois = mysql_query("SELECT nom_mois, id_mois, num_mois FROM mois ORDER BY id_mois"); $retour_article = mysql_query("SELECT id_article FROM article WHERE groupe_stat='$famille' AND groupe_produit='$sous_famille' ORDER BY id_article"); $retour_vente_mois = mysql_query("SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois FROM commande_detail cd JOIN commande c ON cd.num_cmde=c.num JOIN article a ON cd.article=a.id_article WHERE YEAR(c.date_commande)='$annee_rch' GROUP BY article, MONTH(c.date_commande) ORDER BY article, MONTH(c.date_commande)"); $tab_article = new array(); $tab_somme = new array(); $i = 0; while ($donnees_articles = mysql_fetch_array($retour_article)) { $tab_article[$i] = $donnees_articles['article']; $i++; } // On remet le compteur i à 0 $i = 0; while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois)) { $tab_somme[$i] = $donnees_vente_mois['somme']; $i++; } // On remet le compteur i à 0 $i = 0; $nb_lignes = mysql_num_rows($retour_article); $nb_colonnes = mysql_num_rows($retour_mois); ?> <table width="99%" cellpadding="0" cellspacing="0" border="1" bordercolor="#999999" style="empty-cells: show; border-collapse: collapse;"> <tr class="entete_tableau"> <td colspan="14" align="center">État des ventes</td> </tr> <tr class="entetecellule"> <td>Article \ Mois</td> <?php $cpt_somme = 0; while ($donnees_mois = mysql_fetch_array($retour_mois)) { echo "<td>".$donnees_mois['mois']."</td>"; } for($cpt_ligne = 0; $cpt_ligne < $nb_lignes; $cpt_ligne++) { echo "<tr><td>".$tab_article[$cpt_ligne]."</td>"; for($cpt_colonne = 0; $cpt_colonne < $nb_colonnes; $cpt_colonne++) { echo "<td>"; echo $tab_somme[$cpt_somme]; echo "</td>"; $cpt_somme++; } } ?>
PAR CONTRE, il est très important d'ordonner les articles, les mois de la même façon que quand tu récupères les sommes ...
Essaye ça, tu me dis ce que ça donne.
Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !
Merci beaucoup, ça ma avancée pas mal.
Alors le tableau se construit bien, en ligne et en colonne.
Le problème maintenant est plutôt des données qui sont à l'intérieur...
En effet j'ai des données partout alors que pour le mois de décembre notamment il n'y a pas encire eu de vente...
Voilà mon (enfin ton) code :
Merci d'avance de ton aide !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 $retour_mois = mysql_query(" SELECT nom_mois, id_mois, num_mois FROM mois ORDER BY id_mois "); $retour_article = mysql_query(" SELECT id_article FROM article WHERE groupe_stat='$famille' AND groupe_produit='$sous_famille' ORDER BY id_article "); $retour_vente_mois = mysql_query(" SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois FROM commande_detail cd JOIN commande c ON cd.num_cmde=c.num JOIN article a ON cd.article=a.id_article WHERE YEAR(c.date_commande)='$annee_rch' GROUP BY article, MONTH(c.date_commande) ORDER BY article, MONTH(c.date_commande) "); $tab_article = array(); $tab_somme = array(); $i = 0; while ($donnees_article = mysql_fetch_array($retour_article)) { $tab_article[$i] = $donnees_article['id_article']; $i++; } // On remet le compteur i à 0 $i = 0; while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois)) { $tab_somme[$i] = $donnees_vente_mois['somme']; $i++; } // On remet le compteur i à 0 $i = 0; $nb_lignes = mysql_num_rows($retour_article); $nb_colonnes = mysql_num_rows($retour_mois); ?> <table width="99%" cellpadding="0" cellspacing="0" border="1" bordercolor="#999999" style="empty-cells: show; border-collapse: collapse;"> <tr class="entete_tableau"> <td colspan="14" align="center">État des ventes</td> </tr> <tr class="entetecellule"> <td>Article \ Mois</td> <?php $cpt_somme = 0; while ($donnees_mois = mysql_fetch_array($retour_mois)) { echo "<td>".$donnees_mois['nom_mois']."</td>"; } echo "</tr>"; for($cpt_ligne = 0; $cpt_ligne < $nb_lignes; $cpt_ligne++) { echo "<tr><td>".$tab_article[$cpt_ligne]."</td>"; for($cpt_colonne = 0; $cpt_colonne < $nb_colonnes; $cpt_colonne++) { echo "<td>"; echo $tab_somme[$cpt_somme]; echo "</td>"; $cpt_somme++; } }
He he oui, le problème avec cette méthode est qu'il faut qu'il y ait une somme pour tous les articles tous les mois ... Je cherche une autre façon !
Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !
Oui tout a fait.
Mais je suis dévutant et je ne vois pas ou tu fais le croisement des données, c'est à dire je veux la somme pour tel mois et tel article.
Je n'arrive pas à comprendre cette partie là, peux tu m'éclairer ?
Merci d'avance de ton aide !
Oublie pas que pour améliorer les performances de tes requêtes, tu peux (entre autres) ajouter des INDEX sur les colonnes "clés", c'est à dire celles sur lesquelles portent tes clauses WHERE.
"J'adorerais changer le monde, mais pas moyen de mettre la main sur le code source."
chez moi
Oui je sais et c'est fait mais le problème c'est que 6 utilisateurs par 100 articles ça fait 600 fois la requête...
Donc les temps de réponse ne sont pas à la joie !
Je cherche encore, Merci d'avance !
Bonjour,
Voici un petit code bricolé en vitesse et à adapter :
Il sous-entend que ta requête, reprise dans le code et commentée, fonctionne correctement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 <?php function creeTableau() { //-- tableau pour simuler la BDD --------------------- $item = array(); $item['E567'][1] = 4; $item['E567'][2] = 2; $item['E567'][3] = 6; $item['E567'][4] = 5; $item['E567'][10] = 12; $item['E567'][12] = 8; $item['C456'][2] = 4; $item['C456'][5] = 2; $item['C456'][7] = 6; $item['C456'][8] = 5; $item['C456'][9] = 12; $item['C456'][11] = 8; //----------------------------------------------------- //-- tableau modèle de colonnes de mois initialisé avec un espce ----- $ligneModele = array_fill(1, 12, ' '); //----------------------------------------------------- //-- tableau qui sera rempli avec les résultat de la requête -------- //-- dans cet exemple avec le tableau $item -------------------------- $ligneTableau = array(); //----------------------------------------------------- //-- tableau qui sera le retour de fonction pour affichage ------------ $tableau = array(); //----------------------------------------------------- /* $sql = 'SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois FROM commande_detail cd JOIN commande c ON cd.num_cmde=c.num JOIN article a ON cd.article=a.id_article WHERE YEAR(c.date_commande) = \'' . $annee_rch . '\' GROUP BY article, MONTH(c.date_commande) ORDER BY article, MONTH(c.date_commande)'; $result = mysql_query($sql); while ($item = mysql_fetch_array($result)) { if (! isset($ligneTableau[$item['article']])) { $ligneTableau[$item['article']] = $ligneModele; } $ligneTableau[$item['article']][$item['mois']] = $item['somme']; } */ //-- cette partie est à remplacer par les lignes commentées ci-dessus --------------- foreach($item as $cle => $valeur) { if (! isset($ligneTableau[$cle])) { $ligneTableau[$cle] = $ligneModele; } foreach($item[$cle] as $mois => $somme) { $ligneTableau[$cle][$mois] = $somme; } } //------------------------------------------------------------------------------------ foreach ($ligneTableau as $cle => $valeur) { $tableau[] = '<tr>' . "\n" . '<td>' . $cle . '</td>' . "\n" . '<td>' . implode('</td>' . "\n" . '<td>', $ligneTableau[$cle]) . '</td>' . "\n" . '</tr>' . "\n"; } //-- on prépare l'affichage du tableau ------------------------------------------------ return implode('', $tableau); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link rel="stylesheet" href="calendrier.css" type="text/css" /> <title>test</title> <script type="text/javascript"> </script> </head> <body onload="// init()"> <table align="center" border="1"> <tr> <td>article</td> <td>janvier</td> <td>février</td> <td>mars</td> <td>avril</td> <td>mai</td> <td>juin</td> <td>juillet</td> <td>août</td> <td>septembre</td> <td>octobre</td> <td>novembre</td> <td>décembre</td> </tr> <?php echo creeTableau(); ?> </table> </body> </html>
Tu peux faire fonctionner directement ce code afin d'en voir le résultat.
Merci je viens de faire fonctionner le code est cela ressemble tout à fait à ce que je souhaite.
En revanche est-il possible à parti de cette exemple de générer dynamiquement l'affichage des colonnes.
En effet là les mois sont saisies à la main mais on peut imaginer les faires sortir d'une table, ou même ne pas avoir les mois mais des utilisateurs.
Merci d'avance je me penche sur ton code pour l'adapter.
Je reste ouvert à toutes solutions; merci encore !
Je pense que déjà, pour faire plus simple, il faudrait que tu renvoie une valeur pour chaque mois et article.
Ex : tu as 3articles et 2mois (je sais mon année est très courte ^^), tu fais ça :
Année\Mois | Mois1 | Mois2
Art1 | 1 | 2
Art2 | 4 | 0
Art1 | 0 | 3
Dans mon exemple, j'aurais bien une ligne même si je n'ai pas eu de vente d'articles (mais j'aurais 0). Celà pourrait permettre d'éviter de mettre des résultats à des mauvais endroits ...
Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager