Page 1 sur 1

Possibiltiés d'export vers CSV ?

Posté : 18 nov. 2014, 06:37
par Couin
Hello,

J'ai fais cette nuit, une page permettant de généré un rapport sur les divers arrets (interventions) de la journée de production.
Ca se présente sous cette forme (en fait c'est un tableau) :
Eqpt Nb total Tps total
CHE 2 00:00:09
CHI 1 00:00:01
CI 3 00:37:13
CIxxx_001 1 00:00:30
CO+CA 1 00:00:14
IU 47 04:23:28
IOC 2 00:00:33
AU 1 00:00:03

Pour chaque ligne, on a le type de défaut , le nombre de fois que le défaut est rencontré et la somem de temps pour ce défaut. Un type de défaut peut correspondre à plusieurs défaut : Par exemple, pour CHE (CHute Exterieure) on comtpe tous les défauts de n'importe quelle CHute Exterieur (suivie d'un numéro pour la désigner).

Chaque résultat (tant le nombre que le temps total) pour chaque ligne, correspond à une requète. Ce qui veut dire que pour générer ce petit rapport, il y a 16 requètes.

J'aimerais pouvoir exporter ce résultat en CSV afin que notre prestataire maitnenance puisse l'integré dans sa moulinette.

J'ai fouillé pas mal de temps sur google ou sur phpfrance, mais je dois mal m'y prendre car je trovue essentiellement des scripts permettant , soit d'exporter une table via un formulaire php, soit d'exporter une base ou table depuis phpmyadmin. Je ne suis pas parvenu à trouver une base de départ pour exporter 16 requetes d'un coup donc je n'ai rien pu tester pour le moment car je sais vraiment pas du tout comment faire, ni même si c'est faisable :(

Donc si quelqu'un a une idée pour m'orienter, ca serait cool :)

Voici une bribe de ma page de stats php , ca correspond à une ligne du "tableau" ci dessus :
  <tr class=impaire>
    <td>CHE</td>
    <td>	 <?php

    $sql_che = "SELECT id_eqpt, eqpt_description, COUNT( * ) AS total_nb_che
FROM trs_events
LEFT JOIN trs_eqpts ON trs_eqpts.eqpt_id = trs_events.id_eqpt
WHERE prod_date = (
SELECT MAX( prod_date )
FROM trs_events )
AND
 (eqpt_description LIKE 'Chute extérieure spiralée %')
			";

    $sql_che = mysql_query( $sql_che) ;

    while ($donnees = mysql_fetch_array($sql_che) )
    {
    ?>
    <?php echo $donnees['total_nb_che']; ?>
    <?php  } ?></td>
    <td>	<?php

    $sql_time_che = "SELECT inter_stamp, id_eqpt, eqpt_name, SUM( inter_stamp ) AS total_time_che
FROM trs_events
LEFT JOIN trs_eqpts ON trs_eqpts.eqpt_id = trs_events.id_eqpt
WHERE prod_date = (
SELECT MAX( prod_date )
FROM trs_events )
AND (eqpt_description LIKE 'Chute extérieure spiralée %')
			";

    $sql_time_che = mysql_query( $sql_time_che );

    while( $donnees = mysql_fetch_object( $sql_time_che ) )
    { ?>

	<?php echo gmdate("H:i:s", $donnees->total_time_che);?></td>
	<?php } ?></td>
  </tr>
M'ciiiiii :D
Couin

Re: Possibiltiés d'export vers CSV ?

Posté : 18 nov. 2014, 09:56
par Barbare
Pourquoi pas utiliser des arrays (tableaux) et ensuite utiliser fputcsv?
http://php.net/manual/fr/function.fputcsv.php

Re: Possibiltiés d'export vers CSV ?

Posté : 18 nov. 2014, 15:36
par Couin
Hello,

Merci pour la réponse, je e vais étudier cela.

Toutefois, est-ce possible de faire un array contenant des variables obtenues depuis des requêtes sql ?

Dans le genre :
$list = array (
   array('CHE', 'total_nb_che', 'total_time_che'),
   array('CHI', 'total_nb_chi', 'total_time_chi'),
   array('CI', 'total_nb_ci', 'total_time_ci'),
etc etc 
Sachant que les variables en question ne sont plus valables dès lors que la prochaine requête est exécutée ?
Je veux dire, que si par exemple je rassemble toutes mes requêtes en haut de page, et que je mets tous les <?php echo $donnees['total_nb_che']; ?> et autres en dessous, cela ne fonctionne pas.

M'ci :)

Re: Possibiltiés d'export vers CSV ?

Posté : 18 nov. 2014, 17:36
par Couin
Sachant que les variables en question ne sont plus valables dès lors que la prochaine requête est exécutée ?
Je veux dire, que si par exemple je rassemble toutes mes requêtes en haut de page, et que je mets tous les <?php echo $donnees['total_nb_che']; ?> et autres en dessous, cela ne fonctionne pas.
Alors j'ai un peu avancé sur le sujet du rassemblement des requêtes, pour avoir une requête comme ca, que j'ai mis dans le head :
    $sql = "SELECT
(SELECT COUNT(*) FROM trs_events
LEFT JOIN trs_eqpts ON trs_eqpts.eqpt_id = trs_events.id_eqpt
WHERE 
 eqpt_description LIKE 'Chute extérieure spiralée %'
AND
prod_date = (
SELECT MAX( prod_date )
FROM trs_events )
) as total_nb_che,
(SELECT SUM( inter_stamp ) FROM trs_events
LEFT JOIN trs_eqpts ON trs_eqpts.eqpt_id = trs_events.id_eqpt
WHERE 
 eqpt_description LIKE 'Chute extérieure spiralée %'
AND
prod_date = (
SELECT MAX( prod_date )
FROM trs_events )
) as total_time_che
                        ";
    $sql = mysql_query( $sql) ;
   $donnees = mysql_fetch_array($sql)
    
et dans le body, je fais afficher les données :
<tr>
    <td>CHE</td>
    <td>
	<?php echo gmdate("H:i:s", $donnees['total_time_che']);?>
    	</td>
	<td>
	<?php echo $donnees['total_nb_che']; ?>
	</td>
  </tr>
Reste à voir pour faire une version export (avec le array).

Re: Possibiltiés d'export vers CSV ?

Posté : 19 nov. 2014, 02:39
par Couin
Hello ,

Voici l'état d'avancement pour la fonction export.
Alors je ne suis pas parvenu à obtenir quelque chose avec array, mais j'ai réussi à exporter quelque chose avec le code suivant :
// Titre des colonnes de votre fichier .CSV ou .XLS
$fichier = "Equipement;Nombre;Temps";
$fichier .= "\n";
 
// Requête SQL
$sql = "
SELECT

(SELECT COUNT(*) FROM trs_events
LEFT JOIN trs_eqpts ON trs_eqpts.eqpt_id = trs_events.id_eqpt
WHERE
 eqpt_description LIKE 'Chute extérieure spiralée %'
AND
prod_date = (
SELECT MAX( prod_date )
FROM trs_events )
) AS total_nb_che,

(SELECT SUM( inter_stamp ) FROM trs_events
LEFT JOIN trs_eqpts ON trs_eqpts.eqpt_id = trs_events.id_eqpt
WHERE
 eqpt_description LIKE 'Chute extérieure spiralée %'
AND
prod_date = (
SELECT MAX( prod_date )
FROM trs_events )
) AS total_time_che,

etc etc les autres compoasnts de la requête

";
$req = mysql_query($sql);

// Enregistrement des résultats ligne par ligne
while($row = mysql_fetch_object($req))
{
$total_time_che = gmdate("H:i:s", $total_time_che)
   $fichier .= "CHE;".$row->total_nb_che.";".$row->total_time_che."\n";
   $fichier .= "CHI;".$row->total_nb_chi.";".$row->total_time_chi."\n";
   $fichier .= "CI;".$row->total_nb_ci.";".$row->total_time_ci."\n";
   $fichier .= "CIxxx_001;".$row->total_nb_ci001.";".$row->total_time_ci001."\n";
   $fichier .= "CO+CA;".$row->total_nb_coca.";".$row->total_time_coca."\n";
   $fichier .= "IU;".$row->total_nb_iu.";".$row->total_time_iu."\n";
   $fichier .= "IOC;".$row->total_nb_ioc.";".$row->total_time_ioc."\n";
   $fichier .= "NAT;".$row->total_nb_nat.";".$row->total_time_nat."\n";
   $fichier .= "AU;".$row->total_nb_au.";".$row->total_time_au."\n";
}
 
// Déclaration du type de contenu
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=Export.csv"); // Remplacer .csv par .xls pour exporter en .XLS
print $fichier;
exit;
J'obtiens bien un fichier csv comme ceci :
Equipement;Nombre;Temps
CHE;2;9
CHI;1;1
CI;5;2239
CIxxx_001;2;31
CO+CA;1;14
IU;15;1857
IOC;3;41
NAT;1;1
AU;1;3


Mais je suis confronté à deux problèmes que je n'arrive pas à résoudre :
- La ligne des titre se retrouve précédée de 4 espaces alors qu'ils ne figurent pas dans la ligne $fichier = "Equipement;Nombre;Temps";
- Je voudrais que les temps soient affichées en format HH:MM:SS (comme sur le tableau du premier post) , mais je n'y arrive pas.
J'ai tenté de rajouter la commande suivante :
$total_time_che = gmdate("H:i:s", $total_time_che) 
à la suite de :
$req = mysql_query($sql);
ou bien encore de mettre :
$fichier .= "CHE;".$row->total_nb_che.";".$row->gmdate("H:i:s", $total_time_che) ."\n";
à la place de :
$fichier .= "CHE;".$row->total_nb_che.";".$row->total_time_che."\n";
Mais à part des messages d'insultes sql , je n'obtiens pas le résultat quej e voudrais.
Je ne trouve pas mon erreur :cry:

Ca va probablement sauter aux yeux d'un connaisseur, je serais alors preneur d'une correction :wink:
M'ciiii !

Re: Possibiltiés d'export vers CSV ?

Posté : 19 nov. 2014, 02:54
par Nestecha
Pour le temps inclut cette fonction dans ton fichier php :
function formatTime($iSeconds) {
  $t = round($iSeconds);
  return sprintf('%02d:%02d:%02d', ($t/3600),($t/60%60), $t%60);
}
Puis change :
$fichier .= "CHE;".$row->total_nb_che.";".$row->total_time_che."\n";
en :
$fichier .= "CHE;".$row->total_nb_che.";".formatTime($row->total_time_che,)."\n";

Re: Possibiltiés d'export vers CSV ?

Posté : 19 nov. 2014, 02:55
par Nestecha
Coquille sur la dernière ligne c'est plutôt ça :
$fichier .= "CHE;".$row->total_nb_che.";".formatTime($row->total_time_che)."\n";

Re: Possibiltiés d'export vers CSV ?

Posté : 19 nov. 2014, 05:19
par Couin
Hello,

Merci c'est impeccable, reste plus que le soucis d'espace devant les noms de champs :oops:

Re: Possibiltiés d'export vers CSV ?

Posté : 23 nov. 2014, 05:31
par Couin
Hello :)

Je souhaite modifier mon export en insérant une ligne de commentaire entre deux listes de résultats obtenus par deux requêtes différentes.

Voici le code actuel de mon export :
<?php
 function formatTime($iSeconds) {
  $t = round($iSeconds);
  return sprintf('%02d:%02d:%02d', ($t/3600),($t/60%60), $t%60);
}

// Titre des colonnes de votre fichier .CSV ou .XLS
$fichier = "Prod. Date;Equipement;Début;Fin;Durée;Commentaire;Responsabilité;Superviseur;Numéro de colis";
$fichier .= "\n";
 
// Requête SQL
	    $sql = "
SELECT *
			FROM trs_events
			LEFT JOIN trs_eqpts
			ON trs_eqpts.eqpt_id = trs_events.id_eqpt
			LEFT JOIN trs_resps
			ON trs_resps.resp_id = trs_events.id_resp
			LEFT JOIN trs_users
			ON trs_users.user_id = trs_events.id_user
			WHERE (
			prod_date =(SELECT MAX(prod_date) FROM trs_events)
			AND (
			eqpt_name LIKE '%IOC%'
			OR
			eqpt_name LIKE '%NAT0%' )
			)
			ORDER BY begin DESC		
	                        ";
	  
	    //exécution de la requête:
$req = mysql_query($sql);

// Enregistrement des résultats ligne par ligne
while($result = mysql_fetch_object($req))
{
   $fichier .= $result->prod_date.";".$result->eqpt_name.";".$result->begin.";".$result->end.";".$result->inter_time.";".$result->comment.";".$result->resp_name.";".$result->user_name.";".$result->id_parcel."\n";
} 

// Requête SQL
	    $sql2 = "
SELECT *
			FROM trs_events
			LEFT JOIN trs_eqpts
			ON trs_eqpts.eqpt_id = trs_events.id_eqpt
			LEFT JOIN trs_resps
			ON trs_resps.resp_id = trs_events.id_resp
			LEFT JOIN trs_users
			ON trs_users.user_id = trs_events.id_user
			WHERE prod_date <= (SELECT MAX( prod_date ) FROM trs_events WHERE prod_date < (SELECT MAX( prod_date ) FROM trs_events))
			AND (
			eqpt_name LIKE '%IOC%'
			OR
			eqpt_name LIKE '%NAT0%' )
			ORDER BY begin DESC		
	                        ";
	  
	    //exécution de la requête:
$req2 = mysql_query($sql2);

// Enregistrement des résultats ligne par ligne
while($result2 = mysql_fetch_object($req2))
{
   $fichier .= $result2->prod_date.";".$result2->eqpt_name.";".$result2->begin.";".$result2->end.";".$result2->inter_time.";".$result2->comment.";".$result2->resp_name.";".$result2->user_name.";".$result2->id_parcel."\n";
} 

	// Déclaration du type de contenu
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=Export.csv"); // Remplacer .csv par .xls pour exporter en .XLS
print $fichier;
exit;
?>
J'ai tenté de rajouter
echo ('Mon commentaire');
avant
// Requête SQL
	    $sql2 = "
Mais le résutlat c'est que ca rajoute au début de la ligne des titres.

Si quelqu'un a une idée :oops:
M'ciiii :)