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

Olivier -  
jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   -
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 ...

3 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
    1. Olivier
       
      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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Olivier
         
        fais le d'abord pour une seule année.
        0
      2. Olivier > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        C'est déjà le qu'a , enfin là ça prend tout , humm je sèche un peut.
        0
  2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
    1. Olivier
       
      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
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Olivier
         
        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
      2. Olivier > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
      3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Olivier
         
        Tu as vu mon autre réponse ??
        0
  3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Petite correction au niveau de la requête pour les totaux.
      J'avais oublié le GROUP BY annee
      0
    2. Olivier
       
      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
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > Olivier
         
        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