Calcul ligne par ligne dans un tableau PHP - MySQL

Résolu/Fermé
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024 - 18 avril 2023 à 15:36
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024 - 20 avril 2023 à 14:34

Bonjour,

J'ai un problème de calcul quand je veut afficher un total ligne par ligne dans un tableau, j'ai un champs "price" que je multiplie par la quantité "quantity" ça fonctionne sauf que dès que j'ai plus d'une ligne avec plus de 1 quantité le résultat est faux, j'arrive pas a m'en sortir voici mon code pour afficher :

require_once('../inc/connexion.php');
  $db = getDB();


  try {
} catch (PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}
$stmt = $db->query("
SELECT a.nfacture, a.prixtotal, a.quantity, a.promo, a.customers, a.start_date, a.summary, a.state, a.numero, b.paid 
FROM
    (SELECT invoices.invoice as nfacture, SUM(services.price) as prixtotal, quantity as quantity, promotions.amount as promo, customers.fullname as customers, 	
    DATE_FORMAT(start_date,'%d/%m/%Y')  as start_date, states.state as state, invoices.numero as numero, comments.summary as summary 
    FROM invoices  
    LEFT JOIN customers ON (invoices.id_customers=customers.id_customers) 
    LEFT JOIN services ON (invoices.invoice=services.invoice)
    LEFT JOIN promotions ON (invoices.invoice=promotions.invoice)  
    LEFT JOIN items ON (services.id_items=items.id_items) 
    LEFT JOIN states ON (invoices.invoice=states.invoice) 
    LEFT JOIN comments ON (invoices.invoice=comments.invoice) 

    WHERE states.type = 1 AND (states.state = 1 OR states.state = 9) 
    GROUP BY nfacture 
    ) as a,
    (SELECT invoices.invoice as nfacture, SUM(payments.amount) as paid 
    FROM invoices
    LEFT JOIN payments ON (invoices.invoice=payments.invoice) 
    GROUP BY nfacture 
    ) as b 
WHERE a.nfacture=b.nfacture
ORDER BY nfacture DESC

");

  echo '

  <div class="card">
  <div class="card-header">
  <h3 class="card-title">Factures</h3>
  </div>
  <!-- /.card-header -->
  <div class="card-body">
  <table id="example1" class="table table-hover table-striped table-responsive">
  <thead>
  <tr>
  <th>ID</th>
  <th >Numéro</th>
  <th>Client</th>
  <th>Titre</th>
  <th>Price</th>
  <th>Paid</th>
  <th>Balance</th>
  <th>Date</th>
  <th>Statut</th>
  </tr>
  </thead>
  <tbody>
  ';


  while ($donnees = $stmt->fetch()) // Renvoit les valeurs de la bdd
  {
   
    $quantity = $donnees['quantity'];
    $promo = $donnees['promo'];
    $paid = $donnees['paid'];
    $prix = $donnees['prixtotal'] * $donnees['quantity'] ;

    echo $prix;



    // echo $tax['vat']; echo '<br>';
    // echo $donnees['prixtotal'];  echo '<br>';
    // echo $donnees['quantity'];  echo '<br>';  
    // echo $donnees['promo'];  echo '<br>';

    $total = $prix - $promo;

   // $balance = $total  - $paid;
   // $total = $prixtotal - $promo - $paid ;         
   // $balance = $total  - $promo  - $paid;

    $state = ($donnees['state']);


    if ($donnees['state'] == 1) {
      $state = '<span class="badge bg-warning" >En cours</span>';
    } elseif ($donnees['state'] == 2) {
      $state = '<span class="badge bg-success" >Payé</span>';
    } elseif ($donnees['state'] == 9) {
      $state = '<span class="badge bg-danger" >Annulée</span>';
    }

    echo '<tr>
    <td align="center" width="5%" ><a href="' . URLSITE . 'form/invoice.php?invoice=' . $donnees['nfacture'] . ' "><button type="button" class="btn btn-block btn-secondary btn-xs btn-flat">' . $donnees['nfacture'] . '</td></button></a>
    <td align="left" width="6%">' . $donnees['numero'] . '</td>
    <td align="left" width="30%">' . $donnees['customers'] . '</td>
    <td align="left" width="30%">' . $donnees['summary'] . '</td>';
    echo '<td align="left" width="5%">' . number_format($total, 2) . '  </td>';
    echo '<td align="left" width="5%"></></td>';
    echo '<td align="left" width="5%"></td>';
    echo '<td align="left" width="5%"> ' . $donnees['start_date'] . '  </td>';
    echo '<td align="left" width="5%">  ' . $state . ' </td>';
  }
  echo '
                </tbody>';
  echo '</tr>
                </tbody>
                <tfoot>
                <tr>
                <th>ID</th>
                <th >Numéro</th>
                <th>Client</th>
                <th>Titre</th>
                <th>Price</th>
                <th>Paid</th>
                <th>Balance</th>
                <th>Date</th>
                <th>Statut</th>
                </tr>
                </tfoot>
                </table>
                </div>
                <!-- /.card-body -->
                </div>
                <!-- /.card -->
                </div>
                <!-- /.col -->
                </div>
                <!-- /.row -->
                </div>';

  echo '            
                
                
                </table>
                </div>
                <!-- /.card-body -->
                </div>
                <!-- /.card -->
                </div>
                <!-- /.col -->
                </div>
                <!-- /.container-fluid -->
                ';

  ?>

si quelqu'un pouvait m'aider à trouver la solution.

Merci

A voir également:

8 réponses

jordane45 Messages postés 38296 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 novembre 2024 4 704
18 avril 2023 à 15:48

Bonjour,

Déjà, pour le prix par ligne, pas besoin du php .. tu peux le gérer directement dans ta requête SQL

par exemple

SELECT a.nfacture, a.prixtotal, a.quantity, a.promo, a.customers, a.start_date, a.summary, a.state, a.numero, b.paid , a.prixtotal * a.quantity as PRIX_LIGNE

Ensuite, pour le total du tableau, tu as oublié d'additionner les valeurs précédentes à ta variable $total

Avec ma modif dans ta requête sql; ça donnerait :

$prix = $donnees['PRIX_LIGNE'] 

$total += $prix

0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
18 avril 2023 à 16:06

Bonjour Jordane45,

J'ai toujours le même résultat 580 au lieu de 420 j'ai :

1 article à 100 avec 2 quantité = 200

1 article à 160 avec 1 quantité = 160

1 article à 30 avec 2 quantité = 60

En tout ça devrait faire 420 et non 580, il y à 160 de plus ça correspond à l'article qui vaut 160.

0
jordane45 Messages postés 38296 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 novembre 2024 4 704
18 avril 2023 à 16:52

Peux tu nous montrer une capture écran du résultat de la requête exécutée dans phpmyadmin ?

Les données qui y sont correspondent bien à ce que tu attends ?

0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
18 avril 2023 à 17:09

Le résultat doit correspondre a la facture (invoice 7) numéro 7 de l'image en dessous.

Le champ prixtotal doit être le résultat de ce calcul 100*2 + 160*1 + 30*2

0
jordane45 Messages postés 38296 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 novembre 2024 4 704
18 avril 2023 à 18:37

Ce n'est pas le résultat de la requête que je t'ai donné visiblement ou alors tu n'affiche pas tous les champs dans ta capture écran

0
jordane45 Messages postés 38296 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 novembre 2024 4 704 > jordane45 Messages postés 38296 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 novembre 2024
Modifié le 18 avril 2023 à 18:41

De plus, je ne vois rien dans ta requête, qui limite à la facture numéro 7.....

0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024 > jordane45 Messages postés 38296 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 novembre 2024
18 avril 2023 à 19:08

j'ai fait la requête qui limite la facture à la numéro 7 (AND a.nfacture = 7)

WHERE a.nfacture=b.nfacture   AND a.nfacture = 7
ORDER BY nfacture DESC

J'ai le même résultat

0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
18 avril 2023 à 18:59

j'ai copier /coller ta requête dans phpmyadmin 

Comme l'image était trop petite j'ai mis qu'une partie tout à l'heure. 

Tout les champs dans l'image sont bien présent. ils correspondent au tableau que j'ai mis dans le code de mon 1er message

0
jordane45 Messages postés 38296 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 novembre 2024 4 704
18 avril 2023 à 20:50

Ta requête, ne retourne qu'une seule ligne.... Et le montant qui figure, n'est pas le bon ?

Toi, tu veux obtenir la liste des produits commandés ?' C'est bien ça ?

Tu dois donc bien constater que ta requête SQL ne retourne pas les informations que tu souhaites....

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
18 avril 2023 à 21:15

Oui c'est ça, la liste des produits pour chaque facture, une par ligne dans le tableau.

0
jordane45 Messages postés 38296 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 19 novembre 2024 4 704
18 avril 2023 à 21:50

Et ce n'est pas ce que te retourne ta requête...

0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
19 avril 2023 à 12:22

J'ai fait cette requête : 

SELECT a.nfacture, 
SUM(services.price * a.quantity) - SUM(promotions.amount * a.quantity) as prixtotal,
a.quantity,
a.promo,
a.customers,
DATE_FORMAT(a.start_date,'%d/%m/%Y') as start_date,
a.summary,
a.state,
a.numero,
b.paid,
(services.price * a.quantity) - (promotions.amount * a.quantity) as PRIX_LIGNE,
services.price
FROM
(SELECT invoices.invoice as nfacture,
services.id_items,
quantity as quantity,
SUM(services.price) as prixtotal,
SUM(promotions.amount) as promo,
customers.fullname as customers,
start_date,
states.state as state,
invoices.numero as numero,
comments.summary as summary
FROM invoices
LEFT JOIN customers ON (invoices.id_customers=customers.id_customers)
LEFT JOIN services ON (invoices.invoice=services.invoice)
LEFT JOIN promotions ON (invoices.invoice=promotions.invoice AND services.id_items = promotions.id_items)
LEFT JOIN items ON (services.id_items=items.id_items)
LEFT JOIN states ON (invoices.invoice=states.invoice)
LEFT JOIN comments ON (invoices.invoice=comments.invoice)

WHERE states.type = 1 AND (states.state = 1 OR states.state = 9)
GROUP BY nfacture, services.id_items
) as a,
(SELECT invoices.invoice as nfacture, SUM(payments.amount) as paid
FROM invoices
LEFT JOIN payments ON (invoices.invoice=payments.invoice)
GROUP BY nfacture
) as b,
services
WHERE a.nfacture=b.nfacture
AND services.invoice = a.nfacture
AND services.id_items = a.id_items
ORDER BY nfacture DESC

j'ai le message : 

Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Champ 'promotions.amount' inconnu dans field list 

alors que le champs amount existe bien dans la table promotions

0
yg_be Messages postés 23338 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 novembre 2024 1 551
19 avril 2023 à 13:01

bonjour,

l'erreur vient de la ligne 11: la table promotions n'est pas dans le FROM correspondant.

Plus tu compliques ton SELECT, plus tu t'éloignes de la réponse à ta question initiale.

0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
19 avril 2023 à 19:00

cette requete foncionne :

SELECT 
    invoices.invoice as nfacture, 
    SUM(services.price * services.quantity) as prixtotal, 
    services.quantity as quantity, 
    (SELECT SUM(promotions.amount) FROM promotions WHERE promotions.invoice = services.invoice AND promotions.id_items = services.id_items) as promo,
    states.state as state, 
    invoices.numero as numero, 
    SUM(payments.amount) as paid,
    SUM(services.price * services.quantity) - IFNULL((SELECT SUM(promotions.amount) FROM promotions WHERE promotions.invoice = services.invoice AND promotions.id_items = services.id_items), 0) as PRIX_LIGNE
FROM invoices  
LEFT JOIN services ON (invoices.invoice=services.invoice)
LEFT JOIN states ON (invoices.invoice=states.invoice) 
LEFT JOIN payments ON (invoices.invoice=payments.invoice) 
WHERE states.type = 1 AND (states.state = 1 OR states.state = 9) 
GROUP BY nfacture
ORDER BY nfacture DESC
0
yg_be Messages postés 23338 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 novembre 2024 1 551
20 avril 2023 à 12:45

peux-tu alors marquer la discussion comme résolue?

0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
20 avril 2023 à 14:34

j'ai pas terminé

0