Page 1 sur 1

Excel et mauvaise interprétation

Posté : 17 mai 2006, 10:34
par Maitrepylos
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

Posté : 17 mai 2006, 10:48
par Ryle
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...

Posté : 17 mai 2006, 14:21
par Maitrepylos
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

Posté : 17 mai 2006, 14:31
par Ryle
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)

Posté : 17 mai 2006, 15:35
par Maitrepylos
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

Posté : 17 mai 2006, 15:46
par Maitrepylos
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=?,?

}



Posté : 17 mai 2006, 15:52
par Ryle
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 ...

Posté : 17 mai 2006, 17:06
par Maitrepylos
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 ) :)

Posté : 17 mai 2006, 17:43
par Ryle
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)
); 

...

Posté : 18 mai 2006, 09:55
par Maitrepylos
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

Posté : 18 mai 2006, 10:00
par Ryle
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 :))

Posté : 18 mai 2006, 10:18
par Maitrepylos
: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é)

Posté : 18 mai 2006, 10:22
par Maitrepylos
Merci Cela fonctionne

A la prochaine :lol:

MaitrePylos

Posté : 18 mai 2006, 10:26
par Ryle
Y a pas de soucis, le principal c'est d'y être arrivé :)

bon courage pour la suite :)