|
Publicité | ||||||||||||||||||||||
|
|
#1 |
![]() Date d'inscription: novembre 2007
Messages: 83
|
Bonjour,
Je cherche à savoir si je vais pouvoir aisément changer l'orientation d'une colonne d'un tableau pour le passer à plusieurs dimensions. Imaginez à l'origine un tableau avec les éléments suivants en colonne : "Type de produit", "Produit", "Année", "Semaine", "Chiffre d'affaires". Les années et les semaines apparaissent en ligne et je veux au contraire les faire apparaitre en colonne pour avoir au final un tableau avec la catégorie, le produit puis une colonne pour chaque couple année/semaine, sachant que je ne connais pas à l'avance le nombre de couple année/semaine. L'intersection indique le chiffre d'affaires. Je ne sais pas si c'est possible, j'imagine que oui, dans ce cas vers quoi dois je me diriger pour trouver la solution, javascript, php (et/ou le framework, ici cakephp), sql, si quelqu'un sait m'orienter cela me fera gagner du temps. Merci |
|
|
|
|
|
#2 |
|
Membre habitué
![]() Date d'inscription: mai 2009
Localisation: Ile de france
Âge: 22
Messages: 160
|
Salut,
Pour faire ton tableau, le plus simple sera du html. Pour le contenu, ça dépend comment tu comptes récupérer t'es données : tu les rentres à la main, tu effectues une requête sur une bdd, tu incrémentes un tableau en php, ... Selon la solution, la méthode sera différente (enfin entre html et php). je te déconseille le javascript pour gérer le contenu. Pour ton tableau, je pense que tu veux obtenir quelque chose comme ça : Code html :
<table> <tr> <td> </td> <td>Année</td> <td>Semaine</td> </tr> <tr> <td>Type de pproduit</td> <!-- t'es données sont insérées ici --> </tr> <tr> <td>Produit</td> <!-- et ici --> </tr> </table> |
|
|
|
|
|
#3 |
![]() Date d'inscription: novembre 2007
Messages: 83
|
Bonjour,
Je me suis mal expliqué désolé. En effet les données proviennent d'une requête, plus précisément via php (avec le framework cakephp) et celles-ci à l'origine ont un format classique qui correspondrait au tableau suivant : Code :
<table> <tr> <td>Type de Produit</td> <td>Produit</td> <td>Annee</td> <td>Semaine</td> <td>Chiffre d'affaires</td> </tr> <tr> <td>sejour</td> <td>Hotel x</td> <td>2009</td> <td>5</td> <td>2589</td> </tr> </table> Code :
<table> <tr> <td rowspan="2"> <p>Type de Produit</p> </td> <td rowspan="2"> <p>Produit</p> </td> <td>2009</td> <td>2009</td> <td>2009</td> </tr> <tr> <td>5</td> <td>6</td> <td>7</td> </tr> <tr> <td>sejour</td> <td>hotel x</td> <td>1568</td> <td>2589</td> <td>3456</td> </tr> <tr> <td>croisiere</td> <td>croisiere y</td> <td>4524</td> <td>1587</td> <td>5264</td> </tr> </table> Je me demande cependant s'il n'y a pas un moyen via javascript mais n'y connaissant rien ce ne sont que des hypothèses. Si quelqu'un à des idées, merci. |
|
|
|
|
|
#4 |
|
Membre habitué
![]() Date d'inscription: mai 2009
Localisation: Ile de france
Âge: 22
Messages: 160
|
En effet c'est un peu plus compliqué que ce que je pensais.
Quand tu effectues ta requête, qu'est ce que tu récupères ? (année, semaine, produit, type de produit, etc) J'avais effectué un traitement qui créer un tableau automatiquement, un peu ce que tu veux faire (bon le mien était dans l'autre sens, mais ça revient au même). Pour ma part, je l'ai fait en php. Je peux essayer de te donner un coup de main mais ça risque d'être un peu long quand même. Doki. |
|
|
|
|
|
#5 |
![]() Date d'inscription: novembre 2007
Messages: 83
|
Bonjour,
La requête récupère effectivement les données en ligne, cad : "SELECT [type de produit ], [produit] , [année], [semaine], [Chiffre d'affaires] FROM ..." En fait pour le moment je ne suis pas encore face aux problèmes mais j'anticipe et je me pose les questions à venir. Pour le moment je ne vois que deux solutions : - soit créer dynamiquement la requête en php (en espérant que je puisse le faire dans cakephp) - soit créer cela sous mysql avec du sql dynamique (c'est surtout là que je creuse car je n'y connais rien en développement web, enfin pour le moment) Merci pour ton aide. |
|
|
|
|
|
#6 |
|
Membre habitué
![]() Date d'inscription: mai 2009
Localisation: Ile de france
Âge: 22
Messages: 160
|
Avec cake, c'est tout a fait possible. Je l'ai déjà utiliser pour ce genre de requête.
Pour l'affichage, effectivement tu peux utiliser du sql dynamique, mais là je ne pourrais pas être d'une grande aide. Je ne connais pas du tout. Si tu veux le faire en php (ce que j'avais fait), il faudra imbriquer plusieurs boucle pour générer automatiquement ton tableau. |
|
|
|
|
|
#7 | |
|
Nouveau membre du Club
![]() Date d'inscription: février 2005
Localisation: Toulouse
Âge: 22
Messages: 58
|
Citation:
Je ne suis pas sûr d'avoir entièrement compris ce que tu veux faire mais je pense que le plus simple est de manipuler le tableau retourné par la méthode find() de ton modèle, afin qu'il ait la forme désirée. Tu peux faire ceci soit dans le modèle, le contrôleur voir même la vue ... mais là celà dépend du meilleur endroit (conceptuellement) où cette transformation doit avoir lieu, en fonction de la signification qu'elle a : si ce n'est que de l'affichage alors il faut le faire dans la vue (avec un Helper par exemple), autrement une méthode "getCustomFormat" du modèle serait plus appropriée. Pour effectuer la manipulation du tableau de résultat je t'invite à regarder du côté de la librairie Set du framework. Elle propose de nombreuses méthodes permettant de changer l'arborescence de tableaux de manière intuitive, voir l'exemple de Set::combine(). Ceci n'est qu'un avis, mais je le répète je ne suis pas sûr d'avoir saisi ce que tu souhaites faire ... Pierre |
|
|
|
|
|
|
#8 |
![]() Date d'inscription: novembre 2007
Messages: 83
|
Bonjour
Merci pour ton aide, je vais regarder cela en détail dès que j'ai un moment. Depuis j'ai creusé un peu et j'ai trouvé le début pour le faire sous php en créant dynamiquement la requête, je me suis aidé du tuto ici : http://moko.developpez.com/articles/...ise-php-mysql/ Un exemple vaut mieux qu'un long discours : D'abord la base de données : Code :
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `produit` varchar(50) COLLATE latin1_general_cs DEFAULT NULL, `annee` smallint(6) DEFAULT NULL, `semaine` varchar(2) COLLATE latin1_general_cs DEFAULT NULL, `CA` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs; -- Contenu de la table `test` INSERT INTO `test` (`id`, `produit`, `annee`, `semaine`, `CA`) VALUES (1, 'hotel x', 2009, '4', 1500), (2, 'hotel x', 2009, '5', 1900), (3, 'hotel x', 2009, '6', 1800), (4, 'hotel y', 2009, '3', 500), (5, 'hotel y', 2009, '5', 350); Code :
SELECT produit, semaine FROM test En sql cela donnerait ceci : Code :
SELECT produit ,SUM( IF(semaine = 3 , semaine , 0)) AS '3' ,SUM( IF(semaine = 4 , semaine , 0)) AS '4' ,SUM( IF(semaine = 5 , semaine , 0)) AS '5' ,SUM( IF(semaine = 6 , semaine , 0)) AS '6' FROM test GROUP BY produit En sql dynamique je cherche encore mais avec php j'ai trouvé la solution suivante : Code :
<?php
$connexion = mysqli_connect("127.0.0.1","root","","cakedev") or die ("la connection à la bdd ne fonctionne pas");
$db = mysqli_select_db($connexion, "cakedev") or die ("la base ne peut pas être sélectionnée");
$req = "SELECT DISTINCT semaine FROM test ORDER BY semaine";
$result = mysqli_query($connexion, $req) or die ("la requête ne fonctionne pas");
$ListeSemaine=array();
while($ligne=mysqli_fetch_assoc($result))
{$ListeSemaine[]=$ligne['semaine'];};
print_r($ListeSemaine);
mysqli_free_result($result);
$groupes=NULL;
foreach($ListeSemaine as $item){
$groupes.=" ,SUM(IF(semaine='$item',CA,0))
AS 'Sem_".$item."'";
}
echo "<br/><br/>";
print_r($groupes);
echo "<br/><br/>";
$sql="SELECT produit $groupes
FROM test
GROUP BY produit";
echo "\n"; /* pour voir le source de la requête soumise à MySQL
en commentaire dans le source HTML de la page */
$result=mysqli_query($connexion, $sql) or die ("la requête ne fonctionne pas");
/* ici on parcourt le résultat pour affichage, édition
ou génération d'un document pdf (avec FPDF par exemple) */
$ligne=mysqli_fetch_assoc($result);
mysqli_close($connexion);
?>
Merci encore pour ton aide je vais jeter un œil à tes recommandations. |
|
|
|
|
|
#9 |
|
Nouveau membre du Club
![]() Date d'inscription: février 2005
Localisation: Toulouse
Âge: 22
Messages: 58
|
Bonjour,
En fait je pensais a quelque chose comme ca (full PHP une fois que tu as recupere tes donnees) : Code :
// Controleur
<?php
$resu = array();
$semaines = array();
foreach ($tests as $test) {
if (!in_array($test['Test']['semaine'], $semaines)) {
$semaines[] = $test['Test']['semaine'];
}
$resu[$test['Test']['produit']][$test['Test']['semaine']] = $test['Test']['CA'];
}
?>
Code :
// Vue <table> <tr> <?php foreach($semaines as $semaine):?> <td><?php echo $semaine?></td> <?php endforeach;?> </tr> <?php foreach($resu as $produit => $vals):?> <tr> <?php foreach($semaines as $semaine):?> <td><?php echo $vals[$semaine]?></td> <?php endforeach;?> </tr> <?php endforeach;?> </table> |
|
|
|
|
|
#10 |
![]() Date d'inscription: novembre 2007
Messages: 83
|
Bonjour,
Merci pour tes infos, malheureusement je ne suis pas trop et n'ai donc pas pu tester, enfin pas pour le moment. En fait dans mon contrôleur j'ai une gestion par objet (POO) et là tu me donnes un script procédural, du coup je suis un peu perdu. Merci quand même pour ton aide, cela me servira juste un peu plus tard quand tout cela sera plus clair pour moi. |
|
|
|
|
|
#11 | |
|
Nouveau membre du Club
![]() Date d'inscription: février 2005
Localisation: Toulouse
Âge: 22
Messages: 58
|
Citation:
J'ai eu un peu de temps durant le week-end j'ai essayé d'en faire une implémentation concrète (ce message est un doublon de celui posté dans la discussion ouverte sur forum.cakephp-fr.org). Ce problème est très intéressant et je n'ai pas la prétention d'y apporter une réponse absolue, mais je pense que ce qui est détaillé après permet de résoudre ton problème. Le code est entièrement disponible sur mon compte github, dans une branche à part : http://github.com/real34/CakeTest/tree/groupby Il suffit de le télécharger et de configurer la base de données, puis de créer la table en utilisant cake schema run create ... de cette manière tu pourras analyser et faire des tests, voir même l'améliorer. Voici donc ce que j'ai fait ! Dans le modèle, il te faut ajouter une méthode permettant de récupérer les informations que tu souhaites en faisant la somme du CA total par Produit et Année/Semaine : Code :
// app/models/produit.php
/**
* Récupère les Produits de manière à obtenir le CA de chacun par année-semaine
* @return array Produits groupés
*/
public function getGrouped() {
return $this->find('all', array(
'fields' => array('Produit.name', 'Produit.annee', 'Produit.semaine', 'SUM(Produit.ca) AS ca'),
'group' => array('Produit.name', 'Produit.annee', 'Produit.semaine')));
}
Code :
// app/controllers/produits_controller.php
function dynamique() {
$data = $this->Produit->getGrouped();
// Groupe les produits par "name" et crée un tableau indexé par "annee-mois" contenant la valeur du ca associé
$produits = Set::combine($data, array('{0}-{1}', '{n}.Produit.annee', '{n}.Produit.semaine'), '{n}.0.ca', '{n}.Produit.name');
// Crée la liste des semaines présentes dans le résultat, ordonnées par ordre croissant
$semaines = Set::sort(
array_keys(
Set::combine($data, array('{0}-{1}', '{n}.Produit.annee', '{n}.Produit.semaine'))),
'{n}',
'asc');
$this->set(compact('produits', 'semaines'));
}
Code :
<!-- app/views/produits/dynamique.ctp --> <h2><?php __('Données "dynamiques"')?></h2> <table> <thead> <tr> <td><?php __('Produit')?></td> <?php foreach($semaines as $semaine):?> <td><?php echo $semaine?></td> <?php endforeach;?> </tr> </thead> <tbody> <?php foreach($produits as $nom => $data):?> <tr> <td><?php echo $nom?></td> <?php foreach($semaines as $semaine):?> <td><?php echo (isset($data[$semaine])) ? $data[$semaine] : '0'?></td> <?php endforeach;?> </tr> <?php endforeach;?> </tbody> </table> Si jamais j'avais mal compris ce que tu souhaitais ou qu'il y avait des problèmes ou des meilleures façons de faire ça, n'hésites pas à me le faire savoir. Bonne journée, Pierre Dernière modification par Macmillenium ; 24/08/2009 à 14h21. Motif: Ne pas confondre [QUOTE] et [CODE] |
|
|
|
|
|
|
#12 |
![]() Date d'inscription: novembre 2007
Messages: 83
|
Bonjour,
Merci pour ton dévouement, désolé je n'ai pas pu regarder cela avant aujourd'hui. J'ai mis de coté mon apprentissage car cela ne collait pas avec le planning que je m'étais fixé pour mon projet, visiblement apprendre tout d'un coup est un peu plus long que je l'imaginais, en tout cas pour faire des choses un peu plus compliqué. Il faut dire aussi qu'à part la bdd je ne connais rien au reste, ni html, ni css, ni javascript, ni php, ni cake ... J'ai testé mais j'ai un problème au niveau de la vue, il m'indique une "Parse error" au niveau de "<?php endforeach;>" et juste avant à "<?php foreach($semaines as $semaine)>" je me suis dit que cela venait de la balise fermante et j'ai donc ajouté un "?" comme ceci "?>" au lieu de ">" mais si cela résout le premier cas, cela bloque toujours au niveau de "endforeach". Malheureusement mes connaissances sont trop limitées pour comprendre, surtout que cela fait plus d'une semaine que j'ai arrêté de potasser les bouquins php. Je ne veux pas t'embêter plus longtemps, j'ai compris le principe et je sais maintenant que la résolution du problème se trouve du coté de la classe Set donc dès que je reprends cela je vais m'y attarder pour y résoudre ma problématique. Merci encore pour ton aide. |
|
|
|
|
|
#13 | |
|
Nouveau membre du Club
![]() Date d'inscription: février 2005
Localisation: Toulouse
Âge: 22
Messages: 58
|
Citation:
Je te conseille vraiment de récupérer le code sur mon compte Github, au moins tu n'auras pas de mauvaise surprise et pourras l'étudier directement ! http://github.com/real34/CakeTest/tree/groupby |
|
|
|
|
|
|
#14 |
![]() Date d'inscription: novembre 2007
Messages: 83
|
Bonjour,
J'ai corrigé la vue, cela fonctionne maintenant. Merci beaucoup pour ton aide, c'est à mon avis la meilleure solution car au final il s'agit uniquement d'un problème de mise en forme et cela me semble mieux de traiter cela de cette façon, plutôt que du coté sql. Merci |
|
|
|
|
|
![]() |
||
Changer l'orientation d'une colonne d'un tableau
|
||
| Outils de la discussion | |
|
|