recherche pour faire un total de chaque produit

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 oct. 2005, 12:43

Concernant la requête émise par zeus:
Effectivement il y'a des petites erreurs, le champ commande_id doit être préfixé par le nom de la table d'origine exemple : commande.commande_id ou contient.commande_id car ce champ existe dans les deux tables.

même remarque pour le champ produit_id qui existe à la fois dans "contient" et "produit".

Je t'explique le fonctionnement de sa requête:

select commande.commande_id, avion_id, commande_date, produit.produit_id, SUM(produit_quantite)
Permet de définir les champs à retourner par la requête et dont on a besoin pour les traitements

from (commande JOIN contient ON commande.commande_id=contient.commande_id) JOIN produit ON contient.produit_id=produit.produit_id
Pour définir les tables utilisées et leurs jointures

where commande_date >= '".$date_debut."'
and commande_date <= '".$date_fin."'

Pour définir les critères de sélection

order by produit.produit_id desc
Pour définir un tri de sortie

Seulement je ne suis pas pour cette requête
le mieu est d'utiliser un GROUP BY (regroupement) au lieu d'un ORDER BY (tri) car le select effectue une somme (SUM) des quantités et chose importante, il n'est pas utile d'afficher les détails d'info tel que les infos sur les commandes puisque le traitement voulu s'oriente vers la gestion de stock (la somme des quantités sorties par produit)
Dans ce sens je te préconise cette requête :
SELECT produit.produit_id, produit_designation, SUM(produit_quantite) as quantité_sortie

FROM  (commande JOIN contient ON commande.commande_id=contient.commande_id) JOIN produit ON contient.produit_id=produit.produit_id 
                  
WHERE commande_date >= '".$date_debut."' 
                  and commande_date <= '".$date_fin."' 

GROUP BY produit.produit_id, produit_designation
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

05 oct. 2005, 13:43

Tu ne comprend pas la requete ? :shock:

Mis à part le SUM et le GROUP BY, c'est ta requête :lol:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 181 Messages

05 oct. 2005, 14:32

ok c'est bon je comprend la requete.... merci :wink:

c'est que je la placais pas au bon endroit.... donc des erreurs comme tjrs... :wink:

merci pour votre aide car sinon j'aurais eu mal a la tete ce soir avec les boucles interminables :D

Eléphant du PHP | 181 Messages

06 oct. 2005, 10:22

bon ben j'ai un probleme avec la requete....

elle me fait le regroupement de toutes les commandes et pas de celles selectionnees dans la page d'avant.

voici le code de ma page de selection de commande:

Code : Tout sélectionner

<form name="form1" method="post" action="impression_bis.php"> <table width="50%" border="1" align="center" cellspacing="0" > <tr> <td><div align="center">&nbsp;</div></td> <td><div align="center"><strong>Immat</strong></div></td> <td><div align="center"><strong>Date</strong></div></td> </tr> <?php $i = 0; while ($data = mysql_fetch_assoc($req)) { if (fmod($i, 2) <> 0) { $BkColor="EEEEEE"; } else { $BkColor="FFFFFF"; } //recuperation de l'immat: $sql_immat = "select avion_immat from avion where avion_id = '".$data['avion_id']."'"; $req_immat = mysql_query($sql_immat) or die('Erreur SQL !<br>'.$sql_immat.'<br>'.mysql_error()); $d = mysql_fetch_array($req_immat); extract($d); ?> <tr bgcolor="<?php echo $BkColor;?>"> <td><div align="center"> <input type="checkbox" name="100[]" value="<?php echo $data['commande_id']?>"> </div></td> <?php $data['commande_date'] = date_ok_fr($data['commande_date']);?> <td align="center"><?php echo $avion_immat?></td> <td align="center"><?php echo $data['commande_date']?></td> </tr> <?php $i++; } ?> </table> <table width="100%" > <tr> <td><table width="100%" > <tr> <td width="50%"><table width="10%" border="1" align="right" cellspacing="0" > <tr> <td>100%</td> <td><input checked type="radio" name="impression" value="100"></td> </tr> <tr> <td>130%</td> <td><input type="radio" name="impression" value="130"></td> </tr> </table></td> <td width="50%"><table width="10%" border="1" cellspacing="0" > <tr> <td>Liste d&eacute;taill&eacute;e </td> <td><input checked type="radio" name="detail" value="1"></td> </tr> <tr> <td>Liste regroup&eacute;e </td> <td><input type="radio" name="detail" value="2"></td> </tr> </table></td> </tr> </table></td> </tr> <tr> <td> <div align="center"> <input type="submit" name="Submit" value="Imprimer"> </div></td> </tr> </table>
et voici celle de mon regroupement a partir de mon if de regroupement:
<?php }
if ($_POST['detail'] === '2'){
	//initialisation:
	$tab = array();
	$cpt = 0;
	$nbr_article = 0; 
?>
	<table width="100%" >
	  <tr>
		<td><form><input type="button" value="Retour" name="Retour" OnClick="history.back()"></form></td>
	  </tr>
	  <tr>
		<td colspan="2"><em>Pour imprimer: <strong>Ctrl + P</strong> </em></td>
	  </tr>
	</table>
	<?php
	if (!isset($_POST['100'])) {
		echo '<div align="center">vous n\'avez rien choisit.'.'<br>';
		exit();
	}
	?>
	<table width="50%" border="1" cellspacing="0" >
	  <tr>
		<td><div align="center"><strong>N&deg;</strong></div></td>
		<td><div align="center"><strong>D&eacute;signation</strong></div></td>
		<td><div align="center"><strong>Quantit&eacute;</strong></div></td>
	  </tr>
	 <?php
	 $i=0;
	 foreach ($_POST['100'] as $normal) {
	   $tab[$i] = $normal;
	   echo $tab[$i].'<br>';
	   $i++;
	 }
		$sql_normal = "SELECT produit.produit_id, produit_designation, produit_num,
								sum(quantite) as quantité_sortie
						FROM  (commande JOIN contient ON contient.commande_id in ('".$tab."')) 
								JOIN produit ON contient.produit_id=produit.produit_id                  
						GROUP BY produit.produit_id, produit_designation";

		
		
		
		$req_normal = mysql_query($sql_normal) or die('Erreur SQL !<br>'.$sql_normal.'<br>'.mysql_error());
		$cols_normal = mysql_num_rows($req_normal);	
		for ($i=0;$i<$cols_normal;$i++) {
			$produit_id = mysql_result($req_normal,$i,0);
			$quantite = mysql_result($req_normal,$i,3);
			$produit_designation = mysql_result($req_normal,$i,1);
			$produit_num = mysql_result($req_normal,$i,2);
			
		
	 ?> 
	  <tr>
		<td align="center"><?php echo $produit_id.'&nbsp;'.$produit_num?></td>
		<td align="center"><?php echo $produit_designation?></td>
		<td align="center"><?php echo $quantite?></td>
	  </tr>
	  <?php
		  	}
		}		
	  ?>
	</table>
je sais pas comment gerer les fait que je check les commandes et apres les boulces pour les regrouper....

ou alors un system plus simple avec les requete sql mais ou je vois que les commandes cochees.... ](*,)
merci d'avance

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

06 oct. 2005, 11:12

Si j'ai bien compris les id's commandes choisis sont stockés dans le tableau $_POST["100"].

Et tu veux afficher seulement les produits concernés par les commandes choisies : Dans ce cas il y a un p'ti problème dans ton code.
Effectivement t'as d'abord une erreur de syntaxe au niveau des jointures (JOIN) dans la clause FROM :
FROM (commande JOIN contient ON contient.commande_id = ('".$tab."')) ...
car tu n'a pas le droit d'incruster la variable $tab à cet endroit. (d'autant plus que $tab est un tableau)

Je comprends ce que tu veux faire : tu veux fixer une condition pour la requête, dans ce cas il faut utiliser la clause WHERE.

seulement le critère de WHERE doit être :
contient.id_commande = au moins à un id choisi dans la liste $_POST['100'].

Ceci peut être écrit, par exemple si $_POST['100'] contient les id's X, Y et Z, comme suit :

Code : Tout sélectionner

contient.commande_id = 'X' OR contient.commande_id = 'Y' OR contient.commande_id = 'Z'
Ce qui peut être simplifié en SQL par :

Code : Tout sélectionner

contient.commande_id IN ('X', 'Y', 'Z')
Sachant que sous PHP on peut transformer facilement un tableau sous forme de chaine au format "valeur1","valeur2",..,"valeurN". telque valeur1 à N sont celles contenues dans le tableau

La fonction qui fait ça est : implode() qui utilise un séparateur au choix (ici c'est la virgule) pour coller les pièces d'un tableau.

En utilisant cette fonction voici donc ton programme modifié à partir de la boucle foreach($_POST['100'] as $normal)... que je vais d'ailleurs virer parcequ'elle ne sert plus à grand chose en utilisant implode.
...
//Ex. foreach ($_POST['100'] as $normal) { 
//Construire une chaine-liste à partir du tableau (avec séparateur virgule)
$liste_ids = implode(',', $_POST['100']); 

//Ecrire la requête SQL 
$sql_normal = "SELECT produit.produit_id, produit_designation, produit_num, sum(quantite) as quantité_sortie 

FROM  contient JOIN produit ON contient.produit_id=produit.produit_id 
                   
WHERE contient.commande_id IN ($liste_ids) 

GROUP BY produit.produit_id, produit_designation, produit_num";

//Exécuter la requête et afficher le résultat
..... //comme tu là déjà
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 181 Messages

06 oct. 2005, 11:23

voila c'est bon ca marche nickel....

je voyais pas comment mettre dans mon IN le tableau..... now je sais grace a toi...

merci bcp pour ton aide!!!!

ca faisait 1jour et demi que je me prennais la tete comem pas possible... aie aie aie

encore merci!!!