Partage
  • Partager sur Facebook
  • Partager sur Twitter

Solde cumulé ligne par ligne

Sujet résolu
    9 mars 2019 à 14:00:14

    Bonjour,

    Code php :

    <?php
       try{
        $bdd=new PDO('mysql:host=localhost;dbname=comptebancaire;charset=utf8', 'root','');
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// afficher les erreurs php
    }catch(Exception $e){
        die('Erreur :' . $e->getMessage());
    }
    
       $response=$bdd->query('SELECT * FROM comptebancaire');
       $saisie=$response->fetchAll();
       $response->closeCursor();
       setlocale(LC_ALL, ['fr_FR.UTF8','fra', 'french']);
       if(isset($_POST['dateoperation'], $_POST['operation'], $_POST['debit'], $_POST['credit'])
        AND !empty($_POST['dateoperation'])
        AND !empty($_POST['operation'])
        AND !empty($_POST['debit'])
        AND !empty($_POST['credit'])
    	){
    	if(!isset($errors)){
            $saisie =$bdd->prepare("INSERT INTO comptebancaire (dateoperation, operation, debit, credit) VALUES (?,?,?,?)");
    		$saisie->execute(array(
    			$_POST['dateoperation'],
    			$_POST['operation'],
    			$_POST['debit'],
    			$_POST['credit']
    		));
    
    		if($saisie->rowCount()>0){//Vérifie si l'opération a bien été ajouté dans la BDD
    		    $successMsg = 'L\'opération a bien été ajoutée !';
    		}else{
    		$errorMsg[]='Suite à un problème dans la base de données, l\'opération n\'a pas pu être ajoutée !';
    	    }
    	    $response->closeCursor();
        	}
           if(!preg_match('#^[a-zA-Z\-\'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ]{50}$#',$_POST['operation'])){
            $errors[] = 'Champ invalide<br>';
            }
            if(!preg_match('#^[0-9]{1,10}([.,][0-9]{1,2})?$#', $_POST['debit'])){
                $errors[] = "Champ invalide";
            }
            if(!preg_match('#^[0-9]{1,3}([.,][0-9]{1,2})?$#', $_POST['credit'])){
                $errors[] = "Champ invalide";
            }
        }
    $response = $bdd->query('SELECT * FROM comptebancaire');
    $saisie = $response->fetchAll();
    
    $response1=$bdd->query('SELECT *, (SELECT SUM(credit-debit) FROM comptebancaire WHERE dateoperation <= ope.dateoperation) AS solde FROM comptebancaire AS ope ORDER BY dateoperation ASC, (credit-debit) DESC');
    $solde=$response1->fetch();
    $soldecumulee=$solde['solde'];
    $response1->closeCursor();
    ?>
    
    <!DOCTYPE html>
    <html lang="fr">
    
    <head>
        <meta charset="utf-8">
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="css/bootstrap.css">
        <link rel="stylesheet" href="css/style.css">
        <link rel="stylesheet" href="css/carousel.css">
        <title>Compte bancaire</title>
        <script src="js/jquery.js"></script>
        <script src="js/bootstrap.min.js"></script>
    </head>
    
    <body>
        <div id="listecompte">
            <div class="container">
                <div class="col-sm-12">
                    <div class="row">
                        <h1 style="font-size:25px;text-align:center;color:green;">Compte bancaire</h1>
                        <form action="index.php" method="POST">
                            <input type="date" name="dateoperation" placeholder="">
                            <input type="text" name="operation" placeholder="">
                            <input type="text" name="debit" placeholder="">
                            <input type="text" name="credit" placeholder="">
                            <input type="submit">
                        </form><br>
                        <div id="entete">
                            <table>
                                <thead>
                                    <tr>
                                        <th id="dateoperation">Date de l'opération</th>
                                        <th id="operation">Opérations</th>
                                        <th id="debit">Débit</th>
                                        <th id="credit">Crédit</th>
                                        <th id="solde">Solde</th>
                                    </tr>
                                </thead>
                                <div id="listederoulante">
                                    <?php 
                                        if(!empty($saisie)){
                                            foreach($saisie as $data){
                                                $dateoperation = new DateTime($data['dateoperation']);
                                                echo'<tr><td>'.utf8_encode(strftime('%d %B %Y', $dateoperation->format('U'))).'</td><td>'.htmlspecialchars($data['operation']).'</td><td>'.htmlspecialchars($data['debit']).'</td><td>'.htmlspecialchars($data['credit']).'</td><td>'.$soldecumulee.'</td></tr>';
                                                }
                                            }
                                    ?>
                                </div>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <script type="application/javascript" src="js/jquery-3.1.1.js"></script>
        <script src="js/script.js"></script>
    </body>
    
    </html> 

    Résultat de ma requête :
    Ce que je souhaite afficher, c'est le solde cumulé ligne par ligne, ce qui n'est pas le cas actuellement.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      9 mars 2019 à 14:08:59

      Bonjour,

      Tu tiens à faire ça en SQL ? Ce serait beaucoup plus simple de calculer la le solde en Php à chaque tour.

      • Partager sur Facebook
      • Partager sur Twitter
        9 mars 2019 à 17:49:18

        Ce que je veux, c'est qu'à chaque fois que j'insère une nouvelle ligne, quel que soit la date, le solde se calcule automatiquement.
        • Partager sur Facebook
        • Partager sur Twitter
          11 mars 2019 à 9:00:36

          Bonjour,

          MichaëlPourprix a écrit:

          à chaque fois que j'insère une nouvelle ligne, quel que soit la date, le solde se calcule automatiquement

          Je reprends ce qu'à dit Philodick ... L'information du solde n'est pas pertinente à stocker en base ... elle dépend de toutes les lignes déjà présente donc en cas de suppression / modification de lignes, il faut tout recalculer ... Autant calculer le solde en PHP dans la boucle foreach ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            11 mars 2019 à 13:20:10

            C'est bon, j'ai pu résoudre mon problème via un autre forum
            • Partager sur Facebook
            • Partager sur Twitter
              11 mars 2019 à 13:26:49

              Et avec quelle solution du coup ? Histoire de partager ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                11 mars 2019 à 15:36:02

                J'imagine que c'est en rajoutant une colonne "solde_actuel" qui se calcul au moment de l'insertion à partir du "solde_actuel" le plus récent moins le débit plus le crédit ou un truc sale du genre.

                EDIT : A oui non. Quelque soit la date, ca ferait calculer toutes la table, pas juste la dernière ligne. Pas compliqué en soit, juste bien crade...

                Après, il faut aussi comprendre que c'est assez bête de se dire "Si veux juste afficher 1 an d'histo sur un compte pour lequel j'ai 25ans d'historique en base, ca voudrait dire que je suis contraint de remonter 25ans de data uniquement pour avoir mon solde au début des 1 an que je veux afficher."

                Certes, c'est relou de faire une requête pour tout recalculer à la volée pendant la requête, mais c'est aussi assez relou de devoir tout remonter pour tout recalculer en php à chaque fois.

                Donc bilan, je suis curieux de voir la solution proposée par "l'autre forum".

                -
                Edité par Tiffado 11 mars 2019 à 15:40:31

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mars 2019 à 17:42:36

                  Ligne 47 à 51

                  <?php
                     try{
                      $bdd=new PDO('mysql:host=localhost;dbname=comptebancaire;charset=utf8', 'root','');
                      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// afficher les erreurs php
                  }catch(Exception $e){
                      die('Erreur :' . $e->getMessage());
                  }
                  
                     $response=$bdd->query('SELECT * FROM comptebancaire');
                     $saisie=$response->fetchAll();
                     $response->closeCursor();
                     setlocale(LC_ALL, ['fr_FR.UTF8','fra', 'french']);
                     if(isset($_POST['dateoperation'], $_POST['operation'], $_POST['debit'], $_POST['credit'])
                      AND !empty($_POST['dateoperation'])
                      AND !empty($_POST['operation'])
                      AND !empty($_POST['debit'])
                      AND !empty($_POST['credit'])
                  	){
                  	if(!isset($errors)){
                          $saisie =$bdd->prepare("INSERT INTO comptebancaire (dateoperation, operation, debit, credit) VALUES (?,?,?,?)");
                  		$saisie->execute(array(
                  			$_POST['dateoperation'],
                  			$_POST['operation'],
                  			$_POST['debit'],
                  			$_POST['credit']
                  		));
                  
                  		if($saisie->rowCount()>0){//Vérifie si l'opération a bien été ajouté dans la BDD
                  		    $successMsg = 'L\'opération a bien été ajoutée !';
                  		}else{
                  		$errorMsg[]='Suite à un problème dans la base de données, l\'opération n\'a pas pu être ajoutée !';
                  	    }
                  	    $response->closeCursor();
                      	}
                         if(!preg_match('#^[a-zA-Z\-\'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ]{50}$#',$_POST['operation'])){
                          $errors[] = 'Champ invalide<br>';
                          }
                          if(!preg_match('#^[0-9]{1,30}([.,][0-9]{1,2})?$#', $_POST['debit'])){
                              $errors[] = "Champ invalide";
                          }
                          if(!preg_match('#^[0-9]{1,30}([.,][0-9]{1,2})?$#', $_POST['credit'])){
                              $errors[] = "Champ invalide";
                          }
                      }
                  $response = $bdd->query('SELECT * FROM comptebancaire ORDER BY dateoperation ASC');
                  $saisie = $response->fetchAll();
                  $soldecumule = 0;
                  foreach( $saisie as $idx => $row ){
                     $soldecumule = $soldecumule + $row['credit'] - $row['debit'];
                     $saisie[$idx]['soldecumule'] = $soldecumule;
                  }
                  if(!empty($_POST)){
                      echo'<script>window.location.href("index.php")</script>';
                  }
                  ?>
                  
                  <!DOCTYPE html>
                  <html lang="fr">
                  
                  <head>
                      <meta charset="utf-8">
                      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
                      <meta name="viewport" content="width=device-width, initial-scale=1">
                      <link rel="stylesheet" href="css/bootstrap.css">
                      <link rel="stylesheet" href="css/style.css">
                      <link rel="stylesheet" href="css/carousel.css">
                      <title>Compte bancaire</title>
                      <script src="js/jquery.js"></script>
                      <script src="js/bootstrap.min.js"></script>
                  </head>
                  
                  <body>
                      <div id="listecompte">
                          <div class="container">
                              <div class="col-sm-12">
                                  <div class="row">
                                      <h1 style="font-size:25px;text-align:center;color:green;">Compte bancaire</h1>
                                      <form action="index.php" method="POST">
                                          <input type="date" name="dateoperation" placeholder="">
                                          <input type="text" name="operation" placeholder="">
                                          <input type="text" name="debit" placeholder="">
                                          <input type="text" name="credit" placeholder="">
                                          <input type="submit">
                                      </form><br>
                                      <div id="entete">
                                          <table>
                                              <thead>
                                                  <tr>
                                                      <th id="dateoperation">Date de l'opération</th>
                                                      <th id="operation">Opérations</th>
                                                      <th id="debit">Débit</th>
                                                      <th id="credit">Crédit</th>
                                                      <th id="solde">Solde</th>
                                                  </tr>
                                              </thead>
                                              <tbody>
                                                  <?php 
                                                      if(!empty($saisie)){
                                                          foreach($saisie as $data){
                                                              $dateoperation = new DateTime($data['dateoperation']);
                                                              echo'<tr><td id="dateoperation">'.utf8_encode(strftime('%d %B %Y', $dateoperation->format('U'))).'</td><td id="operation">'.htmlspecialchars($data['operation']).'</td><td id="debit">'.htmlspecialchars($data['debit']).'</td><td id="credit">'.htmlspecialchars($data['credit']).'</td><td id="solde">'.$data['soldecumule'].'</td></tr>';
                                                              }
                                                          }
                                                  ?>
                                              </tbody>
                                          </table>
                                      </div>
                                  </div>
                              </div>
                          </div>
                      </div>
                      <script type="application/javascript" src="js/jquery-3.1.1.js"></script>
                      <script src="js/script.js"></script>
                  </body>
                  
                  </html>
                  



                  -
                  Edité par MichaëlPourprix 22 mars 2019 à 17:46:15

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 mars 2019 à 10:41:08

                    Ok, donc ca n'a effectivement pas été fait dans la requête ^^

                    Merci pour ta réponse.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Solde cumulé ligne par ligne

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown