Page 1 sur 1

Problème d'affichage pour une gestion de relance de commande

Posté : 30 janv. 2006, 16:30
par lefreeman42
Bonjour,

J'ai un problème au niveau de ma boucle à mon avis.C'est la deuxième journée que je galère sur cet affichage de m****...

Voici ce que j'obtiens avec mon code :
http://img99.imageshack.us/my.php?image=ai2av.gif

Et ce voila ce que j'aimerais :
http://img59.imageshack.us/my.php?image ... eux2lg.gif

et voila mon super code lol
//Requête permettant d'avoir toutes les données nécessaires sur une commande de
//sous-traitance
$req = "SELECT * FROM cdefrs,cdecli,client,fournisseur "
		."WHERE reffrs=idfrs AND refcdecli=idcdecli AND refcli=idcli "
		."ORDER BY datedelai DESC";

//Exécution de la requête
$res = $bd->execRequete ($req); //correspond à mysql_query


$numeroannee=0;//On initialise numeroannee à 0


while ($nbcde = $bd->objetSuivant($res)) //correspond à mysql_fecth_object
{
    list($ad,$md,$jd) = explode("-",$nbcde->datedelai);//on récupère l'année, le mois et le jour
    $annee = substr($ad,2,2);//On récupère les deux derniers chiffres de l'année


	//On convertit la date délai en timestamp pour la comparer avec
	//le timestamp de la date d'aujourd'hui
	$datedelai = mktime (0,0,0,$md,$jd,$ad);


	//Récupération du numéro de semaine calculé à partir du timestamp
	//de la date delai
    $numsemaine=date('W',$datedelai);


	//Contrôle du numéro de la semaine de la date délai
	//Si la date est le 1er,2 ou janvier, et que d'après le timestamp Unix,
	//elle fait partit de le 52ème ou 53ème semaine de l'année précédente, on
	//remplace la valeur du numéro de semaine par la valeur '01'.
	if ( ($numsemaine==53 && $jd==1 && $md==1) or ($numsemaine==52 && $jd==1 && $md==1) )
	{
		$numsemaine='01';
	}
	elseif ( ($numsemaine==53 && $jd==2 && $md==1) or ($numsemaine==52 && $jd==2 && $md==1) )
	{
		$numsemaine='01';
	}
	elseif ( ($numsemaine==53 && $jd==3 && $md==1) or ($numsemaine==52 && $jd==3 && $md==1) )
	{
		$numsemaine='01';
	}


 	//Si l'année XXXX n'est pas déjà affichée, on l'affiche
	if ($numeroannee != $ad)
    {
		echo '<h2>PLANNING DE SOUS-TRAITANCE DE L\'ANNEE '.$ad.'</h2>';
		$numeroannee=$ad;
    }


//****************************************************************************//
//************************* PROBLEME A CE NIVEAU LA **************************//
//****************************************************************************//
	//On crée un nouveau tableau à chaque nouvelle semaine de l'annnée en cours
	echo '<h2>Semaine : '.$numsemaine.'/'.$annee.'</h2>
	    <table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
	      <tr>
	        <th scope="col" width="30%">DOSSIER</th>
	        <th scope="col" width="25%">SOUS-TRAITANT</th>
	        <th scope="col" width="25%">NATURE</th>
	        <th scope="col" width="10%">DELAI</th>
	        <th scope="col" width="10%">RECEPTION</th>
	      </tr>';


//****************************************************************************//
//********************* CONTROLE DE LA DATE DE RECEPTION *********************//
//****************************************************************************//

	//Si la délai n'a pas été dépassé, on ne met pas de couleur
	if ( date('U') <= ($datedelai) && $nbcde->datereception=="")
	{
		echo '
		        <tr align="center" valign="middle">';
	}
	else
	{
	    //Si la date de réception a été entrée, on colorie la ligne en bleue
		if ($nbcde->datereception != "")
		{
			echo '
		        <tr align="center" valign="middle" bgcolor="#84E6EC">';
		}
		//Sinon la date délai a été dépassée et on colorie la ligne en rouge
		else
		{
	   		echo '
		        <tr align="center" valign="middle" bgcolor="#FF4A4A">';
		}
	}


	//On affiche toutes les données concernant la commande de sous-traitance
	//dans un tableau
	echo '
	<td><table width="90%" border="0" cellpadding="0" cellspacing="0">
			  		<tr><td align="left" width="50%">'.$nbcde->nomcli.'</td>
				   		<td align="right" width="50%">'.$nbcde->numcdecli.'</td></tr>
	</table></td>
	<td><table width="90%" border="0" cellpadding="0" cellspacing="0">
		  <tr><td align="left" width="50%">'.$nbcde->nomfrs.'</td>
		  <td align="left" width="50%">'.$nbcde->numcdefrs.'</td></tr>
		</table></td>
	<td>'.$nbcde->nature.'</td>
	<td><b>'.$jd.'/'.$md.'/'.$ad.'</b></td>
	<td valign="middle">';


	//Si aucune date de réception n'a été entrée dans la base de données
	//On affiche une case à cocher
	if ($nbcde->datereception=="")
	{
	        echo '
			  <form method="POST" action="index.php" name="form">
	            <input type="checkbox" name="datereception[]" value="'.$nbcde->numcdefrs.'">';
	}
	else    //Sinon on affiche la date à laquelle la réception a été effectuée
	{
		// Décryptage de la date Unix
		$idate = getDate($nbcde->datereception);
		// Mise en forme de la date décryptée
		$date = $idate['mday'] . "/" . $idate['mon'] . "/" . $idate['year'];
	    echo $date;
	}

	//Fermeture du tableau
	echo '
			  </td>
	        </tr></table><br>';
}
J'ai essayé tout plein de contrôles, mais bon j'avais pas ce que je voulais
Je désespère...Surtout que c'est pour mon stage de deuxieme année...

Merci d'avance ^^

Posté : 30 janv. 2006, 16:56
par zeus
modération : pense à utiliser les balises PHP pour encadrer ton code, c'est plus clair ;)

Pour cette fois, j'ai modifié ton post mais pense y la prochaine fois

Posté : 30 janv. 2006, 17:07
par lefreeman42
Désolé de ne pas l'avoir fait :(
Merci d'avoir édité mon post ^^

Posté : 30 janv. 2006, 17:16
par zigz4g
Salut.

Je passais par la et je trouvais très interessant de voir ton code.

Je penses que tu manques de logique. Il faut commencer sur un bout de papier ton algorithme.

Petite idee de depart :

- Récuperer les informations de la base de données. (Ca c'est bon)
- Chercher a classiffier tes informations. Les classer par date dans ton cas.
|- Tu les classes bien grace a ton DESC dans ta requete mais tu t'en sert mal dans ton code.
|- Tu as l'année en premier donc faut que tu recupere l'année actuelle pour la décrementer par la suite. Genre un gettimeofday() ou time().
|- Tu as ton année, tu l'affiche. (<h2>)
|- Tu ouvre un tableau pour y mettre tes donnees en fonction de la semaine du mois si je suis tes images. (d'ailleurs, comment on fait pour avoir le jour 26/01/2006 dans la semaine : 07/06 ???)
|- Tu affiche donc tes semaines tableau par tableau.
|- Ici tu as fini pour ta premiere annee.
|- Tu decrementes ton annee et tu recommence. Bien sur tu fais attention s'il te manque des annees entres elles.

Petites aide:
- incremente bien ton code et espace le pour le lire plus rapidement et facilement.
- Evite le $i pour ta boucle while. Donne un nom plus parlant.
- Normallement sans non plus trop chercher dans ton code, je penses qu'avec une bonne structuration du code, tu dois pouvoir le faire avec 2 boucles for ou foreach. (Tout depend des developpeurs, bien sur :)

Bonne continuation.

Posté : 30 janv. 2006, 17:54
par lefreeman42
Merci pour tes conseils :wink:
d'ailleurs, comment on fait pour avoir le jour 26/01/2006 dans la semaine : 07/06 ???
Dans un premier temps, j'enregistre une commande de sous-traitance qui s'affichera dans un tableau(cf les images de mon 1er post).
Le numéro de semaine correspond uniquement à la date délai (date à laquelle la commande devrait être normalement reçu)
Le jour 26/01/2006 est le moment où la commande est réceptionnée,mais ne correspond pas forcément à la semaine marquée...

Le but de mon application c'est que le chef d'atelier, de l'entreprise où je suis en stage, puisse voir les commandes qui n'ont toujours pas été réceptionnées.
incremente bien ton code et espace le pour le lire plus rapidement et facilement
Je ne comprend pas vraiment ce que tu entends par incrémenter mon code

Posté : 30 janv. 2006, 18:04
par zigz4g
OUPPPSSSS erreur de ma part, je voulais dire indente bien ton code.

Posté : 30 janv. 2006, 18:07
par lefreeman42
Désole pour l'affichage du code, mais j'ai pris pour habitude de bien l'indenter, sinon j'ai beaucoup trop de mal à m'y retrouver

Bon je vais remédier à l'affichage du code mon 1er post ^^

Posté : 30 janv. 2006, 18:16
par lefreeman42
Ceci dit j'ai essayé de faire un contrôle dans le même style de l'année pour éviter un double affichage...Mais l'affichage est vraiment très moche :(

http://img71.imageshack.us/my.php?image ... tre3ey.gif

Posté : 30 janv. 2006, 18:38
par zigz4g
Oula !!!!


Bon faut vraiment que tu reffasse une refonte complete de ton code. Je ne vois pas trop comment tu as fait pour faire un melange aussi simple des annees.
Maintenant tu melanges les annees (2006 dans 2005).
Je sais que ce n'est jamais tres plaisant de refaire du code mais la je penses que pour toi tu devrais mieux reprendre de ta requettes SQL qui elle parrait etre bonne.

Ensuite commence par faire des petites fonctions qui te donneront les informations goute a goute. Genre une fonction pour avoir la date puis les infos pour cette date.

Enleve tout ton code HTML. De toute facon l'habillage des pages peux largement se faire apres ton implementation.

Posté : 30 janv. 2006, 18:43
par zigz4g
Es-tu sur de se que te retourne ta base de donnees ???
Tu fais bien le tri par la datedelai mais elle correspond exactement a ce que tu veux ?
Tu peux enlever ton code dans ta boucle et le remplacer par un simple affichage des donnees que tu recois pour bien veriifier.

Posté : 30 janv. 2006, 18:54
par lefreeman42
Maintenant tu melanges les annees (2006 dans 2005)
Ah bon ??? Où ca ???
Si c'est par rapport à la date de réception, celle-ci correspond à la date du jour...En gros, la personne a juste une case à cocher dans l'appli pour signaler que la commande a été réceptionnée(ca enregistrera la date au moment où la personne valide les commandes qu'elle a coché--->d'ou le 26/01/2006...ce sont des essais bidons)

Pour ma reqûete j'obtiens exactement ce que je veux, et j'ai déja un tableau ou je liste toutes les commandes...Et je n'ai aucun problème d'affichage.

Posté : 31 janv. 2006, 16:29
par Invité
Bon j'essaie de m'inspirer d'un code depuis ce matin, mais je n'ai pas obtenu grand chose...

Alors la j'ai réessayé en partant de quelque chose de tout simple :
$req = "SELECT * FROM cdefrs ORDER BY datedelai DESC";
//Exécution de la requête
$res = $bd->execRequete ($req);
$an="";
$semaine="";

while ($cde=mysql_fetch_array($res))
{
	list($a,$m,$j)=explode("-",$cde['datedelai']);
	$date=mktime(0,0,0,$m,$j,$a);
	if (($an != date('Y',$date))||($semaine != date('W',$date)))
	{
	    if ($an)
			echo 'Année : '.$an.'<br>';
		
		if ($semaine != date('W',$date))
		{
		    if ($semaine)
				echo 'Semaine : '.$semaine.'<p>';

			$semaine =  date('W',$date);
		}

		$an = date('Y',$date);
	}
}

Et j'obtiens :
Année : 2006
Semaine : 07

Année : 2006
Semaine : 05

Année : 2006
Semaine : 01

Année : 2006
Semaine : 52

Année : 2005
Semaine : 01

Année : 2005
Année : 2004
Semaine : 53
Normalement je devrais obtenir ceci si je ne me trompe pas:
Année : 2006
Semaine : 07

Année : 2006
Semaine : 05

Année : 2006
Semaine : 01

Année : 2005
Semaine : 52

Année : 2005
Semaine : 01

Année : 2004
Semaine : 53

Année : 2004
Semaine : 46
Soit je suis vraiment malchanceux, soit je suis extrêmement nul...

Vous pouvez me dire où mon erreur dans ce code tout simple ???

Je me suis inspiré de ca ( http://www.asp-php.net/tutorial/divers/ ... php?page=5 ):
$totgen=0; $totfam=0; $totelem=0; $sauvfam=""; $sauvelem="";

while($val=mysql_fetch_array($result)) {
   // Nouvel élément
   if(($val["element"]!=$sauvelem)||($val["famille"]!=$sauvfam)) {
      if($sauvelem) echo "</ul><li>Total ".$sauvelem."=".$totelem."</li>";
      $totfam+=$totelem;
      // Nouvelle famille
      if($val["famille"]!=$sauvfam) {
         if($sauvfam) echo "</ul><li>Total ".$sauvfam."=".$totfam."</li>";
         echo "<li>Début de : ".$val['famille']."</li><ul>";
         $sauvfam = $val["famille"];
         $totgen+=$totfam;
         $totfam=0; $sauvelem="";
      }
      echo "<li>Début de : ".$val['element']."</li><ul>";
      $sauvelem = $val["element"];
      $totelem=0;
   }
   // Traiter rubrique
   echo "<li>".$val['rubrique']." : ".$val['nombre']."</li>";
   $totelem+=$val['nombre'];
}
Help me, je désespere...

Posté : 31 janv. 2006, 16:31
par lefreeman42
Oups, je suis désolé j'ai oublié de me logger...

Posté : 01 févr. 2006, 10:42
par Invité
J'ai enfin réussi à obtenir ce que je voulais

Bon pour ceux que ca intéresse voici le nouveau code :
$bd = Connexion (NOM, PASSE, BASE, SERVEUR);

//****************************************************************************//
//*************************** AFFICHAGE DU FORMULAIRE ************************//
//****************************************************************************//

//Requête permettant d'avoir toutes les données nécessaires sur une commande de
//sous-traitance
$requete="SELECT * FROM cdefrs,cdecli,client,fournisseur "
		."WHERE reffrs=idfrs AND refcdecli=idcdecli AND refcli=idcli "
		."ORDER BY datedelai DESC";
$resultat=mysql_query($requete);

// Je t'explique un peu le plus le code
// afin que tu puisses l'adapter à ton cas
//
// Initialisation des variables
$sauvannee="";
$sauvsemaine="";
//
// Tant que ce n'est pas la fin du fichier
while($nbcde=$bd->objetSuivant($resultat)) //correspond à mysql_fecth_object
{
	list($ad,$md,$jd) = explode("-",$nbcde->datedelai);//on récupère l'année, le mois et le jour
    $annee = substr($ad,2,2);//On récupère les deux derniers chiffres de l'année


	//On convertit la date délai en timestamp pour la comparer avec
	//le timestamp de la date d'aujourd'hui
	$datedelai = mktime (0,0,0,$md,$jd,$ad);


	//Récupération du numéro de semaine calculé à partir du timestamp
	//de la date delai
	$semaine=date('W',$datedelai);
	
	//Récupération de l'année calculé à partir du timestamp
	//de la date delai
	$an=date('Y',$datedelai);

    //Contrôle du numéro de la semaine de la date délai
	//Si la date est le 1er,2 ou janvier, et que d'après le timestamp Unix,
	//elle fait partit de le 52ème ou 53ème semaine de l'année précédente, on
	//remplace la valeur du numéro de semaine par la valeur '01'.
	if ( ($semaine==53 && $jd==1 && $md==1) or ($semaine==52 && $jd==1 && $md==1) )
	{
		$semaine='01';
	}
	elseif ( ($semaine==53 && $jd==2 && $md==1) or ($semaine==52 && $jd==2 && $md==1) )
	{
		$semaine='01';
	}
	elseif ( ($semaine==53 && $jd==3 && $md==1) or ($semaine==52 && $jd==3 && $md==1) )
	{
		$semaine='01';
	}
	
	// Nouvelle semaine ?
	// si ce n'est pas égal c'est que c'est une nouvelle semaine
	if(($semaine!=$sauvsemaine)||($an!=$sauvannee))
	{
		// est-ce le premier ? si oui, afficher le total du précédent que l'on finit
		if($sauvsemaine)
			echo "</td></tr></table>";

		// Nouvelle année ?
		// si ce n'est pas égal c'est que c'est une nouvelle année
		if($an!=$sauvannee)
		{
			// si ce n''est pas la première, alors afficher la fin de celle que l'on finit
			if($sauvannee)
				echo "<p>";

			// et afficher le début de la nouvelle famille
			echo "<h2>PLANNING DE SOUS-TRAITANCE DE L'ANNEE ".$an."</h2>";
			// stocker cette nouvelle famille pour comparaison future
			$sauvannee = $an;
			//$sauvsemaine="";
		}
		// afficher la nouvelle semaine
		echo '<h2>Semaine : '.$semaine.'/'.$annee.'</h2>
	    <table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
	      <tr>
	        <th scope="col" width="30%">DOSSIER</th>
	        <th scope="col" width="25%">SOUS-TRAITANT</th>
	        <th scope="col" width="25%">NATURE</th>
	        <th scope="col" width="10%">DELAI</th>
	        <th scope="col" width="10%">RECEPTION</th>
	      </tr>';
		// sauvegarder cette nouvelle semaine pour comparaison future
		$sauvsemaine = $semaine;
	}

//****************************************************************************//
//********************* CONTROLE DE LA DATE DE RECEPTION *********************//
//****************************************************************************//

	//Si la délai n'a pas été dépassé, on ne met pas de couleur
	if ( date('U') <= ($datedelai) && $nbcde->datereception=="")
	{
		echo '
		        <tr align="center" valign="middle">';
	}
	else
	{
	    //Si la date de réception a été entrée, on colorie la ligne en bleue
		if ($nbcde->datereception != "")
		{
			echo '
		        <tr align="center" valign="middle" bgcolor="#84E6EC">';
		}
		//Sinon la date délai a été dépassée et on colorie la ligne en rouge
		else
		{
	   		echo '
		        <tr align="center" valign="middle" bgcolor="#FF4A4A">';
		}
	}


	//On affiche toutes les données concernant la commande de sous-traitance
	//dans un tableau
	echo '
	<td><table width="90%" border="0" cellpadding="0" cellspacing="0">
			  		<tr><td align="left" width="50%">'.$nbcde->nomcli.'</td>
				   		<td align="right" width="50%">'.$nbcde->numcdecli.'</td></tr>
	</table></td>
	<td><table width="90%" border="0" cellpadding="0" cellspacing="0">
		  <tr><td align="left" width="50%">'.$nbcde->nomfrs.'</td>
		  <td align="left" width="50%">'.$nbcde->numcdefrs.'</td></tr>
		</table></td>
	<td>'.$nbcde->nature.'</td>
	<td><b>'.$jd.'/'.$md.'/'.$ad.'</b></td>
	<td valign="middle">';


	//Si aucune date de réception n'a été entrée dans la base de données
	//On affiche une case à cocher
	if ($nbcde->datereception=="")
	{
	        echo '
			  <form method="POST" action="index.php" name="form">
	            <input type="checkbox" name="datereception[]" value="'.$nbcde->numcdefrs.'">';
	}
	else    //Sinon on affiche la date à laquelle la réception a été effectuée
	{
		// Décryptage de la date Unix
		$idate = getDate($nbcde->datereception);
		// Mise en forme de la date décryptée
		$date = $idate['mday'] . "/" . $idate['mon'] . "/" . $idate['year'];
	    echo $date;
	}
}

//On affiche le bouton valider et la légende pour bien comprendre à quoi
//correspondent les couleurs. Cependant ce n'est pas très utile.
echo '	  <div align="center">
          <input type="submit" name="Submit" value="Valider">
      </form>
	  </div>';
//****************************************************************************//
//*********************** FIN AFFICHAGE DU FORMULAIRE ************************//
//****************************************************************************//
Merci pour l'aide ^^

Posté : 01 févr. 2006, 10:44
par lefreeman42
J'ai encore oublié de me logger...Désolé

Je ne comprend pas aussi, je n'arrive pas à modifier le sujet de mon 1er post pour pouvoir marquer résolu.
Désolé pour la gêne occasionné pour les modos :(