Page 1 sur 2

Question sur une requête

Posté : 25 févr. 2010, 14:55
par Imer2008
Bonjour à tous,

Mon problème est sûrement bête comme chou, mais j'avoue je sèche sur une requête...

J'ai 3 tables

T_commande (table de commande de fournitures), avec comme champs (entre autres je ne les mets pas tous)
- id_produit (INT correspondant à l'ID du produit de la table T_produit)
- qte_produit (nombre de produit commandé)
- date_commande (au format AAAA-MM-DD HH:MM:SS)
- agent (correspondant à l'ID de l'agent de la table T_agent)

T_produit (table qui liste les fournitures)
- id (ID de la fourniture)
- description (nom de la fourniture)

T_agent (liste des agents)
- idagent (ID de l'agent)
- nomagent
- prenomagent
- service
- pole

Le principe est le suivant :
Dupont du service compta fait 3 commandes le même jour :
- 1 ramette de papier A4
- 2 stylos bleus
- 5 gommes

J'aimerais ressortir un truc du genre (déjà la base, après si je peux améliorer, je le ferais) :

Service : compta
Agent : Dupont
Description : ramette papier
Quantité : 1

Service : compta
Agent : Dupont
Description : stylos bleus
Quantité : 2

Service : compta
Agent : Dupont
Description : gommes
Quantité : 5


Or quand je lance ma requete, il me cumule tout et ca me donne

Service : compta
Agent : Dupont
Description : ramette papier
Quantité : 1

Service : compta
Agent : Dupont
Description : ramette papier
Quantité : 2

Service : compta
Agent : Dupont
Description : ramette papier
Quantité : 5

Service : compta
Agent : Dupont
Description : stylos bleus
Quantité : 1

Service : compta
Agent : Dupont
Description : stylos bleus
Quantité : 2

Service : compta
Agent : Dupont
Description : stylos bleus
Quantité : 5

Service : compta
Agent : Dupont
Description : gomme
Quantité : 1

Service : compta
Agent : Dupont
Description : gomme
Quantité : 2

Service : compta
Agent : Dupont
Description : gomme
Quantité : 5


D'où vient mon erreur et comment y remédier ? Je suis sûr que c'est tout con, mais là je rame...

Voilà mon code:
$sql = "SELECT DISTINCT description,num_commande,qte_produit,date_commande,agent,nomagent,prenomagent,service,idagent FROM fourniture_commande,agent,fourniture_produits WHERE fourniture_commande.agent=agent.idagent AND fourniture_commande.num_commande LIKE 'RSI052010%'  ORDER BY date_commande"; 
 // on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
 // on fait une boucle qui va faire un tour pour chaque enregistrement 
 while($data = mysql_fetch_assoc($req)) 
    { 
   // on affiche les informations de l'enregistrement en cours 
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Service :</b></font>'.$data['service'].'<br>';
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Agent :</b></font>'.$data['nomagent'].' '.$data['prenomagent'].'<br>'; 
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Description :</b></font>'.$data['description'].'<br>'; 
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Nombre commandé :</b></font>'.$data['qte_produit'].'<br>';
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Date de la commande :</b></font>'.$data['date_commande'].'<br><br>';
  } 
// on ferme la connexion à mysql 
mysql_close(); 
?> 

Re: Question sur une requête

Posté : 25 févr. 2010, 15:16
par stealth35
GROUP BY Description ?

sinon je te conseil aussi de pas mettre (or die) mais (|| exit)
et mysql_close ne sert a rien dans ton cas donc tu peu le supprimer :wink:

Re: Question sur une requête

Posté : 25 févr. 2010, 15:19
par ouckileou
Conseil numéro 1 : tester le SQL seul, tester via PHP ne fait qu'ajouter de la difficulté.

Dans ta requête :
SELECT DISTINCT description,num_commande,qte_produit,date_commande,agent,nomagent,prenomagent,service,idagent FROM fourniture_commande,agent,fourniture_produits WHERE fourniture_commande.agent=agent.idagent AND fourniture_commande.num_commande LIKE 'RSI052010%'  ORDER BY date_commande"
À quoi sert le DISTINCT ?
Pourquoi est-ce que les noms de tables ne correspondent pas à ceux donnés au début du message ?
À quoi correspond fourniture_produits ? il n'y a aucune jointure dessus, cela fait donc un produit cartésien, c'est peut-être pour ça que tu as un peu plus de résultat que prévu...

C'est un problème de requête a priori donc je déplace

Re: Question sur une requête

Posté : 25 févr. 2010, 15:24
par ouckileou
GROUP BY Description ?
Tu as dit ça au pif hein ? avoue :)

Re: Question sur une requête

Posté : 25 févr. 2010, 15:30
par Imer2008
Bonjour,

Et merci de vos réponses.

Je pense avoir trouvé la première étape de ma solution.
<?php 
 // on créé la requête SQL 
$sql = "SELECT description,id_produit,id,num_commande,qte_produit,date_commande,agent,nomagent,prenomagent,service,idagent FROM fourniture_commande,agent,fourniture_produits WHERE fourniture_commande.num_commande LIKE'RSI052010%' AND fourniture_produits.id=fourniture_commande.id_produit AND fourniture_commande.agent=agent.idagent ORDER BY date_commande"; 
 // on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
 // on fait une boucle qui va faire un tour pour chaque enregistrement 
 while($data = mysql_fetch_assoc($req)) 
  { 
  // on affiche les informations de l'enregistrement en cours 
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Service :</b></font>'.$data['service'].'<br>';
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Agent :</b></font>'.$data['nomagent'].' '.$data['prenomagent'].'<br>'; 
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Description :</b></font>'.$data['description'].'<br>'; 
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Nombre commandé :</b></font>'.$data['qte_produit'].'<br>';
  echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Date de la commande :</b></font>'.$data['date_commande'].'<br><br>';
   } 
 ?> 
A priori, la ca fonctionne ca me liste bien mes commandes de fournitures. A Stealth35, j'ai testé ton || exit mais ca me met un message d'erreur, du coup je suis revenu au "or die"

Maintenant, le petit truc en plus (si c'est toujours possible) :
A l'heure actuelle, ca me liste tout sans que je lui demande quoi que ce soit. J'aimerais à présent afficher en fonction du service. Avoir une liste déroulante, et quand je valide, ca me sort les commandes du service choisi.

Re: Question sur une requête

Posté : 25 févr. 2010, 15:35
par ouckileou
Maintenant, le petit truc en plus (si c'est toujours possible) :
A l'heure actuelle, ca me liste tout sans que je lui demande quoi que ce soit. J'aimerais à présent afficher en fonction du service. Avoir une liste déroulante, et quand je valide, ca me sort les commandes du service choisi.
Oui c'est possible.

Re: Question sur une requête

Posté : 25 févr. 2010, 15:37
par stealth35
GROUP BY Description ?
Tu as dit ça au pif hein ? avoue :)
plus ou moins :mrgreen:

Re: Question sur une requête

Posté : 25 févr. 2010, 15:42
par Imer2008
Oui c'est possible.
Ok merci, en gros, "démerde toi".

Re: Question sur une requête

Posté : 25 févr. 2010, 15:46
par Calimero
Oui c'est possible.
Ok merci, en gros, "démerde toi".
Ca s'appelle le travail :D

PS: et puis bon hein :
après si je peux améliorer, je le ferais

Re: Question sur une requête

Posté : 25 févr. 2010, 15:47
par stealth35
Oui c'est possible.
Ok merci, en gros, "démerde toi".
dans le sens ou c'est une demande qui reviens plus ou moins chaque semaine, une petite recherche sur le forum te donnera ta réponse.

Re: Question sur une requête

Posté : 25 févr. 2010, 15:49
par ouckileou
Oui c'est possible.
Ok merci, en gros, "démerde toi".
Non pas démerde toi mais c'est un forum d'aide, pas de code prêt à emporter. Donc tu dis ce que tu veux faire je te dis que c'est possible, comme c'est à peu près le même principe que ce que tu as déjà fait, je pense que tu peux déjà faire des essais et nous demander de l'aide sur ce qui ne marche pas.

Au pire si tu ne sais pas du tout comment démarrer tu peux le formuler clairement et là nous te donnerons des pistes. Mais dis comme ça, sans même une question, ça fait un peu "je veux ça, à vos claviers, j'attends".

Re: Question sur une requête

Posté : 25 févr. 2010, 15:52
par Yosh
T'a juste à rajouter un
AND service = 'id_du_service'
dans ta requête.

Ensuite tu t'arrange pour créer dynamiquement ta liste de service et en fonction de la sélection tu exécute ta requête avec cette condition.

Re: Question sur une requête

Posté : 25 févr. 2010, 16:42
par Imer2008
Même si je ne suis absolument pas un spécialiste du php, je ne cherche pas à avoir un truc tout fait, c'est pas mon genre. Mais de l'aide ou des conseils, oui.

Bref, voilà où j'en suis. J'avance petit à petit... Ma liste déroulante s'affiche (ca j'en suis fier), mais le hic c'est que maintenant quand je clique sur OK, bah j'ai rien qui se passe...
Où est encore mon erreur ?

Merci à ceux qui m'aiguilleront.
<form method="post">
<select name="service-test" id="service-test" style="font-size:10px">
<option value=""<?php if (empty($service)) { echo " selected"; } ?>>Service &agrave; s&eacute;lectionner</option>
<?php
$sqlservice = "SELECT DISTINCT service FROM agent ORDER BY service";
$resultatservice = mysql_query ($sqlservice, $connexion);
while ($tabservice = mysql_fetch_array($resultatservice, MYSQL_ASSOC)) {
 ?>
 <option value="<?php echo $tabservice['service']; ?>"<?php if ($service == $tabservice['service']) { echo " selected"; } ?>><?php echo strtolower($tabservice['service']); ?></option>
 <?php
 </select>
<input type="submit" value="OK">
</form>
<?php 
if(isset($_POST['service'])) 
{
 // on créé la requête SQL 
 $sql = "SELECT description,id_produit,statut,id,num_commande,qte_produit,date_commande,agent,nomagent,prenomagent,service,idagent FROM fourniture_commande,agent,fourniture_produits WHERE fourniture_commande.num_commande LIKE'RSI052010%' AND fourniture_produits.id=fourniture_commande.id_produit AND fourniture_commande.agent=agent.idagent AND statut='livrée' AND qte_produit>'0' AND service=".$_POST['service']; 
 // on envoie la requête 
 $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
 // on fait une boucle qui va faire un tour pour chaque enregistrement 
 while($data = mysql_fetch_assoc($req)) 
    { 
  // on affiche les informations de l'enregistrement en cours 
echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Service :</b></font>'.$data['service'].'<br>';
echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Agent :</b></font>'.$data['nomagent'].' '.$data['prenomagent'].'<br>'; 
echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Description :</b></font>'.$data['description'].'<br>'; 
echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Nombre commandé :</b></font>'.$data['qte_produit'].'<br>';
echo '<font face="Freestyle Script" color="#0099CC" size="+2"><b>Date de la commande :</b></font>'.$data['date_commande'].'<br><br>';
}
}
?>

Re: Question sur une requête

Posté : 25 févr. 2010, 16:44
par ouckileou
Ton formulaire ne renvoie vers aucune page : http://www.commentcamarche.net/contents ... lform.php3

Re: Question sur une requête

Posté : 25 févr. 2010, 16:49
par Imer2008
Mais si je souhaite reste sur la page actuelle ? Ca doit bien pouvoir se faire ?