Page 1 sur 1

Ajout automatique

Posté : 02 mars 2007, 19:15
par dunbar
Bonjour,
J'ai un fichier dans lequel j'ai les resultats du mois en court et ceux des mois précédent.
<td style="border: 1px solid #6699CC" 
width="102">Mars 2007</td>
							<td style="border: 1px solid #6699CC" 
width="427" align="center"><?php echo 'Il y a '.$ta_03_07.' enregistrement(s)dans la table prestations.';?></td>
Mais je dois rajouter à la fin de chaque mois une nouvelle ligne manuellement donc pour le mois prochain à la fin du mois se sera
<td style="border: 1px solid #6699CC" 
width="102">Avril 2007</td>
							<td style="border: 1px solid #6699CC" 
width="427" align="center"><?php echo 'Il y a '.$ta_04_07.' enregistrement(s)dans la table prestations.';?></td>
Ma question est t'il possible de faire cela automatiquement ???

D'avance merci

Posté : 03 mars 2007, 17:59
par Ryle
On va dire que oui.. :)

En supposant que les valeurs de tes $ta_03_07 et $ta_04_07 proviennent d'une base ou d'un fichier, et que l'on peut également y trouver l'info pour savoir de quel mois il s'agit, il te suffit de boucler sur ta liste de résutlats et d'afficher une ligne pour chaque :)

Posté : 03 mars 2007, 18:28
par dunbar
On va dire que oui.. :)

En supposant que les valeurs de tes $ta_03_07 et $ta_04_07 proviennent d'une base ou d'un fichier, et que l'on peut également y trouver l'info pour savoir de quel mois il s'agit, il te suffit de boucler sur ta liste de résutlats et d'afficher une ligne pour chaque :)
Les $ta_xx_07 provienent d'un fichier qui lui reprend les requettes des 12 $ta_xx_xx

J'ai mes douzes requettes
$sql = "SELECT SUM(prix) as montant FROM prestation WHERE YEAR(date) = 2007 AND MONTH(date) = 3 ";
      $somme = mysql_query($sql) or die ('Erreur : '.mysql_error() );

      $detail_03_07 = mysql_fetch_assoc($somme);

      $sql = mysql_query('SELECT TA FROM prestation WHERE YEAR(date) = 2007 AND MONTH(date) = 3 ');
      $ta_03_07 = mysql_num_rows($sql);
Mais je ne comprend pas se que veux dire :oops:

Posté : 03 mars 2007, 22:21
par Ryle
Bon alors, déjà on va te simplifier tes 12 x 2 requêtes, parce que ca me fait mal de te voir en faire 24 quand une seule doit suffire :)

Il te faut simplement récupérer le mois, le TA (quoi que cela puisse être ;)) et ta somme, en groupant les infos suivant le mois et le TA :
$sql = "SELECT MONTH(date) AS mois, ta, SUM(prix) AS montant FROM prestation 
  WHERE YEAR(date) = 2007
  GROUP BY MONTH(date), TA
  ORDER BY date
";
// J'ai mis dans la condition année 2007, mais si tu as besoin de 12 mois glissant ou aute, suffit de préciser du tant au tant :)

$rs = mysql_query($sql) or die ('Erreur : '.mysql_error() ); 

// reste plus qu'à boucler sur chaque enregustrement retourné pour les afficher 
while ($row = mysql_fetch_assoc($rs)) {
  // tu fignoleras avec du html et un tableau selon tes besoins :)
  echo 'Pour le mois '.$row['mois'].', le TA est '.$row['ta'].' et le montant est de '. $row['montant'];
}
A tester, mais ca devrait le faire :)

Posté : 04 mars 2007, 00:31
par dunbar
Merci pour cette piste :wink:
Décidément je ne comprendrer jamais les boucles..
Alors voici une modif de ton code
$sql = "SELECT
        MONTH(date) AS mois, TA, SUM(prix) AS montant FROM prestation
        WHERE YEAR(date) = 2007 AND MONTH(date)
        GROUP BY MONTH(date), TA
        ORDER BY date
";

$month = array(	
                1 	=> 'Janvier',
							2 	=> 'Février',
							3 	=> 'Mars',
							4 	=> 'Avril',
							5 	=> 'Mai',
							6 	=> 'Juin',
							7 	=> 'Juillet',
							8 	=> 'Aout',
							9 	=> 'Septembre',
							10 	=> 'Octobre',
							11 	=> 'Novembre',
							12 	=> 'Décembre');





$row['mois'] = $month[date('n')];


// J'ai mis dans la condition année 2007, mais si tu as besoin de 12 mois glissant ou aute, suffit de préciser du tant au tant :)

$rs = mysql_query($sql) or die ('Erreur : '.mysql_error() );

// reste plus qu'à boucler sur chaque enregistrement retourné pour les afficher
while ($row = mysql_fetch_assoc($rs)) {
  // tu fignoleras avec du html et un tableau selon tes besoins :)
  echo 'Pour le mois '.$month.', le TA est '.$row['TA'].' et le montant est de '. $row['montant'];
Alors deux choses

1- ta boucle me retourne le valeur du TA et PAS le total des TA du mois.
2- Et mon tableau ne fonctionne pas je reçois toujours pour le mois 1 pour le mois 2 et non pas pour le mois de janvier, pour le mois de février ?

Ou j'ai commis une erreur ??
Je pense pourtant avoir bien fait mon tableau :?:

D'avance merci

Posté : 04 mars 2007, 02:37
par Ryle
La boucle c'est pas bien compliqué, au lieu de taper 12 fois le même code en changeant manuellement le numéro de mois dans chaque, tu ne le tapes qu'une fois et tu demandes à php de l'exécuter 12 fois en changeant tout seul le numéro :)
L'idée ici est donc d'avoir une requête qui va te ramener les n enregistrements dont tu as besoin et executer ton code n fois, au lieu de t'obliger à tout faire manuellement :)
1- ta boucle me retourne le valeur du TA et PAS le total des TA du mois.
Pour le TA, je me suis basé sur ta requête ('SELECT TA FROM prestation WHERE YEAR(date) = 2007 AND MONTH(date) = 3 '), si tu veux la somme des TA pour le mois, il suffit de mettre un SUM(ta) et de le retirer du group by :)
$sql = "SELECT 
        MONTH(date) AS mois, SUM(ta) AS somme_ta, SUM(prix) AS montant FROM prestation 
        WHERE YEAR(date) = 2007 
        AND MONTH(date) .......
        GROUP BY MONTH(date) 
        ORDER BY date 
"; 
A noter par ailleurs, que tes conditions sont incomplètes, il et manque une valeur pour le mois :
WHERE YEAR(date) = 2007 // WHERE l'année est égale à 2007
AND MONTH(date) // ET le mois est ... ???

Ton critère devrait être du genre :
AND MONTH(date) BETWEEN 1 AND 3 // entre 1 et 3
AND MONTH(date) IN (1, 3) // égale à 1 ou égale à 3
AND date BETWEEN '2006-10-01' AND '2007-03-31' // entre octobre 2006 et avril 2007 (mais faut virer le YEAR(date) = 2007 dans ce cas ;))
2- Et mon tableau ne fonctionne pas je reçois toujours pour le mois 1 pour le mois 2 et non pas pour le mois de janvier, pour le mois de février ?
Un petit problème d'algo ça :) Suivons le déroulement de ton code ligne à ligne :
$sql = "..."; // tu prépares la requête que tu stockes dans $sql

$month = array( ... ); // tu définis le tableau des mois dans $month

$row['mois'] = $month[date('n')]; // et là ca devient flou ;)
// tu stockes dans un tableau $row['mois'] qui n'existe pas encore (puisqu'il n'est définie que dans la boucle), 
// le libellé du mois du tableau $month, associé au numéro du mois en cours (date('n')), donc 3, donc mars.

$rs = mysql_query($sql) .... ; // tu exécutes la requête

while ($row = mysql_fetch_assoc($rs)) { // pour chaque ligne retournée par la requête,
  // on crée un tableau associatif que l'ont met dans $row
  // ce qui accéssoirement écrase la valeur que tu y a affectés plus haut.
 
  // en fait, c'est dans la boucle qu'il faut aller chercher le mois correspondant dans $month 
  // non pas à partir du mois en cours, mais à partir du mois que tu as récupéré grace à la requête : $row['mois']

  echo 'N° de mois = '. $row['mois'] .'<br />'; 
  echo 'Libellé de mois = '. $month[$row['mois']] .'<br />'; 
  echo 'Somme des TA = '. $row['somme_ta'] .'<br />'; 
  echo 'Somme des prix = '.$row['montant'].'<br />'; 

  echo '<br />'; // saut de ligne avant le mois suivant

}
C'est y plus clair ? (après ça, les boucles n'auront plus de secret pour toi :))

Posté : 04 mars 2007, 16:03
par Ryle
Cool :)

Pour ton erreur sql , il faudrait voir toute la requête, mais je te soupsonne de ne pas gérer correctement le WHERE / AND et d'omettre le premier ou de laisser les deux :

Code : Tout sélectionner

SELECT MONTH(date) AS mois, COUNT (TA) AS TA, SUM(prix) AS montant FROM prestation WHERE date BETWEEN '2006-09-01' AND '2007-12-31' GROUP BY MONTH(date) ORDER BY date
Sinon une dernière petite remarque, concernant la déclaration de ton tableau $month_fr, tu pouvais (et il vaut d'ailleurs mieux) le laisser en dehors de la boucle :) Puisque c'est le même tableau que tu vas utiliser à chaque itération (passage dans ta boucle), tu n'as besoin de le définir qu'une seule fois au préalable.
Tel qu'est fait ton code, tu vas le redéfinir à chaque itération, c'est pas génant, mais c'est pas optimisé :) La correspondance entre le numéro et le mois en revanche elle se fait bien dans la boucle, c'est juste la définition du tableau de correspondance qu'il faut sortir :)

Posté : 04 mars 2007, 17:06
par dunbar
Bon alors voilà, concernat l'arreur sql tu avais raison (comme d'habitude :wink: ).

Mon/ton code fonctionne enfin.
$sql = "SELECT
              MONTH(date) AS mois, COUNT(TA) AS TA, SUM(prix) AS montant
              FROM prestation
              WHERE date BETWEEN '2006-09-01' AND '2007-12-31'
              AND MONTH(date) BETWEEN 1 AND 12
              GROUP BY MONTH(date)
              ORDER BY IDot DESC
              ";



      $sql = mysql_query($sql) or die ('Erreur : '.mysql_error() );





       $month_fr = array  (	1 	=> 'Janvier',
							2 	=> 'Février',
							3 	=> 'Mars',
							4 	=> 'Avril',
							5 	=> 'Mai',
							6 	=> 'Juin',
							7 	=> 'Juillet',
							8 	=> 'Aout',
							9 	=> 'Septembre',
							10 	=> 'Octobre',
							11 	=> 'Novembre',
							12 	=> 'Décembre');








         echo '<center>
              <table cellspacing="1" border="1" width="821" style="border: 1px solid #6699CC">'."\n";

         echo '<tr>
		       <td style="border: 1px ridge #6699CC" background="../../style/imgs/fd_bt_1.gif" width="513" align="center" colspan="3">
			   <b>Montant des prestations déjà effectuées.</b></td>
	           </tr><tr>';

         echo '<td style="border: 1px ridge #6699CC" background="../../style/imgs/fd_bt_1.gif" width="83" align="center">
			   <b><font size="2">Mois</font></b></td>';

         echo '<td style="border: 1px ridge #6699CC" background="../../style/imgs/fd_bt_1.gif" width="264" align="center">
			   <b<font size="2">Nombres d'installation</font></b></td>';

		 echo '<td style="border: 1px ridge #6699CC" background="../../style/imgs/fd_bt_1.gif" width="156" align="center">
			   <b><font size="2">Montant</font></b></td>';

         echo '</tr>'."\n";


    // lecture et affichage des résultats .
    while($row = mysql_fetch_array($sql)){


        echo '<tr>';

         echo '<td style="border: 1px ridge #6699CC" align="center" >'.$month_fr[$row['mois']].'</td>';

         echo '<td style="border: 1px solid #6699CC; " 
align="center"  >il y à '.$row['TA'].' 
enregistrement(s) dans la table prestation.</td>';

         echo '<td style="border: 1px ridge #6699CC" align="center" >'.$row['montant'].'</td>';

       echo '</tr>'."\n";

    }
    echo '</table></center>'."\n";
    // fin du tableau.

Tout fonctionne nickel
Je suis preneur pour toutes amélioration.
Sincèrement Merci :wink:

Posté : 04 mars 2007, 19:55
par Ryle
Bah je crois que côté optimisation c'est déjà pas mal d'être passé de 24 requêtes à une seule :) Pour continuer encore un peu (ça commence à devenir difficile ;)) au niveau des critères de ta requête :

Code : Tout sélectionner

WHERE date BETWEEN '2006-09-01' AND '2007-12-31' AND MONTH(date) BETWEEN 1 AND 12
- dans le WHERE : tu ramènes toutes les lignes dont la date est comprise entre le 1er octobre 2006 et le 31 décembre 2007
- dans le AND : tu ramènes tous les enregistrements pour lesquels le mois de la date est compris en 1 et 12.

Tu peux donc supprimer cette seconde condition qui est moins restrictive que la première, et qui accessoirement sera toujours vrai (y a peu de chance qu'une date ait un mois à 0 ou à 13 ;))

Attention également lorsque tu utilises des apostrophes pour délimiter les chaines, a bien protéger les apostrophes qu'elle contient : Nombres d\'installation (mais tu as déjà du corriger :))

Vala, à part ça, je ne vois plus que l'indentation à uniformiser et les 8 à 10 lignes que tu sautes par endroit à ramener à une ou deux, pis t'aura un truc tout propre :)

Ah pis si tiens, un dernier truc, tu peux rendre dynamique les dates dans ta requête (avec php ou sql) en le faisant partir de la date du jour (genre -6 mois à +6 mois, ou les 12 derniers mois pour avoir un tableau glissant, bref en fonction de ce dont tu as besoin) l'idée étant ainsi en 2008 de ne pas avoir à revenir modifier ton code pour changer les dates ;)

(ouais, je sais, je suis un grand paresseux par anticipation ;))

Posté : 04 mars 2007, 20:02
par dunbar
Merci pour les conseils, mais j'ai une question (c'est de ta faute :wink: ) pourrais tu être une miette plus précis concernant ceci :
Ah pis si tiens, un dernier truc, tu peux rendre dynamique les dates dans ta requête (avec php ou sql) en le faisant partir de la date du jour (genre -6 mois à +6 mois, ou les 12 derniers mois pour avoir un tableau glissant, bref en fonction de ce dont tu as besoin) l'idée étant ainsi en 2008 de ne pas avoir à revenir modifier ton code pour changer les dates ;)
Merci :wink:

Posté : 04 mars 2007, 20:18
par Ryle
Je sens à ta question que le paresseux qui est en toi à tendu l'oreille également ;)

Ce qui faut bien voir, c'est que ta requête SQL n'est rien de plus qu'une chaine générée par php et envoyée ensuite à mysql. Tu peux donc très bien, au lieu d'écrire ta requête "en dur", rendre certaines parties de ta chaine dynamiques, par exemple sortir les dates :
$dateDebut = '2006-09-01';
$dateFin = '2007-12-31';
$sql = "SELECT MONTH(date) AS mois, COUNT(TA) AS TA, SUM(prix) AS montant 
  FROM prestation 
  WHERE date BETWEEN '".$dateDebut."' AND '".$dateFin."' 
  GROUP BY MONTH(date) 
  ORDER BY IDot DESC 
";
Bon, c'est bien, mais là elles sont toujours en dur.. alors on va utiliser la fonction date() de php pour savoir quel jour on est et rendre ces dates dynamiques :
$anneeEnCours = date('Y'); // (2007)
$anneePrecedente = $anneeEnCours - 1; // l'an dernier donc 2006

$dateDebut = $anneePrecedente.'-01-01'; // on va du 1er janvier de l'an dernier
$dateFin = $anneeEnCours . '-12-31'; // jusqu'au 31 décembre de cette année
donc aujourd'hui ca te retournera du 1/1/2006 au 31/12/2007 et au premier janvier 2008, ca te retournera automatiquement du 1/1/2007 au 31/12/2008 :)

Ca c'est si tu veux l'année en cours et l'année précédente, mais tu peux tout aussi bien calculer pour avoir 3, 6, 12 mois glissant (en jouant sur mois + année au lieu de l'année seulement), etc.

Sachant que là c'est un exemple de ce que tu peux faire en php, mais il existe également des fonction MySQL comme NOW() pour connaitre la date du jour à laquelle tu peux ajouter ou enlever des jours, des mois, des années... Y a un très chouette topic sur les manipulations des dates en php et mysql dans la faq :)

Posté : 04 mars 2007, 21:22
par dunbar
Génial et merci, ou comme je suis un grand féné........ je ne devrais plus toucher à mon fichier. :lol:

Merci je vais étudier les différentes fonction possible..

Posté : 04 mars 2007, 22:30
par dunbar
Génial et merci, ou comme je suis un grand féné........ je ne devrais plus toucher à mon fichier. :lol:

Merci je vais étudier les différentes fonction possible..
Suivant tes conseil une rajoute elle indique l'année à côter du mois, c'est utile puisque tu pourrais avoir deux mois dans le tableau exemple janvier 06 et 07 :cry:
while($row = mysql_fetch_array($sql)){

        /*TABLEAU pour l'année du mois de l'encodage*/

        $date = $row['date_encodage'];
        list($annee, $mois, $jour) = explode("-", $date);

         echo '<tr>';
         echo '<td style="border: 1px ridge #6699CC" align="left" >'.$month_fr[$row['mois']].' '.$annee.'</td>';
         echo '<td style="border: 1px solid #6699CC; " align="center"  >il y à '.$row['TA'].' enregistrement(s) dans la table prestation.</td>';
         echo '<td style="border: 1px ridge #6699CC" align="center" >'.$row['montant'].'€.</td>';
         echo '</tr>'."\n";
    }
    echo '</table></center>'."\n";
Bon là je pense que c'est bon pour cette partie du site, mais rassure toi je vais surement avoir d'autre question mais come dirais ......... c'est un autre topic :P

Merci

Posté : 05 mars 2007, 19:57
par dunbar
Salut

Me revoilà question dans mon je voudrais que le dernier jour du mois à 00:00:00 apparaîsse une image qui permette de télécharger sous format excel les prestation du mois.
Donc j'ai commencer un export des données de ma TABLE vers Excel
Ici :
<?
include 'fc-phpconnect_tvc.php';


header("Content-type: application/vnd.ms-excel");

header("Content-Disposition: attachment; filename=Facturation du mois de.xls");


    $requete = mysql_query("SELECT
                           ref_client,
                           nom_client,
                           adr_client,
                           commune,
                           code_postal,
                           date_encodage,
                           adr_modem,
                           technicien,
                           heure_debut,
                           heure_fin,
                           TA
                           FROM prestation
                           WHERE YEAR(date) = YEAR(CURDATE()) AND MONTH(date) = MONTH(CURDATE())
                           ORDER BY commune");


    if (mysql_numrows($requete) ==0)
        {   // si elle est vide, on en informe l'utilisateur à l'aide d'un Javascript
            print "<script> alert('La requête n\'a pas abouti !')</script>";
        }

   // construction du tableau HTML
  print '<table border=1>

             <TR><TD>Référence</TD><TD>Nom</TD><TD>Adresse</TD>
<TD>Commune</TD><TD>cd_postal</TD><TD>Date</TD>
<TD>Modem</TD><TD>Technicien</TD><TD>Début</TD>
<TD>Fin</TD><TD>TA</TD></TR><TR>';


    for ($ligne=0 ; $ligne<@mysql_numrows($requete);$ligne++)
     {
         for ($colonne = 0;$colonne < 11 ; $colonne++)
              {
                 print '<TD>' .mysql_result($requete , $ligne,$colonne).  '</TD>';
              }
       print '</TR>';
      }
    print '</TABLE>';
    mysql_close();


   if (mysql_numrows($requete) >0)
        {
            print "<script> alert('La table est bien mise à jour !')</script>";
        }
?>
Là ou je bloque c'est que je ne voie vraiment comment faire apparaître un lien automatiquement ç la fin du mois dans mon tableau suivant

fichierxx.php
echo '<center>
              <table cellspacing="1" border="1"  style="border: 1px solid #6699CC">'."\n";
         echo '<tr>
		       <td style="border: 1px ridge #6699CC" background="style/imgs/fd_bt_1.gif"  align="center" colspan="3">
			   <b><font size="1">Montant des prestations déjà effectuées.</font></b></td>
	           </tr><tr>';
         echo '<td style="border: 1px ridge #6699CC" background="style/imgs/fd_bt_1.gif" width="83" align="center">
			   <b><font size="1">Mois</font></b></td>';
         echo '<td style="border: 1px ridge #6699CC" background="style/imgs/fd_bt_1.gif" width="364" align="center">
			   <b><font size="1">Nombres d'installation</font></b></td>';
		 echo '<td style="border: 1px ridge #6699CC" background="style/imgs/fd_bt_1.gif" width="56" align="center">
			   <b><font size="1">Montant</font></b></td>';
         echo '</tr>'."\n";
    // lecture et affichage des résultats .
    while($row = mysql_fetch_array($sql)){

        /*TABLEAU pour l'année du mois de l'encodage*/

        $date = $row['date_encodage'];
        list($annee, $mois, $jour) = explode("-", $date);

         echo '<tr>';
         echo '<td style="border: 1px ridge #6699CC" align="left" >'.$month_fr[$row['mois']].' '.$annee.'</td>';
         echo '<td style="border: 1px solid #6699CC; " align="center"  >il y à '.$row['TA'].' enregistrement(s) dans la table prestation.</td>';
         echo '<td style="border: 1px ridge #6699CC" align="center" >'.$row['montant'].'€.</td>';
         echo '</tr>'."\n";
    }
    echo '</table></center>'."\n";
Et un tout dernier truc comment lui faire prendre comme nom de fichier le mois des prestation ?

D'avance merci