Excel et mauvaise interprétation

Mammouth du PHP | 1029 Messages

17 mai 2006, 10:34

Bonjour,


je génère un fichier excel grâce au csv, j'ai choisi le point virgule comme délimiteur.

Dans ma db je fais un SUM de petit nombre, et les décimales éventuelles sont définie par un point (1.5,1.7...ect), quand j'affiche mes données dans mon fichier quelques fois il me met le résultat sous formes de dates.

Auriez-vous une idées.

Merci
L'expérience est la somme de toutes nos erreurs.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 mai 2006, 10:48

Bonjour,

Je pense que c'est juste une question d'affichage dans excel (format de la colonne) où il doit considérer automatiquement qu'il s'agit d'une date.. quand tu ouvres ton fichier csv dans un bloc note, les valeurs sont elles bien celles que tu attends ?

Si c'est le cas, il te faut à priori juste modifier le format de la cellule pour dire qu'il s'agit d'un nombre ou d'un texte et pas d'une date...

Mammouth du PHP | 1029 Messages

17 mai 2006, 14:21

Ben alors merci pour l'idée de Gedit, effectivement mon problème est que quand j'obtien le resultat 16.5 il m'affiche 16/05/2006.

Comme mon fichier est généré automatiquement je ne peux modofier les cellules ou alors si mais après, pas pratique pour les collègues.


Donc je pense qu'il faut que mon résultat soit 16,5 , avant de modifier toutes ma db, je voudrais avoir cotre avis sur : est ce la bonne solution

Merci
L'expérience est la somme de toutes nos erreurs.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 mai 2006, 14:31

Dans un premier temps, tu peux déjà faire un p'tit essai en modifiant le fichier à la main pour vérifier que tu obtiens bien le bon format :)

Ensuite avant de reprendre la structure de ta base, ptête qu'une petite modif lorsque tu génères le csv pour qu'il remplace le point par une virgule sur ce champ devrait suffir ? :)
(soit dans ta requête sql, soit dans du php, tout dépend comment tu génères ton csv)

Mammouth du PHP | 1029 Messages

17 mai 2006, 15:35

Ok c'est bon avec la virgule, mais je ne vois pas comment modifier ça avec une simple requete sql, j'ai quand même prés de 2000 cellules à générer, je crois que le plus simple est de modifié la db.

Merci pour ton aide
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 1029 Messages

17 mai 2006, 15:46

Bon d'accord, comment ferais tu pour transformer un résultats inconnu mais posédant un point, pour en faire un résultas inconnu mais avec une vrigule

quelque chose du genre
if($variables==?.?){
$variables=?,?

}


L'expérience est la somme de toutes nos erreurs.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 mai 2006, 15:52

Tu peux faire quelque chose du genre :
if (is_numeric ( $variable )) { // si tu traites un nombre
  $variable = str_replace(".", ",", $variable); // remplace tous les points par des virgules.
}
sinon dans ta requête sql, ce pourrait être de même un replace() du point par une virgule directement sur ta colonne sommée :

Code : Tout sélectionner

SELECT REPLACE( SUM(taColonne), '.', ',' ) ... FROM ...

Mammouth du PHP | 1029 Messages

17 mai 2006, 17:06

Voila ma requète sql,

Code : Tout sélectionner

SELECT parnom, parprenom, SUM(CASE WHEN regjour < dosdatef70bis THEN regheure WHEN cotypecontrat = '' AND dosf70bis='non' THEN regheure WHEN cotypecontrat = '' AND dosf70bis='' THEN regheure ELSE 0 END) AS Heures_Alpha, SUM(CASE WHEN regjour >= dosdatef70bis AND cotypecontrat ='F70 BISLE' THEN regheure ELSE 0 END) AS F70BIS_LE, SUM(CASE WHEN regjour >= dosdatef70bis AND cotypecontrat ='F70 BISAlpha' THEN regheure ELSE 0 END) AS F70BIS_Alpha, SUM(CASE WHEN regjour >= dosdatef70bis AND cotypecontrat ='' THEN regheure ELSE 0 END) AS F70BIS_oups, SUM(CASE WHEN cotypecontrat ='Permis cpas' THEN regheure ELSE 0 END) AS Permis_cpas, SUM(CASE WHEN cotypecontrat ='Article 60' THEN regheure ELSE 0 END) AS Article_60, SUM(CASE WHEN cotypecontrat ='Eft' THEN regheure ELSE 0 END) AS EFT, SUM(CASE WHEN cotypecontrat ='Conge education' THEN regheure ELSE 0 END) AS Conge_educ, SUM(regheure) AS Total FROM participant p INNER JOIN registre r ON p.idparticipant = r.idparticipant LEFT JOIN dossier d ON p.idparticipant = d.idparticipant LEFT JOIN contrat c ON p.idparticipant = c.idparticipant WHERE regjour BETWEEN '".$date->explode($_POST[DateRecherche])."' AND '".$date->explode($_POST[DateIntervale])."' $Nomformateur $NomParticipant GROUP BY parnom, parprenom ORDER BY parnom ASC");
voici la récupération
while($soluce = pg_fetch_object($resu))
{
	$fichier->Insertion("$soluce->parnom;$soluce->parprenom;$soluce->heures_alpha;$soluce->f70bis_le;$soluce->f70bis_alpha;$soluce->f70bis_oups;$soluce->permis_cpas;$soluce->article_60;$soluce->eft;$soluce->conge_educ;$soluce->total");


/**
 * Insertion des données dans la table temporaire
 * grâce a la boucle while
 */
$InsertTmp = pg_query("INSERT INTO temptable
				(heures_alpha ,f70bis_le ,f70bis_alpha ,f70bis_oups,permis_cpas, article_60, eft, conge_educ,totaltotal)
				VALUES ('$soluce->heures_alpha','$soluce->f70bis_le','$soluce->f70bis_alpha','$soluce->f70bis_oups','$soluce->permis_cpas','$soluce->article_60','$soluce->eft','$soluce->conge_educ','$soluce->total')");


} 
A ton avis quel sera la solution la plus perfomante.

Vraiment merci de ton aide
Et bonne soirée(fini boulot aujourd'hui ) :)
L'expérience est la somme de toutes nos erreurs.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 mai 2006, 17:43

Dans la mesure ou tu ré-enregistres juste après dans une autre table, il vaut peut être mieux ne pas le changer dans la requête, mais uniquement lors de l'insertion dans ton fichier... comme ça tu peux garder des nombres dans ton autre table :)

Peut être quelque chose comme ceci :
while($soluce = pg_fetch_object($resu)) { 

$fichier->Insertion("$soluce->parnom;$soluce->parprenom"
  . ";" . str_replace('.', ',', $soluce->heures_alpha)
  . ";" . str_replace('.', ',', $soluce->f70bis_le)
  . ";" . str_replace('.', ',', $soluce->f70bis_alpha)
  . ";" . str_replace('.', ',', $soluce->f70bis_oups)
  . ";" . str_replace('.', ',', $soluce->permis_cpas)
  . ";" . str_replace('.', ',', $soluce->article_60)
  . ";" . str_replace('.', ',', $soluce->eft)
  . ";" . str_replace('.', ',', $soluce->conge_educ)
  . ";" . str_replace('.', ',', $soluce->total)
); 

...

Mammouth du PHP | 1029 Messages

18 mai 2006, 09:55

Super merci de ton aide, par contre, connais tu le type dans PostgreSQL qui permet d'insérer un nombre avec virgule, parce que comme tu as remarqué j'insére les données dans une table temporaire pour moi faire les totaux de mes premiers SUM, je la crée ainsi
$CreateTmp = "CREATE TEMP TABLE temptable
				(heures_alpha float4,f70bis_le float4,f70bis_alpha float4,f70bis_oups float4,permis_cpas float4, article_60 float4,eft float4, conge_educ float4,totaltotal float4)";

pg_query($CreateTmp);


Or le float et le int ne reconnaisent pas le nombre avec virgule. une petite idée peut-être merci
L'expérience est la somme de toutes nos erreurs.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 mai 2006, 10:00

Tu peux eventuellement essayer avec le type double, mais float devrait suffir pour stocker un nombre décimal. Par contre effectivement, il se peut qu'il ne supporte pas la virgule comme séparateur de décimal, c'est pour ça que je te suggérais de ne faire la modification que dans la partie php où tu écris dans le fichier, sans altérer les valeurs que tu as récupérer.
Tu peux ainsi les stocker dans ta table temporaire tels que tu les as récupérer avec le select (et donc avec le point :))

Mammouth du PHP | 1029 Messages

18 mai 2006, 10:18

:axe: , oups je ne comprenais pas pourquoi tu faisais str_replace après les insertions, je n'avais même pas remarqué que c'etais directement dans mon insertions.

Mille excuses de te faire répèter 2x la même choses.

MaitrePylos (qui est très géné)
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 1029 Messages

18 mai 2006, 10:22

Merci Cela fonctionne

A la prochaine :lol:

MaitrePylos
L'expérience est la somme de toutes nos erreurs.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 mai 2006, 10:26

Y a pas de soucis, le principal c'est d'y être arrivé :)

bon courage pour la suite :)