recherche pour faire un total de chaque produit

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : recherche pour faire un total de chaque produit

par ruly » 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!!!

par sadeq » 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à

par ruly » 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

par ruly » 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

par zeus » 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:

par sadeq » 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

par pjl » 05 oct. 2005, 12:28

Code : Tout sélectionner

SELECT PR.produit_designation, SUM(CO.quantite) AS qte_cde FROM produit PR INNER JOIN contient CO ON PR.produit_id = CO.produit_id INNER JOIN commande CDE ON CO.commande_id = CDE.commande_id [OPTION]WHERE la condition dont tu as besoin[/OPTION] GROUP BY PR.produit_designation
il te reste juste à mettre des conditions si tu en as besoin.

Edit : suite à la remarque de Sadeq, il manque le GROUP BY

par ruly » 05 oct. 2005, 12:11

je comprend pas du tout ta requete..... :oops:

ya plein d'erreur et pour changer les erreurs faudrais que je ocmprenne le fonctionnement de cette requette....

par zeus » 05 oct. 2005, 11:52

Code : Tout sélectionner

select commande_id, avion_id, commande_date, produit_id, SUM(produit_quantite) 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."' order by produit_id desc

par ruly » 05 oct. 2005, 11:37

pour pjl
-commande:
commande_id --> interger

-contient:
commande_id --> integer
produit_id --> integer
quantite --> integer

-produit:
produit_id --> interger
produit_designation --> varchar
produit_num --> interger

pour zeus:
la table contient:

Code : Tout sélectionner

commande_id | produit_id | quantite | prix 1 11 3 2.5 2 2 3 1.5 2 11 3 2.5 1 9 5 11.5 2 1 2 3.5 3 11 5 2.5 3 4 5 3.5 4 12 6 4

par pjl » 05 oct. 2005, 11:29

est ce qu'il faut autre chose???
Oui, le type des champs.

par zeus » 05 oct. 2005, 11:28

Code : Tout sélectionner

select commande_id, avion_id, commande_date, produit_id, COUNT(produit_id) 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."' order by produit_id desc
Et tu auras l'id de chaque produits et le nombre de ces produits

par ruly » 05 oct. 2005, 11:18

en fait j'ai un page avant avec tout le listing des produits dont l'utilisateur aura rentrer un date de debut de recherhce et une date de fin de recherche,

Code : Tout sélectionner

select commande_id, avion_id, commande_date from commande where commande_date >= '".$date_debut."' and commande_date <= '".$date_fin."' order by 3 desc

par zeus » 05 oct. 2005, 11:12

ton tri sur les commandes, c'est quoi les critères ? les produits des commandes du jour, ... ?

par ruly » 05 oct. 2005, 11:03

a ouais c'est vrai j'avais pas pense. mais ca fait une sorte de travail a double :(

en fait j'ai 3 tables:
-commande:
commande_id et d'autre champs qui ne servent pas a cette requette comme la date, qui a passe la commande.

-contient:
commande_id, produit_id, quantite

-produit:
produit_id, produit_designation, produit_num

est ce qu'il faut autre chose???