Mettre deux lignes d'une requête sql en une seule dans un fichier Excel

Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
J'ai la requête qui donne comme résultat :

Apres avoir choisir les dates(Start/Stop) je généré un fichier Excel comme ca

Je veux avoir le résultat suivante :



J'utilise le code simple :

$query = " SELECT ....";
$result= $mysqli->query($query);
if( mysqli_num_rows($result) > 0){ $output .= '
<table class="table" bordered="1">
<tr>
<th class="virsteligne">Date start</th>
<th class="virsteligne">IO start</th>
<th class="virsteligne">lat start</th>
<th class="virsteligne">lng start</th>

<th class="virsteligne">Date stop</th>
<th class="virsteligne">IO stop</th>
<th class="virsteligne">lat stop</th>
<th class="virsteligne">lng stop</th>
</tr>
';
while($row = mysqli_fetch_array($result)) {
$output .= ' <tr>
<td>'.$row["dates"].'</td>
<td>'.$row["io1"].'</td>
<td>'.$row["lat"].'</td>
<td>'.$row["lng"].'</td>
<td>'.$row["io1"].'</td>
<td>'.$row["lat"].'</td>
<td>'.$row["lng"].'</td>
</tr>';}
$output .= '</table>';
$filename = "Rapport_".date('Y-m-d H:i:s') . ".xls";
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"$filename\"");
A voir également:

5 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
je suggère de remplacer ta bouccle while par:
$gauche = TRUE;
while($row = mysqli_fetch_array($result)) {
 if ($gauche) {
  $output .= ' <tr> ';
 }
 $output .= '<td>'.$row["dates"].'</td>
  <td>'.$row["io1"].'</td>
  <td>'.$row["lat"].'</td>
  <td>'.$row["lng"].'</td>
  <td>'.$row["io1"].'</td>
  <td>'.$row["lat"].'</td>
  <td>'.$row["lng"].'</td>';
 if ( ! $gauche) {
  $output .= ' </tr> ';
 }
 $gauche = ! $gauche;
}


EDIT: quelques modifs
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai déjà cette résultat : [https://img-


Le résultat souhaite est le suivant :
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
peux-tu montrer ton code?
tiens compte de ceci: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonjour,
c'est bien fait ,
    $query = " SELECT ....";
$result= $mysqli->query($query);
if( mysqli_num_rows($result) > 0){ $output .= '
<table class="table" bordered="1">
<tr>
<th class="virsteligne">Date start</th>
<th class="virsteligne">IO start</th>
<th class="virsteligne">lat start</th>
<th class="virsteligne">lng start</th>

<th class="virsteligne">Date stop</th>
<th class="virsteligne">IO stop</th>
<th class="virsteligne">lat stop</th>
<th class="virsteligne">lng stop</th>
</tr>
';
while($row = mysqli_fetch_array($result)) {
$output .= ' <tr>
<td>'.$row["dates"].'</td>
<td>'.$row["io1"].'</td>
<td>'.$row["lat"].'</td>
<td>'.$row["lng"].'</td>
<td>'.$row["io1"].'</td>
<td>'.$row["lat"].'</td>
<td>'.$row["lng"].'</td>
</tr>';}
$output .= '</table>';
$filename = "Rapport_".date('Y-m-d H:i:s') . ".xls";
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"$filename\"");
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
as-tu testé ma suggestion en #1?
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui, j'ai eu ca : les quatre lignes deviennent 2 lignes mais j'ai eu une duplication à gauche (en jeune) qui est non utile
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
Avez vous des idées comment je peut supprimer les doublons en jeunes :(
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
   .....
   $result= $mysqli->query($query);

 if(  mysqli_num_rows($result) > 0)
 {
   $output .= '
   <table class="table" bordered="1">  
                    <tr>  
                         <th class="virsteligne">Article</th>  
                         <th class="virsteligne">Date start</th>  
                         <th class="virsteligne">Heure start</th>  
						 <th class="virsteligne">GPS Start</th>						 
						 <th class="virsteligne">Adress start</th>
						 <th class="virsteligne">Date stop</th>
						 <th class="virsteligne">Heure stop</th>
						 <th class="virsteligne">Coordonnées GPS STOP</th>
						 <th class="virsteligne">Adresse stop</th>	
						 <th class="virsteligne">Temps</th>						 
						 <th class="virsteligne">Contact</th>
						 <th class="virsteligne">Station </th>
						 <th class="virsteligne">Trajet</th>
						 <th class="virsteligne">ometre</th>
                    </tr>';
 $gauche = TRUE;
  while($row = mysqli_fetch_array($result)){

	
	if ($gauche) {
	  $output .= ' <tr> ';
	}
    $output .= '        <td>'.$row["name"].'</td>  
						
						//Début Tous les lignes de la base de donnéees  dont les Io=1 // 
						<td>'.date("d/m/Y", strtotime($row["date"])).'</td> 					
						<td>'.date("H:i:s", strtotime($row["date"])).'</td>   
						<td>'.$row["lat"].','.$row["lng"].'</td>  
						<td>'.$row["name"].'</td>    
						//Fin
						
						
						//Début Tous les lignes de la base de donnéees  dont les Io=0 // 
						<td>'.date("d/m/Y", strtotime($row["dt_trackers"])).'</td> 					
						<td>'.date("H:i:s", strtotime($row["dt_trackers"])).'</td>   
						<td>'.$row["lat"].','.$row["lng"].'</td>  
						<td>'. $adresse.'</td>  
						//Fin
						
						
						<td>'.$row["Temps"].'</td>
						<td>'.$row["Contact"].'</td>  
						<td>'.$row["Station"].'</td>  
						<td>'.$row["Trajet"].'</td>  
						<td>'.$row["ometre"].'</td>';
	if ( ! $gauche) {
    $output .= ' </tr> ';
    }
    $gauche = ! $gauche;					
    }
    $output .= '    <tr>  
                         <th class="lastligne"></th>   
						 
                         <th class="lastligne"></th> 
                         <th class="lastligne"></th>   
                         <th class="lastligne"></th> 					 
						 <th class="lastligne"></th>
						 
						 <th class="lastligne"></th>   
                         <th class="lastligne"></th> 
						 <th class="lastligne"></th>   
                         <th class="lastligne">Somme</th> 
						 
						 <th class="lastligne"></th> 
						 <th class="lastligne"></th>  
                         <th class="lastligne"></th>   
                         <th class="lastligne"></th> 
						 <th class="lastligne"></th> 
						 
                    </tr>
  ';
  $output .= '</table>';
  $filename = "Rapport_".date('Y-m-d H:i:s') . ".xls";			
  header("Content-Type: application/vnd.ms-excel");
  header("Content-Disposition: attachment; filename=\"$filename\"");
  
 }
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
et en remplaçant les lignes 31 à 53 par:
 $output .= '<td>'.$row["dates"].'</td>
  <td>'.$row["io1"].'</td>
  <td>'.$row["lat"].'</td>
  <td>'.$row["lng"].'</td>';  
, n'obtiens-tu pas ce que tu décris en #2?
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
J'ai cette résultat :


Ce qui est en vert : C'est correcte ( les deux ligne dont io=1)
Ce qui est en rouge la 1iere ligne est vide et toute est écrit dans une seule ligne ( les deux ligne dont io=0)
:(
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
peux-tu montrer le code?
je me demande si tu n'essaies pas d'obtenir autre chose que ce que tu expliquais en #2.
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui , c'est que je cherche : BRAVO

Un seul truc : Au niveau de la cellule J ; je veux faire la différence entre : Heure stop & Heure start c-a-d
Durée de conduit = Heure stop - Heure start

Merci d'avance pour votre aide
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
moi je rejouterais ceci à la première ligne du SELECT:
timediff(cp.dates, dp.dates) as duree
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai la ajouté au niveau de requête de SELECT mais ca pas donnée la bonne résultat et à mon avis c'est incorrecte de le mettre au niveau de SELECT car le résultat de select est :



Le résultat au niveau de Excel est :


Et n'oublier pas que les valeurs de SELECT sont devenue dans une seule ligne (avec le code #10)
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
il est en effet préférable de calculer la différence de dates en PHP.
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui c'est vrai mais comment je peux le faire en PHP vue que j'ai passé par une long requête pour filtrer les 1iere dont j'ai io1=1 puis les 1iere dont io1=0 et a ce de suite (la requête de select c'est déjà assez compliquer ) :

 select cp.idc as id, cp.dt_trackers, cp.io1c as io1,
 cp.name,
 TIMEDIFF(cp.dt_trackers, dp.dt_trackers) as duree
 from 
 (select d1.id as idc, d1.io1 as io1c, d1.dt_trackers, max(d2.id) as idp,
 d1.name
 from gs_data as d1, gs_data as d2
 where d1.id > d2.id
 group by d1.id) as cp,
 gs_data as dp
 where dp.id = cp.idp and dp.io1 <> cp.io1c ;


EDIT : Ajout des balises de code

Qui donne comme résultat :



*
      • Donc moi je doit faire au niveau de cette requete :

2020-07-23 10:42:26 - 2020-07-23 10:16:50 et puis
2020-07-23 10:59:04 - 2020-07-23 10:56:55 ( c-a-d Io0 -Io1) ....
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
c'est assez simple:
- quand tu traites un enregistrement de gauche, tu mémorises sa date dans une variable
- quand tu traites un enregistrement de droite, tu calcule la durée et tu l'affiches
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui c'est ca : Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
Juste j'ai une question : est-il possible de calculer le somme au niveau de la dernière ligne comme ca :
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
moi, je calculerais la somme en PHP, en additionnant les valeurs dans la boucle d'affichage.
je me demande si il est utile de faire la somme des valeurs des odomètres.
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Merci,
Oui bonne question : C'est inutile
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
restant dans le même sujet :( :
@yg_be : Avez vous une idée comment je peut calculer ce truc en PHP de Contact Off qui est égale : Heure Start de 2iem ligne - Heure STOP de 1ier ligne (dans mon cas en Excel la formule est : =C3-G2 )
mon tableau :




Merci d'avance pour votre aide .
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 
moi je ferais presque comme en #18:
- quand tu traites un enregistrement de droite, tu mémorises sa date dans une variable et tu ne termines pas la ligne de la table
- quand tu traites un enregistrement de gauche, sauf le premier, tu calcules la durée "contact off" et tu l'affiches à la fin de la ligne précédente, que tu termines
- à la fin de la boucle, il faut terminer la dernière ligne
0
Lemjid Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Voila mon boucle while déjà calculer les date a droite et à gauche :
while($row = mysqli_fetch_array($result)){
	
    $odometre =(($row["odometre"])/1000);
	$odometre_converti = str_replace('.',',',$odometre);
	
    $duree =((strtotime($row["dt_trackers"]))-(strtotime($row["dt_trackers"])));
	
	$objadd=new DbFunction();
	$adresse=$objadd->geolocationAddress($row["lat"],$row["lng"]);
	
	if ($gauche) {
	  $output .= ' <tr> <td>'.$row["name"].'</td>';
	  $d1 = $row["dt_trackers"];
	  
	  $odometre1 = $row["odometre"];
	}
 
    $output .= '    <td>'.date("d/m/Y", strtotime($row["dt_trackers"])).'</td> 					
					<td>'.date('H:i:s', (strtotime("+60 minute", strtotime($row["dt_trackers"])))).'</td>
					<td>'.$row["lat"].','.$row["lng"].'</td>  
					<td>'.$adresse.'</td>';  
  
	if ( ! $gauche) {
		$d2 = $row["dt_trackers"];
		$duree =((strtotime($d2))-(strtotime($d1)));
		$odometre2 = $row["odometre"];
        $distance=($odometre2-$odometre1); 
		
		
    $output .= '    <td>'.date('H:i:s',$duree).'</td> 
					<td>'.$row["contact_off"].'</td>  
					<td>'.$row["stationaire_m"].'</td>  
					<td>'.$distance.'</td>  
					<td>'.$odometre_converti.'</td> 
					</tr>';
    }
    $gauche = ! $gauche;					
    }
0