Génération de rapports de maintenance imprimable

Génération de rapports de maintenance imprimable - PHP - Programmation

Marsh Posté le 15-06-2007 à 14:30:18    

Bonjour à tous.
 
Je doit créer une page PHP qui récupère une donnée d'un champs d'une base de donnée.
Cette donnée (rapports_de_maintenance) peut ressembler a ceci :

Code :
  1. maintenance évolutive du 14/06/07
  2. Processeur :
  3. Pentium 3 remplacé par Pentium 4.
  4. --------------------------------------
  5. maintenance évolutive du 25/08/07
  6. Processeur :
  7. Pentium 4 remplacé par AMD 3000+.
  8. --------------------------------------
  9. maintenance évolutive du 25/08/07
  10. Carte Mère :
  11. Assus remplacé par Abit.
  12. --------------------------------------
  13. maintenance évolutive du 17/09/07
  14. Carte Graphique :
  15. GForce 6800 GT remplacée par Radeon X300.
  16. --------------------------------------
  17. maintenance évolutive du 02/11/07
  18. RAM :
  19. 1024 Mo remplacé par 2048 Mo.
  20. --------------------------------------


Pour pouvoir imprimer ses données, je doit les ranger dans un tableau.
L'utilisateur peut choisir la date du début du rapport, et la date de fin.
Par exemple, si j'entre:
http://i15.photobucket.com/albums/a391/WarTatane/champs_date_rapport.jpg
 
Je devrais avoir :
http://i15.photobucket.com/albums/a391/WarTatane/tableau_impression.jpg
J'ai déjà fais une partie de l'analyse:

Code :
  1. if(isset($jour_deb) && isset($mois_deb) && isset($annee_deb) && isset($jour_fin) && isset($mois_fin) && isset($annee_fin))
  2. {
  3. $date_deb = $jour_deb.'/'.$mois_deb.'/'.$annee_deb;  // cré une chaîne de caractère sous la forme : jj/mm/aa
  4. $date_fin = $jour_fin.'/'.$mois_fin.'/'.$annee_fin;
  5. $verification = ComparerDates($date_deb, $date_fin);  // fonction qui compare les 2 dates
  6. if( $verification == 1)                  // SI date_deb est antérieure à date_fin, ALORS :
  7. {
  8.  $fin = 0;
  9.  $balise_de_fin = "--------------------------------------";
  10.  for($indice_annee = $annee_deb ; $indice_annee < 27 ; $indice_annee++)
  11.  {
  12.   for($indice_mois = $mois_deb ; $indice_mois < 12 ; $indice_mois++)
  13.   {
  14.    for($indice_jour = $jour_deb;$indice_jour < 31 ; $indice_jour++)
  15.    {
  16.     $date_formate = $indice_jour.'/'.$indice_mois.'/'.$indice_annee;
  17.     $verification = ComparerDates($date_indice, $date_fin);   // fonction qui compare les 2 dates
  18.     if( $verification == 1)   // SI date_indice est antérieure à date_fin, ALORS :  
  19.     {
  20.      // fonction qui cherche  "date_formate" dans la chaîne de caractère  "_SESSION['rapports_de_maintenance']"  
  21.      // et retourne sa première occurence (si la fonction ne trouve aucune occurence, elle renvoie -1)          
  22.      $dep = ChercherOccurence($date_formate,  $_SESSION['rapports_de_maintenance'], $fin);
  23.      if($dep != -1)
  24.      {
  25.       $fin = ChercherOccurence($balise_de_fin, $_SESSION['rapports_de_maintenance'], $dep);
  26.       $infos_maintenance = ExtrairePortion( $_SESSION['rapports_de_maintenance'], $dep, $fin); //fonction qui extrait une portion de chaîne de caractère
  27.       // maintenant vient la mise sous forme de tableau :-/
  28.      }
  29.     }
  30.    }
  31.   }
  32.  }
  33. }
  34. else  // SINON on affiche un message d'erreur
  35. {
  36.  echo "Erreur: Le choix du choix du debut de la période doit être antérieur au choix de la fin de la période.";
  37. }
  38. }


 
Je n'ai pas encore codé "ComparerDates" ni "ExtrairePortion" et si vous avez des tuyaux sur des fonctions toutes faites, je suis preneur, cela me ferais gagner un temps précieux. Si vous avez des questions ou des critiques sur ma logique, n'hésitez pas.
 
Voici donc ma question (désolé pour cette longue introduction, mais je me devais d'être clair):
 
J'aurais besoin de votre aide pour finir le bout de code concernant la mise en place du tableau, je ne vois vraiment pas comment faire.
 
 :jap:  Merci de m'avoir lu jusqu'ici, et en espérant que vos réponses seront à la portée de ma compréhension.
 
A bientot.

Reply

Marsh Posté le 15-06-2007 à 14:30:18   

Reply

Marsh Posté le 18-06-2007 à 09:12:12    

Personne n'a d'idées  :(  ?
Ou peut-être n'ai pas été assez clair dans l'explication de mon problème?

Reply

Marsh Posté le 18-06-2007 à 11:26:44    

question bête : t'as parlé de récupérer un champ d'une BD. Alors où est ta requête SQL du genre :
"SELECT MonChamp FROM MaTable WHERE DateMaintenance BETWEEN $DateDebut AND $DateFin ORDER BY DateMaintenance "
 
où $DateDebut et $DateFin sont 2 variables PHP qui contiennent, au format yyyy-mm-dd, la date de début et de fin provenant de ton formulaire pour borner la recherche :??:
 
Et c'est quoi tout ce code avec des tests dans tous les sens et pleins de boucles???

Reply

Marsh Posté le 18-06-2007 à 14:18:16    

Je n'ai pas créé de champs permettant de récupérer la date de la maintenance.
Selon ma (piètre) analyse, mon champs rapports_de_maintenance se remplit comme cela.
Je prends pour exemple un utilisateur qui clic sur son ordinateur dans la BD et change sa carte graphique Gforce par une Radeon.
En modifiant le champs carte_graphique, un rapport est généré automatiquement.
 
Voici la page de modification de la carte graphique:

Code :
  1. <?php
  2. session_start();
  3. if (isset($_POST['new_']))
  4. {$new_ = $_POST['new_'];}
  5. else{$new_ = "";}
  6. ?>
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  8. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  9.     <head>
  10.         <title>Determiner une nouvelle carte graphique :</title>
  11.         <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  12.     </head>
  13.     <body>
  14.  <form action="carte_graphique.php" method="post">
  15.   Quel est la nouvelle carte graphique : <input type="text" name="new_">
  16.  </form>
  17.  <?php
  18.  mysql_connect("localhost", "root", "" );
  19.  mysql_select_db("gestionparc" );
  20.  if (isset($_POST['new_']) && isset($_SESSION['nom']))
  21.  {
  22.   if($new_ != "" )
  23.   {
  24.    $reponse = mysql_query('SELECT * FROM generalitees WHERE nom="'.$_SESSION['nom'].'"')or die(mysql_error());
  25.    $donnees = mysql_fetch_array($reponse);
  26.    $jour = date('d');
  27.    $mois = date('m');
  28.    $annee = date('y');
  29.    $new_rapport = $donnees['rapports_de_maintenance'].'maintenance évolutive du '.$jour.'/'.$mois.'/'.$annee.'<br />Carte Graphique :<br />'.$donnees['carte_graphique'].' remplacée par '.$new_.'.<br />--------------------------------------<br />';
  30.   }
  31.   mysql_query('UPDATE generalitees SET rapports_de_maintenance="'.$new_rapport.'" WHERE nom="'.$_SESSION['nom'].'"')or die(mysql_error());
  32.   mysql_query('UPDATE generalitees SET carte_graphique="'.$_POST['new_'].'" WHERE nom="'.$_SESSION['nom'].'"')or die(mysql_error());
  33.   echo '<br /><br /><br />La nouvelle carte graphique de '.$_SESSION['nom'].' est '.$_POST['new_'];
  34.   mysql_close();
  35.  }
  36.  else
  37.  {
  38.   echo '<br /><br /><br />Modification en cours ...';
  39.  }
  40.  ?>
  41.  </body>
  42. </html>


Je pensais donc agir sur la chaîne de caractère rapports_de_maintenance pour mettre en page l'impression. Si tu vois une solution plus simple, j'en serais évidement ravi :) .
 
L'idée générale du code du premier post, consiste a scanner rapports_de_maintenance jour après jour, de date_deb à date_fin afin d'extraire tous les segments de chaînes de caractères trouvés dans l'intervalle. Cela dis, je trouve cette solution bancale, mais je n'en vois pas de meilleure pour le moment.
 
A propos de la requête que tu as mis en exemple, je la comprends comme ceci:
L'utilisateur fournit un intervalle, et la requête retourne toutes les entrées dont le champs DateMaintenance correspond à l'intervalle.
 
Or, ici, c'est a partir d'une seule entrée qu'on extraie les informations :-/
Ma logique n'est sûrement pas la bonne, si vous ne la comprenez pas, n'hésitez pas a demander.
 :jap:

Reply

Marsh Posté le 18-06-2007 à 14:50:02    

tu peux me montrer le MCD (ou le MLD) de ta BD?

Reply

Marsh Posté le 18-06-2007 à 15:04:52    

rufo > Vu comment est stocké le rapport, ils ne doivent pas avoir de mcd ou de mld de leur base. S'ils étaient passé par la création d'un mcd, ils auraient surement pensé à faire une colonne pour y stocker la date de l'intervention plustôt que de noter textuellement "maintenance évolutive du 14/06/07".

Reply

Marsh Posté le 18-06-2007 à 15:23:37    

En fait, je ne connaissais pas l'existence de MCD avant ces deux derniers posts.
Après avoir lue 2-3 définitions différentes un peu pompeuses, je me pose la question suivante:
A votre avis, dois-je utiliser ce fameux MCD pour simplifier mon problème?
Et dans ce cas, si vous pouviez me mettre sur la voie parce que là...   :??:  
Ou alors,dois-je continuer sur ma lancée, et coder cette infâme bout de code PHP?

Citation :


ils auraient sûrement pensé à faire une colonne pour y stocker la date de l'intervention


Donc un nouveau champs dans ma BD? Mais je me retrouverais avec une quantité de dates (dans un champs à part ) que je ne saurais pas plus gérer que rapports_de_maintenance.
Je n'est pas trop compris là  :sweat: .
 
En espérant des éclaircissements, cordialement.
 :jap:

Reply

Marsh Posté le 18-06-2007 à 15:50:29    

Un MCD, c'est, en gros, un schéma qui indique les tables de ta base avec l'ensemble des colones et les relations qu'il y a entre les différentes tables.
Un MCD est fortement conseillé avant de créer ou de modifier une base mais ce n'est pas ça qui remplace l'étude des besoins et l'étude des données qu'on a à stocker. Ca permet juste d'avoir toutes les infos au propre et les idées un peu plus claire avant de taper dans la base. Quand les bases deviennent complexes, les MCD deviennent obliguatoire vu que personne ne peut se rappeller de la structure et de l'organisation de plusieurs centaines de tables.
 
Dans ton cas, les seules choses que tu peux faire, c'est :
1) suggérer que le programme de remplissage de la base soit modifier pour qu'il remplisse une colonne de date avec la date de l'intervention. Je ne conais pas ta boite et je ne sais pas si c'est un programme interne ou fait par une autre société. Dans tous les cas, ca peut aller d'un refus de la modification (pour x raisons) à une demande de ton patron pour que tu t'occupes de cette modif (peut probable si t'as pas déjà bossé sur programme sauf si t'es le seul développeur disponible et/ou que le programme en question est super simple)
2) demander à celui qui s'occupe de la base et du programme de saisie s'il est possible de rajouter une colonne à la base (attention, toujours tester ensuite le plus possible les programmes qui utilisent cette table pour voir s'ils ne plantent pas à cause de cette modif)
3) créer une nouvelle table (a éviter si possible, mais on a pas toujours le choix à cause de programmes pas trés bien conçu) dans laquelle tu stockeras cette donnée avec l'identifiant du rapport correspondant
 
Dans tous les cas il est fortement probable que tu sois quand même obligé de faire la fonction qui récupérera la date de l'intervention ne seraisse que pour remplir la colonne de date pour les interventions déjà saisies.
 
En fait, dans ton cas, ca n'est pas que tu ne serais pas capable de créer un mcd (j'en ai aucune idée) mais que tu n'en as pas forcément le cas.

Reply

Marsh Posté le 18-06-2007 à 16:19:40    

Merci, c'est déjà plus clair.
Pour commencer, j'analyse et code seul ce programme, et donc je peux intervenir sur la base de données ou sur les pages PHP sans soucis.
Mon système doit gérer un parc informatique de 130 PCs. Ma BD est organisée comme çà:
 
 BD: gestionparc
      TABLE: generalitees
            CHAMPS:Nom
            CHAMPS:Num_serie
            CHAMPS:ip
            CHAMPS:carte_graphique
            CHAMPS:rappors_de_maintenance
            CHAMPS: ...
            CHAMPS: ...
            CHAMPS: ...
            CHAMPS: ...
            27 champs au total.
 
Au début je pensais organiser ma BD ainsi:
 BD: gestionparc
      TABLE: generalitees
            CHAMPS: Nom
            CHAMPS: Num_serie
            CHAMPS: ...
            CHAMPS: ...
            CHAMPS: ...
      TABLE: materiel
            CHAMPS: carte_graphique
            CHAMPS: carte_mere
            CHAMPS: ...
            CHAMPS: ...
            CHAMPS: ...
      TABLE: configuration_reseau
            CHAMPS: ip
            CHAMPS: masque_sous_reseau
            CHAMPS: dns
            CHAMPS: ...
      TABLE: autres_infos
            CHAMPS: rapports_de_maintenance
            CHAMPS: num_inventaire
            CHAMPS: ...
      TABLE: ...
            CHAMPS: ...
            CHAMPS: ...
 
Mais j'ai finalement trouvé plus simple de faire une entrée et 27 champs.
Pour revenir sur ton post, je ne vois pas comment utiliser ni de quel type devrait être ce champs date. Tu peux être lus précis s'il te plais ? (désolé).
Merci d'avance  :jap: .

Reply

Marsh Posté le 18-06-2007 à 16:28:59    

Entre nous, ce que tu comptais faire au début est bien mieux que ce que t'as utilisé à la fin.
Si le nom de l'ordi change (par exemple l'ancien ordi d'un vendeur qui devient l'ordi de la secrétaire) est ce que tu trouves logique de devoir changer la même donnée sur plusieurs disaines de lignes de ta base?
 
Quand au fait que ca soit plus simple, c'est une grosse erreur. Regarde quand tu dois saisir une intervention, tu te retrouves à devoir resaisir le nom de l'ordi, sa config réseau ... Si tu ne saisie pas ça, tu te retrouves à devoir relire tout l'historique correspondant à l'ordi pour conaitre la derniére config réseau conus. C'est vraiment se compliquer la vie tout ça.
 
Quand au remplissage, si tu mets bien des id à toutes tes tables, ca devient trés simple. A la création d'un nouvel ordi, tu commences par créer l'ordi en question (ta table generalitees ) , puis tu notes quel id a reçu cet ordi afin de pouvoir l'indiquer dans les tables anexes (materiel, configuration_reseau, ...) que tu remplis à leur tour.

Reply

Marsh Posté le 18-06-2007 à 16:28:59   

Reply

Marsh Posté le 18-06-2007 à 16:54:06    

Très bien, effectivement cela tombe sous le sens, je vais sûrement refaire ma bd.
Mais, (il y a toujours un "mais"  :) ) à propos du champs date:
Si je te suit bien (pas sur du tout) tu verrais quelque chose dans ce goût?  
 
http://i15.photobucket.com/albums/a391/WarTatane/ex_bd.jpg
 
Si oui, quel type dois-je donner a date_rapports et comment le relier a rapports?
Merci pour tes réponses.
 :jap:

Reply

Marsh Posté le 18-06-2007 à 16:59:59    

Danaan1, je ne sais si tu codes ça pour le "fun" ou si t'es en stage (ou autre), mais y'a un produit GPL qui a l'air de se rapprocher de ce que ton soft à l'air de faire, à savoir de la gestion de parcs : il s'appel glpi http://www.glpi-project.org/
Donc, plutôt que de réinventer la roue et de coder une appli d'une manière assez ignoble, peut-être que tu pourrais évaluer ce produit... Et il fait les rapports d'interventions si je me souviens bien. On l'utilise là où je bosse pour gérer plus de 500 machines. Je crois même qu'il a un module de collecte automatique des confs des machines. ;)

Reply

Marsh Posté le 18-06-2007 à 17:11:55    

Danaan1 > Pour le type de champs pour la date, il faut voir dans la doc de la base de donnée. Les type date, datetime ou timestamp sont fait pour ça.

Reply

Marsh Posté le 18-06-2007 à 17:14:58    

Effectivement, je suis en stage et je vais devoir réinventer la roue pour satisfaire tuteur et professeurs.
Quand à la remarque sur ma manière de coder, je ne me vexe pas facilement et suis toujours avide de conseils (donc si tu en as de plus précis qu"assez ignoble", je suis preneur ;) ).

Reply

Marsh Posté le 18-06-2007 à 17:40:01    

Je dirais :  
1) repenser le modèle de données pour toutes les raisons qu'omega2 t'a données. Si t'es en stage, c'est pour mettre en application ce que tu as appris. T'es en IUT info? Si c'est le cas, tu as eu donc des cours sur les BD et si ton prof voit le MCD que t'as pondu, tu vas de faire rétamer.
2) séparer le php du html. A défaut de faire des templates (cf topic sur ce forum sur le MCV en php de FlorentG), au moins, mettre en début du fichier php, le code php, et à la fin, tout le code html.
3) aller sur http://ch2.php.net/manual/fr/index.php pour voir un peu toutes les fonctiosn qui existent en natif de php afin de pas recoder des fonctiosn existantes ;)

Reply

Marsh Posté le 21-06-2007 à 09:19:48    

Tout d'abord, désolé de répondre si tard.
Je tenais à vous remercier tous les deux pour votre aide.
Je vais bosser mon analyse et me pencher sur ces templates.
Sans doute la solution à mon problème me semblera limpide après.
Encore merci, et sûrement à bientôt.
 :hello:

Reply

Marsh Posté le 05-07-2007 à 18:32:38    

Bonjour.
J'ai donc travaillé sur la structure de ma base de donnée, qui est maintenant ainsi:
http://i15.photobucket.com/albums/a391/WarTatane/bd.jpg
 
J'arrive à afficher mes rapports et a les imprimer comme ceci:
http://i15.photobucket.com/albums/a391/WarTatane/tab2.jpg
Voici le code:

Code :
  1. <?php
  2. error_reporting(E_ALL ^ E_NOTICE);
  3. ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
  6. <head>
  7.  <title>Gestion parc - Afficher Rapports</title>
  8.  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  9.  <link rel="stylesheet" media="screen" type="text/css" title="Design" href="styles/style.css" />
  10.  <link rel="stylesheet" type="text/css" media="print" href="styles/print.css" />
  11. </head>
  12. <body>
  13.  <?php
  14.  include("includes/entete_menu.php" );?>
  15.  <div id="corps">
  16.   <h2>Afficher Rapports</h2>
  17.   <table class="ds_box" cellpadding="0" cellspacing="0" id="ds_conclass" style="display: none;">
  18.    <tr><td id="ds_calclass"></td></tr>
  19.   </table>
  20.   <?php include("includes/calendrier.php" ); // script du calendrier ?>
  21.   <form action="" method="post">
  22.    <table>
  23.     <tr>
  24.      <td>    <?php  // saisie des dates ?>
  25.       Choisissez la date du d&eacute;but des rapports :<input onclick="ds_sh(this);" name="date_deb" readonly="readonly" style="cursor: text" />
  26.      </td>
  27.      <td>
  28.       Choisissez la date de fin des rapports :<input onclick="ds_sh(this);" name="date_fin" readonly="readonly" style="cursor: text" />
  29.      </td>
  30.     </tr>
  31.     <tr>
  32.      <td colspan="2">
  33.       <input type="submit" value="Afficher les rapports" />
  34.      </td>
  35.     </tr>
  36.    </table>
  37.   </form>
  38.  </div>
  39.  <div>
  40. <?php
  41.   function conv_date($date1)  // je passe de l'écriture "jj-mm-aaaa" à l'écriture "aaaa-mm-jj" (ou inversement)
  42.   {
  43.    $d1 = explode("-", $date1);
  44.    $date2 = $d1[2].'-'.$d1[1].'-'.$d1[0];
  45.    return $date2;
  46.   }        // ---------- FIN FONCTION ----------
  47.   $date_deb = conv_date($_POST['date_deb']);
  48.   $date_fin = conv_date($_POST['date_fin']);
  49.   if(isset($_POST['date_deb']) || isset($_POST['date_fin']))
  50.   {
  51.    if($_POST['date_deb'] == "" && $_POST['date_fin'] == "" )
  52.    {
  53.     echo "ERREUR: Veuillez choisir deux dates.";
  54.    }
  55.    else
  56.    {
  57.     if(strtotime("$date_deb" ) <= strtotime("$date_fin" ))    // SI date_deb est inférieure à date_fin
  58.     {
  59.      include("includes/connect_bd.php" );  // on récupère tous les rapports dont la date de création est comprise entre date_deb et date_fin
  60.      $reponse = mysql_query('SELECT * FROM tmaintenance_evolutive WHERE date >= "'.$date_deb.'" AND date <= "'.$date_fin.'" ORDER BY tmaintenance_evolutive.date ASC');?>
  61.      <center class="plop">
  62.      <table class="tableau_afficher">
  63.       <tr>
  64.        <td>
  65.         Date :
  66.        </td>
  67.        <td colspan="3">
  68.         Informations Maintenance :
  69.        </td>
  70.       </tr>
  71. <?php      while ($donnees = mysql_fetch_array($reponse))
  72.       {?>
  73.        <tr>
  74.         <td>
  75. <?php         $date_francaise = conv_date($donnees['date']); // on affiche la date de création du rapport
  76.          echo $date_francaise;?>
  77.         </td>
  78.         <td>          <?php // on essaie d'extraire le nom de la machine corespondant au rapport en comparant le champs id_machine du rapport avec le champs id de la machine?>
  79.          <?php $machine_array = mysql_query('SELECT * FROM tconfigmachine INNER JOIN tmaintenance_evolutive ON tconfigmachine.id = "'.$donnees['id_machine'].'"')or die(mysql_error());
  80.          $machine = mysql_fetch_array($machine_array);
  81.          if(isset($machine['nom']))       // SI l'id_machine correspond à une machine existante,  
  82.          {            //on affiche le nom de cette machine
  83.           echo $machine['nom'];
  84.          }
  85.          else           // SINON on affiche le nom de la machine lors de la création du rapport
  86.          {
  87.           echo $donnees['nom_machine'];
  88.          }?>
  89.         </td>
  90.         <td>
  91.          <?php echo $donnees['type_materiel'];   // on affiche le type de la pièce changée ?>
  92.         </td>
  93.         <td>          <?php // on affiche le nom de l'ancienne et de la nouvelle pièce?>
  94.            <?php echo $donnees['ancienne_piece']." remplac&eacute; par ".$donnees['nouvelle_piece'];?>
  95.         </td>
  96.        </tr>
  97. <?php      }?>
  98.       <tr>
  99.       <td colspan="4">         <?php // Imprime la page selon le CSS "print.css"?>
  100.        <a href="#" onclick="javascript:window.print()">Imprimer cette page</a>
  101.       </td>
  102.       </tr>
  103.      </table>
  104.      <table class="tableau_afficher">
  105.      <tr>
  106.      </tr>
  107.      </table>
  108.      </center>
  109. <?php    }
  110.     else
  111.     {
  112.      echo "ERREUR: La date de d&eacute;but doit être inf&eacute;rieure à la date de fin.";
  113.     }
  114.    }
  115.   }?>
  116.  </div>
  117. </body>
  118. </html>


 
Seulement voila:
J'aimerais intéger les données de tmaintenance_intervention dans mon tableau de la façon suivante:
http://i15.photobucket.com/albums/a391/WarTatane/tab1.jpg
 
Là, la requète et l'affichage dans mon tableau me dépasse :(.
 
Si je n'ai pas été assez clair, ou si vous avez dez idées ... n'hésitez pas ;)

Reply

Marsh Posté le 05-07-2007 à 23:04:05    

Sans pousser à du mvc, tu ferais bien de séparer un peu l'affichage du traitement.
 
Et le vilain enchevêtrement de html dans une boucle en php c'est laid et pas maintenable quand ça va se compliquer.
 
C'est quoi ton nom_machine dans la table tmaintenance_intervention?
 
J'ai pas compris ce que tu veux mais encore une fois la mise en page de ton affichage on s'en talque pour l'instant, vois le fonctionnel du paufinera l'affichage après ;)
 

Reply

Marsh Posté le 06-07-2007 à 10:17:28    

montre nous ton mcd en entier, svp :)

Reply

Marsh Posté le 06-07-2007 à 10:17:48    

leflos5 a écrit :

Et le vilain enchevêtrement de html dans une boucle en php c'est laid et pas maintenable quand ça va se compliquer.

J'ai pas cherché à faire laid, j'ai cherché à afficher un tableau de données MySql et je n'est trouvé que cette solution.

leflos5 a écrit :

C'est quoi ton nom_machine dans la table tmaintenance_intervention?

Code :
  1. else      // SINON on affiche le nom de la machine lors de la création du rapport
  2. {
  3.     echo $donnees['nom_machine'];
  4. }

Je ne vois pas comment être plus clair  :??:

leflos5 a écrit :

J'ai pas compris ce que tu veux

Une requète MySql qui permet de sortir une variable afin d'exploiter cette variable de façon à obtenir le dernier tableau du post ci-dessus.

leflos5 a écrit :

mais encore une fois la mise en page de ton affichage on s'en talque pour l'instant

Moi aussi.
Le tableau est là pour illustrer ce que doit contenir la variable.
 
En espérant d'autre réponses constructives, a bientôt.

Reply

Marsh Posté le 06-07-2007 à 10:31:02    

rufo a écrit :

montre nous ton mcd en entier, svp :)

Je suis désolé, je ne sais pas représenter graphiquement les liaisons entre les tables.
En gros, j'ai une page où je peut modifier les différentes valeurs des champs de la table tconfigmachine.
Si je modifie "processeur, carte_graphique, carte_mere, ecran, ram, hdd" cela génère une entrée dans tmaintenance_evolutive. Si je modifie "intervention" cela génère une entrée dans tmaintenance_intervention.
Si des points te semble obscurs, n'hésite pas à poser des questions plus précises.
 
Merci de ta réponse  :hello:

Reply

Marsh Posté le 06-07-2007 à 14:29:03    

ben au moins, montre nous l'ensemble de tes tables. On fera les liens mentalement...

Reply

Marsh Posté le 06-07-2007 à 15:08:51    

Code :
  1. -- Base de données: `gestion_parc`
  2. CREATE DATABASE `gestion_parc` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
  3. USE `gestion_parc`;
  4. -- Structure de la table `tconfigmachine`
  5. CREATE TABLE `tconfigmachine` (
  6.   `id` int(11) NOT NULL auto_increment,
  7.   `nom` text NOT NULL,
  8.   `num_serie` text NOT NULL,
  9.   `proprietaire` text NOT NULL,
  10.   `marque` text NOT NULL,
  11.   `modele` text NOT NULL,
  12.   `loca_etage` text NOT NULL,
  13.   `loca_bureau` text NOT NULL,
  14.   `loca_switch` text NOT NULL,
  15.   `type` text NOT NULL,
  16.   `processeur` text NOT NULL,
  17.   `carte_mere` text NOT NULL,
  18.   `carte_graphique` text NOT NULL,
  19.   `ram` text NOT NULL,
  20.   `hdd` text NOT NULL,
  21.   `ecran` text NOT NULL,
  22.   `ip` text NOT NULL,
  23.   `masque_sous_reseau` text NOT NULL,
  24.   `dns` text NOT NULL,
  25.   `adresse_mac` text NOT NULL,
  26.   `nom_du_domaine` text NOT NULL,
  27.   `role` text NOT NULL,
  28.   `num_inventaire` text NOT NULL,
  29.   `garantie` text NOT NULL,
  30.   `remarques_particulieres` text NOT NULL,
  31.   `interventions` text NOT NULL,
  32.   `os` text NOT NULL,
  33.   `logiciels_specifiques` text NOT NULL,
  34.   `num_serie_os` text NOT NULL,
  35.   `peripheriques` text NOT NULL,
  36.   PRIMARY KEY  (`id`)
  37. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;
  38. -- --------------------------------------------------------
  39. -- Structure de la table `tmaintenance_evolutive`
  40. CREATE TABLE `tmaintenance_evolutive` (
  41.   `id` int(11) NOT NULL auto_increment,
  42.   `id_machine` int(11) NOT NULL,
  43.   `type_materiel` text NOT NULL,
  44.   `ancienne_piece` text NOT NULL,
  45.   `nouvelle_piece` text NOT NULL,
  46.   `date` date NOT NULL,
  47.   `nom_machine` text NOT NULL,
  48.   PRIMARY KEY  (`id`)
  49. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
  50. -- --------------------------------------------------------
  51. -- Structure de la table `tmaintenance_intervention`
  52. CREATE TABLE `tmaintenance_intervention` (
  53.   `id` int(11) NOT NULL auto_increment,
  54.   `date` date NOT NULL,
  55.   `intervention` text NOT NULL,
  56.   PRIMARY KEY  (`id`)
  57. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


Voila la structure complète de ma base (généré via PhpMyAdmin).
 
En espérant que cela t'aide  :) .

Reply

Marsh Posté le 06-07-2007 à 17:03:08    

sous forme d'image, ça aurait été plus facile à lire...enfin bon, perso, je trouve que t'as pas assez poussé ton analyse pour modéliser les relations entre les infos que t'as à gérer. Tu utilises beaucoup les champs textes et pas assez les clés étrangères.
J'aurais bien vu pour les champs suivants la création de nouvelles tables :  
`proprietaire` text NOT NULL,
 `marque` text NOT NULL,
 `modele` text NOT NULL,
 `loca_etage` text NOT NULL,
 `loca_bureau` text NOT NULL,
 `loca_switch` text NOT NULL,
 `type` text NOT NULL,
 `processeur` text NOT NULL,
 `carte_mere` text NOT NULL,
 `carte_graphique` text NOT NULL,
 `ram` text NOT NULL,
 `hdd` text NOT NULL,
 `ecran` text NOT NULL
 
Une table "modèles", une table "Marques". Le type, c'est quoi pour une machine? Là ça peu être soit un enum, soit une table.
 
Une table pour les "composants" (ou périphériques), où chaque composant à un type (ex : type cpu, type carte graphique...sous forme d'enum éventuellement) et un libellé unique (ex pour des cartes graphiques : X1300, X1650, X1950...désolé, j'ai pas mis de nvidia :D)
 
Une table "localisation" pour nommer exhaustivement tous les lieux. Ca évitera qu'un coup, on mette "Bât A" ou "Bâtiment A" ou "Bâtiment administratif" pour désigner le même lieu. derrière, si tu doit requêter par lieux, t'es pas dans le caca :/
 
Franchement, tu devrais regarder le schéma de la BD de glpi. On y retrouve pas mal d'infos que tu as décidé de gérer, sauf que leur bd est mieux structurée (y'a des choix critiquables mais c'est tout de même mieux que ton schéma).


Message édité par rufo le 06-07-2007 à 17:05:05
Reply

Marsh Posté le 06-07-2007 à 17:58:47    

Effectivement, j'abonde dans ton sens, mon analyse étais incomplète.
Cela dis, je dois bientôt boucler le projet et je ne pense pas avoir le temps de la mettre en application  :sweat: .
J'aimerais juste afficher dans un même tableau les données provenant de tmaintenance_evolutive et de tmaintenance_intervention, classé par dates. Etant pressé par le temps, je vais me cantonner au plus urgent. J'ai un impératif, il faut que çà tourne.
Je suis en stage pour un BTS de programmation (principalement de l'objet). J'ai donc survoler les bases de données, mais sans apprendre merise, MCD ,MLD. Comme tu le sais sûrement, on trouve un stage comme on peut, et pas toujours dans son domaine précis de compétences. Je me suis donc mis à niveau (plus ou moins) en PHP, XHTML, CSS et MySql.
Le stage dure 6 semaines, et ma mise à niveau m'a déjà bien retardé. Je comprends ta démarche pédagogique qui consiste à me faire corriger mes défauts de codages avant le problème précis. Si tu me donnais la solution, je resterai avec ma mauvaise analyse, mon mauvaise code, et donc, mon site ne serait pas optimal. Pire, je prendrais de mauvaises habitudes de codage. Cela dit, le temps jouant hélas contre moi, je ne peux pas me permettre de revoir ma structure.  
 
(je peux bien sûr me tromper totalement sur le but de tes réponses. Peut-être que tu ne vois pas de solutions à mon problème, ou que tu ne le comprends pas et donc, que tu te cantonnes sur les problèmes qui te semble importants)
 
En tout cas, je te remercie pour ton éclairage sur l'analyse de bases de données, cela me sera sans aucun doute utile par la suite. Tant pis pour ma requête, je vais faire deux tableaux, un pour tmaintenance_evolutive et un pour tmaintenance_intervention. Cela ne correspond pas au cahier des charges, mais tant pis ^^.
 
Bonne route, et merci pour ta patience  :hello: .


Message édité par Danaan1 le 06-07-2007 à 18:00:04
Reply

Marsh Posté le 08-07-2007 à 21:36:07    

Danaan1 a écrit :

J'ai pas cherché à faire laid, j'ai cherché à afficher un tableau de données MySql et je n'est trouvé que cette solution.


Ce que je veux dire c'est que au moins fais tes traitements, et fais l'affichage d'un coup.

Citation :


Code :
  1. else      // SINON on affiche le nom de la machine lors de la création du rapport
  2. {
  3.     echo $donnees['nom_machine'];
  4. }

Je ne vois pas comment être plus clair  :??:


Ce que je veux dire c'est qu'est ce que ça refout ici vu que tu l'as dans la table tconfigmachine :??:

Citation :


 Une requète MySql qui permet de sortir une variable afin d'exploiter cette variable de façon à obtenir le dernier tableau du post ci-dessus.Moi aussi.
Le tableau est là pour illustrer ce que doit contenir la variable.
 
En espérant d'autre réponses constructives, a bientôt.


Ah j'avais pas vu, le problème est dans ta requête en effet, c'est quoi cette jointure sur une valeur donnée :heink:  
 
Tu fais une jointure sur toutes les tables sur les clés (un join quelqconque en réfléchissant au sens le plus judicieux) et tu choisis la machine que tu veux dans la clause where ainsi que les champs que tu veux récupérer (éviter le * si tu te sers pas de tout).
 
Enfin, le souci est donc dans ton sql, jettes un oeil sur internet t'as plein de tuto là dessus ;)

Reply

Marsh Posté le 09-07-2007 à 09:42:22    

leflos5 a écrit :

Ce que je veux dire c'est qu'est ce que ça refout ici vu que tu l'as dans la table tconfigmachine :??:

Si une machine est supprimée de la base de donnée, les rapports de maintenance la concernant doivent subsister.
Donc:
SI le nom de la machine n'est pas retourné,
ALORS on affiche le nom de la machine lors de la création du rapport.

leflos5 a écrit :

Enfin, le souci est donc dans ton sql, jettes un oeil sur internet t'as plein de tuto là dessus ;)

Merci, mais je n'ai que peut de temps à mettre à profit. Je trouverai bien une solution de dépannage (j'espère).
Encore merci  :bounce: .

Reply

Marsh Posté le 09-07-2007 à 09:52:32    

Si j'ai bien compris ton pb, tu veux mixer dans un même tableau les évols et les interventions de PCs dans un intervalle de temps, trié par ordre croissant de leur date. Je dirais qu'une solution serait de faire un UNION.
ex : (SELECT m.id, m.nom, e.date, ...  FROM tconfigmachine m, tmaintenance_evolutive e WHERE m.id = e.id_machine AND m.id = $ID) UNION (SELECT m.id, m.nom, i.date, ... FROM tconfigmachine m, tmaintenance_intervention i WHERE m.id = i.id_machine AND m.id = $ID) ORDER BY date
 
seul pb, j'ai pas vu id_machine dans ta table tmaintenance_intervention. Un oubli? Si c'est pas le cas, comment tu fais pour relier les interventions aux machines? :/

Reply

Marsh Posté le 09-07-2007 à 14:57:28    

Effectivement c'est un oublis  :sweat: .
Je n'ai pas encore mis en oeuvre tinterventions, donc je ne l'avais pas remarqué.
Merci pour ta solution, j'essaie çà tout de suite.

Reply

Marsh Posté le 09-07-2007 à 16:37:06    

dis-toi bien une chose : pour pouvoir bien concevoir le MCD de sa BD, il faut procéder à une bonne analyse des besoins/contraintes et entre autre, savoir quels traitements on va vouloir d'effectuer sur les données. Et en général, c'est difficile d'effectuer des traitements pertinents/précis sur des champs textes dont le contenu n'est pas maîtrisé (entre les espaces en trop, la casse, les différentes nominations..)

Reply

Marsh Posté le 09-07-2007 à 19:05:49    

Je dirais que de manière générale on ne supprime jamais des données dans une base (surtout de ce genre, la preuve). En revanche la solution simple c'est de rajouter un état dans la table des machines.
 
De même je dirais que si la machine change de nom, en effet faut que ça reste, mais avoir une machine avec deux noms différents, ça fait désordre conceptuellement :whistle:
 
Donc pour régler tout ça et voir même de connaitre le statut d'une machine facilement sans aller voir si y'a une ou plusieurs interventions en attente, un petit attribut et zou ;)
 
Si réellement le nom de la machine doit changé trop souvent, faut sortir ça de ta table machine et lier une machine à son nom à un moment donné.

Reply

Marsh Posté le 10-07-2007 à 04:35:30    

Danaan1 a écrit :

Bonjour à tous.
 
Je doit créer une page PHP qui récupère une donnée d'un champs d'une base de donnée.
Cette donnée (rapports_de_maintenance) peut ressembler a ceci :


Une tres forte envie de mourir me prend ...

Reply

Marsh Posté le 10-07-2007 à 10:43:11    

rufo a écrit :

et entre autre, savoir quels traitements on va vouloir d'effectuer sur les données

Donc en créant la base, on pense déjà au requêtes?
Sinon pour la requête que tu m'as donné, je n'ai pas réussis à la mettre en oeuvre, car je n'en comprends pas la logique. J'ai essayé de l'adapter à ma sauce:
(SELECT date, idmachine, nom_machine, ancienne_piece, nouvelle_piece FROM tmaintenance_evolutive WHERE date >= $date_deb AND date <= $date_fin) UNION (SELECT date, nom_machine, id_machine FROM tmaintenance_intervention WHERE date >= $date_deb AND date <= $date_fin) ORDER BY date
Evidement si je la poste, c'est qu'elle ne marche pas :). Utiliserais-je mal UNION?
 

leflos5 a écrit :

Je dirais que de manière générale on ne supprime jamais des données

Merci, je l'ignorais. Pour moi, si une machine sort d'un parc informatique, elle n'a plus à y figurer. Mais effectivement, cela ne coûte rien de laisser la machine avec un flag en_service = 0 par exemple. Cela dis, sur 130 machines et beaucoup de changement, c'est vite le foutoire. Mais pourquoi ne pas créer une table tmachine_sup ?

leflos5 a écrit :

mais avoir une machine avec deux noms différents, ça fait désordre conceptuellement

La machine n'a qu'un nom, et un nom généré lors de la création du rapport (comment çà je chipote? :ange:). Je me rends bien compte de l'absurdité de la chose, mais n'ayant pas eu d'autres idées sur le moment...
 

supermofo a écrit :

Une tres forte envie de mourir me prend ...

Toutes mes futures et sincères condoléances à ta famille, et merci pour ce message critique hautement pertinent...
J'accepte les remarques et reconnais volontiers mes erreurs (si on me dis lesquelles évidement). Si tu as quelque chose de constructif à dire, dit-le.
Dans le cas contraire, s'il te plait, vas flooder ailleurs.
Merci et bonne journée  :hello: .


Message édité par Danaan1 le 10-07-2007 à 10:44:43
Reply

Marsh Posté le 10-07-2007 à 11:42:02    

(SELECT date, idmachine, nom_machine, ancienne_piece, nouvelle_piece FROM tmaintenance_evolutive WHERE date >= $date_deb AND date <= $date_fin) UNION (SELECT date, nom_machine, id_machine FROM tmaintenance_intervention WHERE date >= $date_deb AND date <= $date_fin) ORDER BY date
 
T'as pas l'impression qu'il te manque qq chose??? :sarcastic:  Le nom de la machine n'apparaît pas dans ta table tmaintenance_intervention. Faut donc faire une jointure avec la table contenant les machines.
Si t'avais lu le message d'erreur renvoyé par mysql, il t'aurait dit que la colonne nom_machine lui est inconnue...
 

Citation :

La machine n'a qu'un nom, et un nom généré lors de la création du rapport (comment çà je chipote? :ange:). Je me rends bien compte de l'absurdité de la chose, mais n'ayant pas eu d'autres idées sur le moment...


 
s'il est généré à la volée, il n'a pas besoin d'être stocké. Pour rappel, on ne met normalement (après, dans des cas d'optimisations, on peut transgresser la règle) dans une bd que le strict minimum d'infos et de manière unique (pas de redondance) qui ne peut pas être retrouver par un autre moyen ou calculé.
Je suis donc d'accord avec leflos5, avoir 2 noms différents pour une même machine dans 2 tables, ça fait franchement désordre, c'est du n'importe quoi. Par contre, tu aurais pu avoir 2 champs "nom" dans la table des machines : un pour une utilisation donnée et un autre pour une autre utilisation (ex : un nom court et un nom long) : là, ça me choquerait pas.
 
Et le coup du flag pour dire dans quel statut se trouve une machine, c'est couramment utilisé : "en maintenance", "en production", "réformé"... Ca se gère très bien. C'est ce qu'on appelle un cycle de vie. Et plutôt qu'un simple flag dans la table des machines, on peut très biena voir une table "historique_machines" qui historiserait tous les changements de statut de chaque machine (avec la date, le statut courant, qui a changé de statut, la raison...).
 

Citation :

Donc en créant la base, on pense déjà au requêtes?


 
Pas au codage SQL des requêtes en elles-mêmes (c'est de l'implémentation, ça) mais à ce que l'on va vouloir extraire de la BD, oui. Typiquement, avec ton appli, on est incapable de dire quand une machine a été réformée ou si elle est toujours en service. Je ne sais pas si ça faisait partie de ton cahier des charges, mais imagines que oui, ben tu te retrouves le bec dans l'eau. :/
 
La conception d'une application, c'est ce qui est le plus difficile et qui prend le plus de temps, pas le codage (contrairement à ce que pas mal de personnes pensent)... :o

Message cité 1 fois
Message édité par rufo le 10-07-2007 à 11:43:13
Reply

Marsh Posté le 10-07-2007 à 14:49:00    

rufo a écrit :

T'as pas l'impression qu'il te manque qq chose??? :sarcastic:  Le nom de la machine n'apparaît pas dans ta table tmaintenance_intervention. Faut donc faire une jointure avec la table contenant les machines.

Je comptais utiliser (SELECT nom FROM tconfigmachine INNER JOIN tmaintenance_evolutive ON tconfigmachine.id = $donnees['id_machine']), comme dans ma version affichée un peu plus haut. Donc faire une requête qui sélectionne toutes les maintenances (évolutive ou intervention), puis une requête qui va chercher le nom de la machine en fonction d'id_machine.
 
nom_machine apparaît bien dans tmaintenance_intervention, et à la même utilité que tmaintenance_evolutive.nom_machine. Mon stage fini vendredi soir, donc je fais en fonction :/

rufo a écrit :

La conception d'une application, c'est ce qui est le plus difficile et qui prend le plus de temps, pas le codage (contrairement à ce que pas mal de personnes pensent)... :o

Mes profs  me le répètent depuis le début de ma première année  :) , et par expérience, j'en suis on ne peut plus conscient. Mais ma vision sur le fonctionnement des bases de données et les liaisons entre les tables, n'était pas clair du tout au début de mon stage. J'aurais du suivre des tutoriaux avant de faire mon analyse  :( . Mais cela me serviras de leçon  pour la prochaine fois ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed