Comment calculer chiffre d'affaire avec php /mysql tous les ans

Fermé
Olivier - Modifié le 31 oct. 2017 à 21:23
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 1 nov. 2017 à 12:52
Bonjour,

Tout le monde! Comment vont les fous du codage, pas de crampe aux doigts ?

J'ai développé une petite portion de code PHP qui me permet d'afficher le chiffre d'affaire effectuer pour chaque mois et de faire un calcule global sur le chiffre d'affaire effectuer sur 1 ans (en additionnant toutes les sommes) de la table qui contient les somme gagner par mois.

Actuellement ma base de donner est structurée comme ce ci :

CREATE TABLE IF NOT EXISTS `chiffre_affaire` (
`id` int(11) NOT NULL,
  `mois` varchar(255) DEFAULT NULL,
  `ca_mois` smallint(255) NOT NULL,
  `annee` varchar(255) DEFAULT NULL,
  `ref_mois` int(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;


Petite explication :

Le champ id est en auto increment
Le champ mois, correspond à un mois par exemple janvier
Le champ ca_mois , correspond au chiffre d'affaire effectuer dans le mois
Le champ annee, correspond à l'année exemple 2016 (en sachant que cette valeur peut changer)
Le champ ref_mois, est au faite un numéro que j'ai attribué pour identifier le mois, exemple ref_mois = 1, est égale au mois de janvier.


La actuellement mon code PHP m'affiche toutes les données des colonnes, moi ce que je cherche à faire, c'est de séparer chaque année par un tableau, en somme répéter ce code pour chaque année effectuer, afin d’avoir un historie du chiffre d’affaires d’année en année.

// information pour la connection à le DB
      $host = 'localhost';
      $user = '*****';
      $pass = '*****';
      $db = 'CA';

      // connection à la DB
      $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
      mysql_select_db($db) or die ('Erreur :'.mysql_error());

      // requête SQL qui compte le nombre total d'enregistrement dans la table et qui
      //récupère tous les enregistrements

      $select = 'SELECT * FROM chiffre_affaire';
      $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
      $total = mysql_num_rows($result);

      // si on a récupéré un résultat on l'affiche.

      if($total) 

      {

      // debut du tableau
      echo '<table bgcolor="#FFFFFF">';

      // première ligne on affiche les titres prénom et surnom dans 2 colonnes

      echo '<tr>';
      echo '<td bgcolor="#669999" width="200"><b><u>Mois</u></b></td>';
      echo '<td bgcolor="#669999" width="200" align="center"><b><u>Chiffre Affaire</u></b></td>';
      echo '<td bgcolor="#669999" width="90" align="center"><b><u>Année</u></b></td>';
      echo '</tr>';

      // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    

      while($row = mysql_fetch_array($result)) {

      echo '<tr>';
      echo '<td bgcolor="#CCCCCC">'.$row["mois"].'</td>';
      echo '<td bgcolor="#CCCCCC" align="center">'.$row["ca_mois"].'</td>';
      echo '<td bgcolor="#CCCCCC" align="center">'.$row["annee"].'</td>';
      echo '</tr>';

      }

      echo '</table>';

      }

      else echo 'Pas d\'enregistrements dans cette table...';

      // on libère le résultat
      mysql_free_result($result);




      $sql = mysql_query("SELECT SUM(ca_mois) AS total FROM chiffre_affaire");
      $somme = mysql_result($sql,0);

      echo '<table bgcolor="#FFFFFF">';
      echo '<tr>';
      echo '<td bgcolor="#CCCCCC" width="200" align="center"><b>CA Total</b></td>';
      echo '<td bgcolor="#CCCCCC" width="200" align="center"><font color="red">'.$somme.'€</font></td>';
      echo '<td bgcolor="#CCCCCC" width="90"> </td>';
      echo '<tr>';
      echo '</table>';



Je souhaiterais que ce tableau puisse se répéter pour chaque année effectuer tout en gardant le principe de somme pour chaque mois et de calculer le chiffre d'affaires sur un an, je vous invite peut être à le mettre en place de votre côté pour comprend ma démarche.

Ma question est la suivante comment puis-je répéter ce tableau pour chaque année effectuer ?


Merci d'avance de votre aide ...
A voir également:

3 réponses

yg_be Messages postés 22711 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 avril 2024 1 474
31 oct. 2017 à 21:40
bonsoir, je te suggère de procéder ainsi:
1) fais le travail pour une année, par exemple 2016 (tu y es presque, encore un petit effort)
2) quand cela fonctionnera parfaitement, généralise-le et puis fais le pour chaque année.
0
ehh Question peut être bête ? mais,

1- Comment le faire pour chaque année
2- Comment faire en sorte que les tableaux de toute les année s'affiche sur la page.

Un petit exemple peut être ?
0
yg_be Messages postés 22711 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 avril 2024 1 474 > Olivier
31 oct. 2017 à 22:21
fais le d'abord pour une seule année.
0
Olivier > yg_be Messages postés 22711 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 avril 2024
31 oct. 2017 à 22:44
C'est déjà le qu'a , enfin là ça prend tout , humm je sèche un peut.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
1 nov. 2017 à 00:58
Bonjour,

Déjà.... https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top
Je suis étonné que Yg_be ne te l'ai pas indiqué...; il aurait du commencer par ça !
Je t'invite fortement à passer à PDO ou au pire à mysqli.

Ensuite....
pour ce qui est de ton affichage...

Comme tu l'as fait actuellement :
Tu fais
- une requête qui te liste tout (pour l'affichage des données)
- Une requête qui fait la SUM (en ajoutant un GROUP BY pour regrouper par année)

Pour ton tableau...
Tu parcours le résultat de la requête et, à chaque "tour" tu regardes si l'année que tu vas afficher est la même que celle que tu viens d'afficher. Si oui.. tu ajoutes une ligne à ton tableau ... si non, tu mets le total et créés un nouveau tableau.
Bref, juste avec un ou deux if/else .. tu peux y arriver sans soucis.


0
Dans ce goût là

      // information pour la connection à le DB
      $host = 'localhost';
      $user = '*****';
      $pass = '******';
      $db = 'CA';

      // connection à la DB
      $link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
      mysql_select_db($db) or die ('Erreur :'.mysql_error());

      // requête SQL qui compte le nombre total d'enregistrement dans la table et qui
      //récupère tous les enregistrements

      $select = 'SELECT * FROM chiffre_affaire WHERE annee GROUP BY annee';
      $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
      $total = mysql_num_rows($result);

      // si on a récupéré un résultat on l'affiche.

      if($total) 

      {



      // debut du tableau
      echo '<table bgcolor="#FFFFFF" align="center">';

      // première ligne on affiche les titres prénom et surnom dans 2 colonnes
      echo '<tr>';
      echo '<td bgcolor="#669999" width="200"><b><u>Mois</u></b></td>';
      echo '<td bgcolor="#669999" width="200" align="center"><b><u>Chiffre Affaire</u></b></td>';
      echo '<td bgcolor="#669999" width="90" align="center"><b><u>Année</u></b></td>';
      echo '</tr>';

      // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    

      while($row = mysql_fetch_array($result)) 
      {


      // Condition if : si le mois est janvier alors on l'affiche en gras dans le tableau.
      $mois = $row["mois"];
      echo '<tr>';
      if ($mois == "Janvier")
      {
      echo '<td bgcolor="#CCCCCC"><b>'.$row["mois"].'</b></td>';
      echo '<td bgcolor="#CCCCCC" align="center">'.$row["ca_mois"].'</td>';
      echo '<td bgcolor="#CCCCCC" align="center"><b>'.$row["annee"].'</b></td>';
      echo '</tr>';
            // Cacule chiffre d'affaire 
      $sql = mysql_query("SELECT SUM(ca_mois) FROM chiffre_affaire WHERE annee GROUP BY annee");
      $somme = mysql_result($sql,0);
      echo '<tr>';
      echo '<td bgcolor="#CCCCCC" width="200" align="center"><b>CA Total</b></td>';
      echo '<td bgcolor="#CCCCCC" width="200" align="center"><font color="red">'.$somme.'€</font></td>';
      echo '<td bgcolor="#CCCCCC" width="90" align="center">########</td>';
      echo '<tr>';

      }
      else
      {
      echo '<td bgcolor="#CCCCCC">'.$row["mois"].'</td>';
      echo '<td bgcolor="#CCCCCC" align="center">'.$row["ca_mois"].'</td>';
      echo '<td bgcolor="#CCCCCC" align="center">'.$row["annee"].'</td>';
      echo '</tr>';
      }



      }


      echo '<table bgcolor="#FFFFFF" align="center">';
      echo '<tr>';
      echo '<td bgcolor="#CCCCCC" width="200"> </td>';
      echo '<td bgcolor="#CCCCCC" align="center" width="200"> </td>';
      echo '<td bgcolor="#CCCCCC" align="center" width="90"> </td>';
      echo '</tr>';
      echo '</table>';




      }

      else echo 'Pas d\'enregistrements dans cette table...';
      
      // on libère le résultat
      mysql_free_result($result);



GROUP BY C'est que ça m'affiche que les années moi je souhaiterais que ça m'affiche les mois aussi, c'est pour ça que j'ai fait une condition sur le mois de janvier afin d'avoir une petite différence quand on regarde le tableau.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > Olivier
1 nov. 2017 à 10:16
Tu n'as pas appliqué ma première recommandation
Et tu n'as sûrement pas testé tes requêtes DIRECTEMENT dans ta bdd..
0
Olivier > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
1 nov. 2017 à 11:20
J'ai ajouté groupe by comme tu me la indiquée mais si j'ajoute ça justement ça me liste toute les années dans le tableau hors ce n’est pas ce que je souhaiterais faire, ma première idée est bonne, je liste toute les entrée de la base dans le tableau, là j'ai effectué une condition pour faciliter la lecture sur le mois de janvier.

Mais pour listée toute les entrée j'ai mis ça dans une boucle while, voilà ce que je veux faire une image exemple sera plus parlante :

https://img4.hostingpics.net/pics/364799caanne.png

Ça liste déjà tout ce qui se trouve dans la base de donnée et pour le calcul de chiffre d''affaire ça fait un SUM de la colonne qui contient le chiffre d'affaire du moi.

La actuellement le code liste déjà toute les infos avec while (une boucle) qui va répéter chaque entré de la base
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > Olivier
1 nov. 2017 à 11:50
Tu as vu mon autre réponse ??
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié le 1 nov. 2017 à 12:15
Voici ton code refait au propre (et corrigé).
NB : Je l'ai écrit de tête sans tester, il peut y avoir quelques erreurs qu'il faudra corriger.
Par contre je l'ai plutôt bien commenter... tu devrais comprendre....

Voila :
Déjà... je t'invite à lire ceci avec attention :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code


On place le code de connexion à la bdd dans un fichier à part...
(je pars du principe que tu passes en PDO... il faudra le modifier en conséquence si tu veux être en mysqli) (et modifier la façon de faire les requêtes également ....)

donc.. en pdo, pour se connecter à une bdd : Connexion PDO
<?php
//fichier : cnxbdd.php

// information pour la connection à le DB
      $host = 'localhost';
      $user = '*****';
      $pass = '******';
      $db = 'CA';

try{
   $bdd =new PDO('mysql:host='.$host.'; dbname='.$db.'; charset=utf8', $user, $pass);
   // Activation des erreurs PDO
   $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
   $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
   die('Erreur : ' . $e->getMessage());
}


Ensuite, ton code à proprement parlé :

<?php
//-----------------------------------------------------------------------------------//
//activation des erreurs php
//-----------------------------------------------------------------------------------//
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//-----------------------------------------------------------------------------------//
//connexion à la bdd
//-----------------------------------------------------------------------------------//
require_once "cnxbdd.php";

//-----------------------------------------------------------------------------------//
//on récupère la liste
//-----------------------------------------------------------------------------------//
$sql = 'SELECT * FROM chiffre_affaire ORDER BY annee';
$datas = NULL;
try{
  $requete = $bdd->prepare($sql);
  $requete->execute($datas);
  // retourne le résultat dans un array
  $arr_Liste = $requete->fetchAll();
}catch(Exception $e){
  echo " ERREUR ! " . $e->getMessage();
}

// je retravaille l'array pour avoir un array plus facile à utiliser pour la suite
$liste = array();
if(!empty($arr_Liste)){
  foreach($arr_Liste as $R){
    $liste[$R['annee']][$R['ref_mois']] = array('id'=>$R['id'] ,'ca_mois'=>$R['ca_mois'] ,'mois'=>$R['mois'] );
  }
}


//-----------------------------------------------------------------------------------//    
//on récupère les totaux par Années et par mois
//-----------------------------------------------------------------------------------//

$sql = "SELECT SUM(ca_mois) AS total FROM chiffre_affaire GROUP BY annee";
$datas = NULL;
try{
  $requete = $bdd->prepare($sql);
  $requete->execute($datas);
  // retourne le résultat dans un array
  $arr_total = $requete->fetchAll();
}catch(Exception $e){
  echo " ERREUR ! " . $e->getMessage();
}

// je retravaille l'array pour avoir un array plus facile à utiliser pour la suite
$totaux = array();
if(!empty($arr_total)){
  foreach($arr_total as $R){
    $totaux[$R['annee']] = $R['total'] ;
  }
}


//-----------------------------------------------------------------------------------//
//maintenant... j'effectue l'affichage
//-----------------------------------------------------------------------------------//
if(!empty($liste)){
   //on défini les entêtes du tableau à créer
  $arr_TH = array();
  $arr_TH[] = array('text'=>'Mois' , 'style'=> 'width:200px ; background-color:#669999' , 'class'=>'');
  $arr_TH[] = array('text'=>'Chiffre Affaire' , 'style'=> 'width:200px; background-color:#669999' , 'class'=>'');
  $arr_TH[] = array('text'=>'Année' , 'style'=> 'width:90px; background-color:#669999' , 'class'=>'');

 
 //-----------------------------------------------------------------------------------//
 // Fonctions pour créer les tableaux
 //-----------------------------------------------------------------------------------//
  // J'ai découpé la création des différentes partis de tes tableaux dans des fonctions
  //c'est plus simple pour les générer dans les différentes boucles  
  
  
  /**
   * créé (et rempli) le tableau utilisé pour affiche le total
  */
  function add_tableau_total($somme = 0){
    $result = '<table bgcolor="#FFFFFF">';
    $result .= '<tr>';
    $result .= '<td bgcolor="#CCCCCC" width="200" align="center"><b>CA Total</b></td>';
    $result .= '<td bgcolor="#CCCCCC" width="200" align="center"><font color="red">'.$somme.'€</font></td>';
    $result .= '<td bgcolor="#CCCCCC" width="90"> </td>';
    $result .= '<tr>';
    $result .= '</table>';
   return $result;
  }

  /**
  * Initialise un tableau 
  * et affiche les en-têtes (TH)
  */
  function add_tbl($entetes){

  // debut du tableau
    $result = '<table bgcolor="#FFFFFF">';

    // première ligne on affiche les titres prénom et surnom dans 2 colonnes
    $result .= '<thead>';
    $result .= '<tr>';
      foreach($entetes as $TH){
       $result .= '<th style="'.$TH['style'].'" class="'.$TH['class'].'"><b><u>'.$TH['texte'].'</u></b></th>';
      }
    $result .= '</tr>';
    $result .= '</thead>';  

  return $result;
  }
 
  /**
   * Ajout les lignes dans le tbody du tableau
  */
  function add_rows($rowDatas){
    $result = "";
    if(!empty($rowDatas)){
      foreach($rowDatas as $ref_mois=>$R){
        $result .= "<tr id='tr_".$ref_mois."'>";
        $result .= "<td>".$R['mois']."</td>";
        $result .= "<td>".$R['ca_mois']."</td>";
        $result .= "<td>".$R['annee']."</td>";
        $result .= "</tr>";
      }
    }
   return $result;
  }


 //-----------------------------------------------------------------------------------//
 //maintenant.. on s'occupe de générer les tableaux
 //-----------------------------------------------------------------------------------//
  $tableau = '';
  $annee_prec = NULL;
  $tableau = "";

  //on parcours la liste pour créer le tableau
  foreach($liste as $annee=>$MoisrowDatas){
    
    if($annee <> $annee_prec){
       //si ce n'est pas le premier tableau
       if($annee_prec != NULL){
          $tableau .='</body></table>';
          $somme = !empty($totaux[$R[$annee_prec]) ? $totaux[$R[$annee_prec] : 0;
          $tableau .= add_tableau_total($somme);
       }
       //si c'est une nouvelle année, on créé un tableau
       $tableau .= add_tbl($arr_TH);
       $tableau .= '<body>';
    }
    //ajout des lignes dans le body du tableau
    $tableau .= add_rows($MoisrowDatas);
    
    // On actualise la variable annee_prec avec l'annee en cours  
    $annee_prec = $annee;
  } 
  // on termine les tableaux :
  $tableau .='</body></table>';



  //Et pour finir ... Affichage des tableaux que ta page:
  echo $tableau;
    
}


?>



Cordialement, 
Jordane                                                                 
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
1 nov. 2017 à 12:16
Petite correction au niveau de la requête pour les totaux.
J'avais oublié le GROUP BY annee
0
Je vais devoir revérifier le code du coup puisque quand je l’exécute j’ai une erreur 500 sur la page en gros comme si la page n’existait pas.

Ç’a m’avais fait le coup avec mon code PHP précédemment à cause de syntaxe, mais je croit que je vais procéder autrement, car sinon je n’ai pas finie de vérifier toutes les syntaxes...

Merci beaucoup en tout qu’a de ton aide ...
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > Olivier
1 nov. 2017 à 12:52
Je vois une erreur ici
 $somme = !empty($totaux[$R[$annee_prec]) ? $totaux[$R[$annee_prec] : 0;

A changer par :
 $somme = !empty($totaux[$R[$annee_prec]]) ? $totaux[$R[$annee_prec]] : 0;


Après.. si tu as toujours un souci... file moi un DUMP de ta BDD que je puisse tester chez moi
0