Affichage de 2 tables imbriquées!

Basvic (deb)
Invité n'ayant pas de compte PHPfrance

26 août 2005, 11:18

Salut,
Je débute en php/MySQL et je ne parviens pas à faire un truc qui me parait pourtant tout bête :oops: . Voilà le problème : pour la ptite société où je bosse, j'ai décidé de mettre en place une petite application intranet afin de d'organiser les ateliers de production (parce que c'est le bordel :) ). Le but étant que chaque atelier puisse voir les commandes qui leur sont destinées. Exemple : l'atelier USINAGE doit voir les commandes qui demande un travail d'usinage mais ne pas voir celles qui ne demandent qu'un travail d'impression.
Donc j'ai une base de données composée entre autre de ces tables :
COMMANDE (ID, delais, Ref_com, Ref_prod, clientID, qte)
ETAPES (ID, commandeID, tache, atelier, ordre)
Donc la table COMMANDE contient les diverses commandes de notre société et la table ETAPES contient les différentes étapes de fabrications d'une commande donnée grâce à commandeID.
Pour que cela soit efficace pour tout le personnel, il faut afficher dans un seul tableau toutes les commandes d'un atelier x ainsi que les étapes de chaque commande!!!
Et voilà mon gros problème :shock:
COMMENT puis-je afficher dans une même ligne d'un tableau à la fois les différentes colonnes de table commande et toutes les étapes de cette même commande ? Car visiblement déjà, il n'est pas possible d'imbriquer une boucle php d'affichage de résultat dans une autre et aussi comment afficher une les étapes en colonne et non en ligne ???
Voilà, j'espère avoir été clair. N'hésitez pas à me poser des questions sinon. Merci

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 août 2005, 11:21

as-tu déjà la requête qui te permet de récupérer les résultats ?

Eléphanteau du PHP | 19 Messages

26 août 2005, 11:35

as-tu déjà la requête qui te permet de récupérer les résultats ?
Oui et non :oops: car je n'arrive pas à trier comme je voudrais mais j'ai vu quelques réponses à ce sujet dans le forum. Par contre pour l'affichage j'ai encore rien vu.
Sinon, voici pour le moment ma requête SQL :

SELECT commandes.delais, commandes.Ref_com, commandes.qte, commandes.Ref_prod, etapes.tache
FROM commandes, etapes

Bon pour l'instant c'est pas trier. d'ailleurs si tu as une idée... Je suis en train de lire un truc sur INNER JOIN mais bon...
Merci
Babas

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 août 2005, 11:40

commence déjà par la requête, l'affichage ce sera ensuite

il faudrait donc que tu ais des résultats comme ça, les étapes de chaque commande, triées par atelier et par commande

Donc tu relies ta table commandes à celle des étapes :

Code : Tout sélectionner

SELECT * FROM commande c INNER JOIN etapes e ON c.id = e.id ORDER BY e.atelier, c.commandeID
c'est une exemple il faudra remplacer le * par la liste des colonnes à récupérer

essaye cette requête dans phpMyAdmin, dis moi ce que ça donne, si ça correspond à ce que tu souhaites et si tu as compris le principe

Eléphanteau du PHP | 19 Messages

26 août 2005, 11:54

ok j'ai essayer la requête et elle fonctionne. Je pense avoir compris le principe. En gros, les 2 tables deviennent 1 seule table pour faciliter un tri ultérieur c'est ça ?
Babas

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 août 2005, 12:01

En gros, les 2 tables deviennent 1 seule table pour faciliter un tri ultérieur c'est ça ?
heu non là c'est un SELECT, juste la récupération des résultats

ce que tu obtiens c'est un jeu de résultats, rien n'est conservé dans la base

mais c'est ce jeu de résultats que tu va traiter en PHP

une base de données ça stocke des infos c'est tout, rien n'est trié.
Dans le sens : si tu as une table "membre", ils sont enregistrés n'importe comment
Par contre c'est dans la sélection que tu peux dire que tu veux les récupérer par ordre alphabétique

Eléphanteau du PHP | 19 Messages

26 août 2005, 12:04

ok, je m'étais mal exprimer, merci pour la précision
Babas

Eléphanteau du PHP | 19 Messages

26 août 2005, 13:02

ok je pense avoir compris le principela requête s'en trouve grandement simplifié mais comment ensuite afficher ce que je veux faire ???
Car là pour le moment le résultat me donne une tache par commande malgré qu'il en existe plusieurs par commande!
Merci encore
oh la la... quelle galère :cry:
Babas

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 août 2005, 13:44

ma requête est mauvaise, la clé étrangère d'Etapes qui relie cette table à Commandes est commandeID

donc

Code : Tout sélectionner

SELECT * FROM commande c INNER JOIN etapes e ON c.id = e.commandeID ORDER BY e.atelier, c.commandeID

Eléphanteau du PHP | 19 Messages

26 août 2005, 14:28

Merci encore pour ta réponse super rapide :D
Mais pourrais tu s'il te plait expliquer le schéma général de ce qu'il faut faire normalement car j'ai l'impression que je ne m'y prend pas par le bon bout pour faire ce projet. Voilà le mien (si ma base de donnée est bien pensée et contient quelques enregistrement dans chaque table) :
1 - je fais une requête comme celle que tu viens de me donner :
SELECT * FROM commande c
INNER JOIN etapes e ON c.id = e.commandeID
ORDER BY e.atelier, c.commandeID

2 - dans ma page.php je créer un tableau html <table> pour y insérer ces données
3 - j'insère ces données via le language php dans chaque colonne :
<?php require_once('Connections/bdplan.php'); ?>
<?php
mysql_select_db($database_bdplan, $bdplan);
$query_Recordset1 = "SELECT ID, fabricationID, ref_com, delais FROM commandes ORDER BY delais ASC";
$Recordset1 = mysql_query($query_Recordset1, $bdplan) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);

mysql_select_db($database_bdplan, $bdplan);
$query_req = "SELECT * FROM commande2 c INNER JOIN etapes e ON c.id = e.commande2ID ";
$req = mysql_query($query_req, $bdplan) or die(mysql_error());
$row_req = mysql_fetch_assoc($req);
$totalRows_req = mysql_num_rows($req);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>essai</title>
</head>
<?php
?>
<body>
<table width="100%"  border="1" cellspacing="0" cellpadding="0">
  <tr class="Style2">
    <td>Delais</td>
    <td>Commande</td>
    <td>Client</td>
    <td>Produit</td>
    <td>QTE</td>
    <td>Etape 1</td>
    <td>Etape 2</td>
    <td>Etape 3</td>
    <td>Etape 4</td>
    <td>Etape 5</td>
    <td>Etape 6</td>
    <td>Etape 7</td>
    <td>Etape 8</td>
    <td>Etape 9</td>
    <td>Etape 10</td>
  </tr>
  <?php do { ?>
  <tr class="Style2">
    <td><?php echo $row_req['delais']; ?></td>
    <td><?php echo $row_req['ref_com']; ?></td>
    <td><?php echo $row_req['ref_client']; ?></td>
    <td><?php echo $row_req['ref_prod']; ?></td>
    <td><?php echo $row_req['qte']; ?></td>
    <td><?php echo $row_req['atelier']; ?><br />
        <?php echo $row_req['tache']; ?></td>
    <td>?</td>
    <td>?</td>
    <td>?</td>
    <td>?</td>
    <td>?</td>
    <td>?</td>
    <td>?</td>
    <td>?</td>
    <td>?</td>
  </tr>
  <?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
</table>
</body>
</html>
<?php
mysql_free_result($Recordset1);

mysql_free_result($req);
?>
Mais comme on peut le constater je ne sais pas énumérer toutes les étapes de chaque commande! J'ai essayer en faisant une nouvelle boucle sur
<td><?php echo $row_req['atelier']; ?><br />
<?php echo $row_req['tache']; ?></td>
mais il me met un message d'erreur car il ne veut pas faire une boucle dans une boucle et en plus mes étapes auraient été affichés à la suite mais que dans cette colonne ce qui n'est pas recherché!!! :D
Bon, voilà le topo. Je suppose que je m'y prend mal pour afficher les donner. PS : je sais que je n'est pas filtrer les commandes pour le moment.
Merci encore pour ta lumière :D
Babas

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 août 2005, 14:36

Avec la requête que je t'ai donné normalement tu as donc des lignes comme ça : (en gros)

atelier1 etape1
atelier1 etape2
atelier1 etape3
atelier2 etape1
atelier2 etape2
atelier3 etape1
atelier3 etape2
atelier3 etape3

donc maintenant il te suffit de boucler sur ces résultats
sauf que tu ne veux afficher qu'une fois l'atelier, pas la peine de le répéter, et ensuite afficher pour chaque atelier les étapes

il suffira de dire : n'afficher l'atelier que si celui de la ligne est différent de celui que je traitais avant

essaye déjà d'aficher tous les résultats, et on fera cette étape ensuite

Eléphanteau du PHP | 19 Messages

26 août 2005, 15:22

Ba j'ai pas l'impression d'avoir ça... Mes résultat de la requête sont plutôt du genre :
commande1 - etape1
commande1 - etape2
commande1 - etape3
commande2 - etape1
commande2 - etape2
commande3 - etape1
commande3 - etape2
commande3 - etape3
commande3 - etape4
commande3 - etape5

Mais je crois que j'ai du mal m'exprimer (encore :lol: )
Voici a quoi doit ressembler le tableau final :

Code : Tout sélectionner

--------------------------------------------------------------- - delais - refcom - refclient - etape1 - etape2 - etape3 - --------------------------------------------------------------- - 2005 - COM1 - TOTO - atelier1 - atelier2- NULL - - - - - tache1 - tache2 - NULL - - - - - statut1 - statut2 - NULL - --------------------------------------------------------------- - 2006 - COM2 - GEGE - atelier1 - atelier2-atelier3- - - - - tache1 - tache2 - tache3 - - - - - statut1 - statut2 -statut3 - ---------------------------------------------------------------
Donc on a pour chaque étape de chaque commande, 1 atelier + 1 tache + 1 statut (+ autre chose si on veut)
J'ai peut-être mal structuré ma base sinon :roll:
Babas