[RESOLU] Sous totaux choix entre php et mysql

Bernard_2102
Invité n'ayant pas de compte PHPfrance

21 oct. 2016, 18:04

Bonjour,
Je souhaite insérer des sous totaux dans une table détail devis mais je ne sais pas ce qui se pratique et j'ai peur d'inventer une usine à gaz si vous pouvez me donner une piste je suis preneur, je vous indique ce à quoi j'ai pensé.
Pour info mes lignes sont numérotées.
-1 faire un traitement php pendant l'élaboration du formulaire, par exemple créer un article sous total, quand il sort on affiche la valeur de la variable qui compte dans la boucle puis on remet la valeur à zéro jusqu’au prochain ainsi de suite.
-2 requête mysql avec group by je pense créer un champ sous total que l'on incrémente d'un à chaque sous total de manière à organiser les groupes pour effectuer les totaux.
Merci pour votre lumière.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 oct. 2016, 10:06

salut,

ce n'est pas une bonne idée.
ceci n'est qu'une information pour l'affichage, soit tu la calcule dynamiquement à l'affichage, dans le while d'affichage tu ajoutes le tarif à une variable temporaire que tu affiches ensuite. il te faut aussi une variable pour savoir si tu change ou pas de catégorie.

tu peux aussi le faire en SQL directement pour avoir la somme liée à une sous catégorie et l'afficher lorsque tu changes de catégorie.

par exemple
<?php 
$subTotal = 0;
$oldCat = "";
// la requete sql
// le traitement
while ($data = $req->fetch()) {
  if(empty($oldCat)){
    $oldCat = $data['categorie'];
  }
  if(!empty($oldCat) && $oldCat != $data['categorie']){
    // ça peut être une tablea html aussi hein :)
    echo 'le sous total :',$subTotal,'<br />';
    $subTotal = 0;
  }
  $subTotal += $data['tarif'];
  echo 'les données de la lignes affichées ici<br />';
}
// pense à afficher le dernier sous total ;)


//tu peux remplacer l'utilisation du sous total par une fonction qui fait le calcul sur la base
function getSubTotal($categorie, $predicat){
  // requete sql qui va bien
  return 42;//le sous total ;)
}
$oldCat = "";
// la requete sql
// le traitement
while ($data = $req->fetch()) {
  if(empty($oldCat)){
    $oldCat = $data['categorie'];
  }
  if(!empty($oldCat) && $oldCat != $data['categorie']){
    // ça peut être une tablea html aussi hein :)
    echo 'le sous total :',getSubTotal($data['categorie'],'le predicat de la première requête'),'<br />';
  }
  echo 'les données de la lignes affichées ici<br />';
}

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 22 Messages

24 oct. 2016, 11:22

trop fort moogli je n'en espérais pas tant, merci tu me fais gagner du temps.

Eléphanteau du PHP | 22 Messages

25 oct. 2016, 00:07

moogli je me suis emballé un peu vite, car après analyse de ton code je m'aperçois qu'en cas d'effacement d'un sous total il faut que je ré-index ma variable catégorie (faisable mais pas simple) quand je delete une ligne je renumérote déjà toutes les autres pour ne pas avoir de trous, permets moi de revenir sur une de mes solutions, consistant à utiliser un article dédié à cette fonction au lieu de comparer $holdcat a categorie je compare l'ID de l'article dédié, aux articles de la boucle while ( dans l'affichage l'intitulé est déjà bon "sous total") et j'affiche la somme des tarifs quand je le rencontre, ensuite remise à 0 de la somme des tarifs, et ainsi de suite, l'avantage si je delete un sous total aucun traitement n'est nécessaire, aucun souci pour le dernier et pas de champ supplémentaire dans la table . merci pour le code que tu m'as indiqué il est très proche

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 oct. 2016, 13:05

de rien

pour ce qui est de la réindexation, désolé, mais c'est une connerie. le fait qu'il ai des trous dans les index n'est pas un problème ils sont la pour servir de référence, s'il en manque un c'est que la données associée n'existe plus ce n'est pas grave ;)
de plus il y a un risque (même minime) de ne se planter ;)


@+
Il en faut peu pour être heureux ......