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

Fermé
Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 - 5 mai 2021 à 16:03
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 - 19 mai 2021 à 13:23
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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 Ambassadeur 1 551
Modifié le 5 mai 2021 à 17:42
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
Modifié le 6 mai 2021 à 00:17
J'ai déjà cette résultat : [https://img-


Le résultat souhaite est le suivant :
0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
6 mai 2021 à 00:27
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
Modifié le 6 mai 2021 à 09:38
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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
6 mai 2021 à 10:24
as-tu testé ma suggestion en #1?
0
Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
6 mai 2021 à 12:31
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
6 mai 2021 à 13:35
Avez vous des idées comment je peut supprimer les doublons en jeunes :(
0
Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
Modifié le 6 mai 2021 à 14:45
   .....
   $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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
6 mai 2021 à 15:33
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
6 mai 2021 à 18:13
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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
6 mai 2021 à 18:38
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
Modifié le 7 mai 2021 à 00:44
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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
7 mai 2021 à 09:30
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
7 mai 2021 à 11:54
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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
7 mai 2021 à 12:47
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
Modifié le 9 mai 2021 à 01:17
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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
7 mai 2021 à 13:25
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
9 mai 2021 à 00:04
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
9 mai 2021 à 00:21
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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
9 mai 2021 à 08:55
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
9 mai 2021 à 19:42
Merci,
Oui bonne question : C'est inutile
0
Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
18 mai 2021 à 16:00
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 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551 > Lemjid Messages postés 71 Date d'inscription mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021
18 mai 2021 à 16:19
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 mardi 26 février 2019 Statut Membre Dernière intervention 15 juillet 2021 > yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024
18 mai 2021 à 16:40
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