Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1 2
Bonjour,
Un petit exemple sera le plus parlant :
string ls_pathname, ls_file IF GetFileSaveName ( "Select File", ls_pathname, ls_file, "GIF", "XLS (*.xls), *.gif, CSV (*.csv), *.csv" , "C:\My Documents", 32770) = 1 THEN CHOOSE CASE right(ls_pathname,4) CASE '.csv' dw_1.SaveAsAscii(ls_pathname, ';') CASE '.xls' dw_1.SaveAs(ls_pathname, Excel8!, FALSE, EncodingANSI!) END CHOOSE END IF
Hors ligne
Salut les gens, ça faisait un moment :D
Ce forum est bloqué où je travaille
Bref. Moi, j'ai un problème avec le saveasascii.
J'ai une datastore toute bête qui récupère les données d'une table que je veux enregistrer dans un fichier csv avec ; comme séparateur.
Jusque là, pas de souci, ça fonctionne bien.
En revanche, pour une raison que j'ignore, ca ne prend pas en compte les chiffres à virgule.
Du coup, au lieu d'avoir 154,52 dans mon fichier, j'ai 15452.
Pour le moment, je contourne le problème en lisant ligne par ligne ma table et concaténer chaque champ avec un ; puis j'écris dans le fichier texte.
Ca fonctionne bien, mais bon, ça aurait été plus simple avec la datastore.
Voilà, si quelqu'un à une idée du pourquoi du comment ;)
Merci
Hors ligne
Salut Steph,
ton séparateur décimal est bien "," ?
SQLCA.DBParm = "DecimalSeparator=','"
Tu peux également vérifier les paramètres régionaux à la rubrique "Symbole décimal"
Lorsque tu fais ton retrieve() sous PB, tes données sont 'elles affichées correctement?
Hors ligne
Salut Doctor Z,
Si tes formats de sauvegarde sont prédéfinis, je pense que la méthode de Buck te résoudra tes problèmes.
Hors ligne
Bonjour à tous,
Merci beaucoup pour votre aide. La méthode de buck fonctionne effectivement très bien. Cependant,
je suis en train de chercher comment faire la distinction entre :
- un fichier Excel au format Excel
- un fichier Excel au format Excel avec les entêtes
- un fichier Excel au format Excel5
- un fichier Excel au format Excel5 avec les entêtes
...
Tous ont une extension XLS.
Le SaveAs () me permet effectivement de faire la distinction de l'extension sélectionnée (Excel!,
Excel5!, Excel8!, ...) mais aussi de spécifier s'il est nécessaire d'intégrer un entête (par le biais du 3e
paramètre du SaveAs (), True ou False).
Lorsque je trouverai quelque chose, je vous ferai signe, en tout merci beaucoup pour votre aide et
votre disponibilité.
Doctor Z.
Hors ligne
J'ai imaginé une manière de faire : gérer des formats à l'affichage et gérer des formats en interne de
manière à ce que je puisse faire la distinction entre la version et le type.
Je fais mon test et je vous dis ce qu'il en ait.
Hors ligne
Ne pourrais tu pas laisser l'utilisateur choisir son format (avec une DDLB par exemple)?
Dans ta DDLB, tu pourrais avoir :
- Excel
- Excel avec entêtes
- Excel5
- Excel5 avec entêtes
- CSV
- XML ...
et coder ton Saveas() sous un bouton en gérant ta sauvegarde en fonction du choix sélectionné.
Hors ligne
nico a écrit:
Ne pourrais tu pas laisser l'utilisateur choisir son format (avec une DDLB par exemple)?
Dans ta DDLB, tu pourrais avoir :
- Excel
- Excel avec entêtes
- Excel5
- Excel5 avec entêtes
- CSV
- XML ...
et coder ton Saveas() sous un bouton en gérant ta sauvegarde en fonction du choix sélectionné.
Salut nico,
En faisant comme cela, ça m'oblige à me créer une fenêtre de sauvegarde : en effet, le GetFileSaveName
m'ouvre une fenêtre de sauvegarde, puis après je travaille avec un SaveAs () ou un SaveAsAsii ()
suivant le cas.
De ce fait, il me faudrait une fenêtre qui reproduise à l'identique la fenêtre Windows "Enregistrer sous".
Hors ligne
Je reviens vers vous pour vous donner des nouvelles.
Le scénario que j'avais imaginer concernant la gestion d'extension interne et d'extension à lister dans
la fenêtre de sauvegarde fonctionne d'après mes tests.
Voilà mon code (il n'est pas optimisé, mais je suis encore en cours de développement et de tests) :
integer li_rc string ls_pathname, ls_file, ls_pathname_final string ls_excel0 = "*.xls0n", ls_excel0_h = "*.xls0h", ls_excel5 = "*.xls5n", ls_excel5_h = "*.xls5h", ls_excel8 = "*.xls8n", ls_excel8_h = "*.xls8h" string ls_csv0 = "*.csv0n", ls_csv0_h = "*.csv0h" datastore lds_csv_import // Construction de la fenêtre "Enregistrer sous" avec les différentes extension à supporter IF GetFileSaveName ( "Save file as", ls_pathname, ls_file, "Excel", & "CSV, " + ls_csv0 + ",CSV with headers," + ls_csv0_h + & ",Excel, " + ls_excel0 + ",Excel with headers," + ls_excel0_h + & ",Excel5, " + ls_excel5 + ",Excel5 with headers," + ls_excel5_h + & ",Excel8 (97 / 2000 / XP / 2003), " + ls_excel8 + ",Excel8 (97 / 2000 / XP / 2003) with headers, " + ls_excel8_h, & "", 32770) = 1 THEN // Mémoriser le path correcte sans prendre en compte l'extension interne de travail ls_pathname_final = Left (ls_pathname, Len (ls_pathname) - 2) // En fonction de l'extension choisie, faire la sauvegarde correspondante CHOOSE CASE Right (ls_pathname, 5) // CSV sans entêtes CASE "csv0n" uo_dw_generic.SaveAs (ls_pathname_final, CSV!, FALSE) // Création et initialisation de la datastore lds_csv_import = CREATE Datastore lds_csv_import.DataObject = "d_import_n" // Importer le fichier sauvegardé dans une datastore li_rc = lds_csv_import.ImportFile (ls_pathname_final) IF li_rc < 0 OR IsNull (li_rc) THEN MessageBox ("ERREUR", "Erreur lors de l'importation des données du fichier CSV sans entêtes !", StopSign!, OK!) ELSE lds_csv_import.SaveAsAscii (ls_pathname_final, ";", "") END IF // Destruction de la datastore DESTROY lds_csv_import // CSV avec entêtes CASE "csv0h" uo_dw_generic.SaveAs (ls_pathname_final, CSV!, TRUE) // Création et initialisation de la datastore lds_csv_import = CREATE Datastore lds_csv_import.DataObject = "d_import_h" // Importer le fichier sauvegardé dans une datastore li_rc = lds_csv_import.ImportFile (ls_pathname_final) IF li_rc < 0 OR IsNull (li_rc) THEN MessageBox ("ERREUR", "Erreur lors de l'importation des données du fichier CSV avec entêtes !", StopSign!, OK!) ELSE lds_csv_import.SaveAsAscii (ls_pathname_final, ";", "") END IF // Destruction de la datastore DESTROY lds_csv_import // Excel sans entêtes CASE "xls0n" uo_dw_generic.SaveAs (ls_pathname_final, Excel!, FALSE) // Excel avec entêtes CASE "xls0h" uo_dw_generic.SaveAs (ls_pathname_final, Excel!, TRUE) // Excel 5 sans entêtes CASE "xls5n" uo_dw_generic.SaveAs (ls_pathname_final, Excel5!, FALSE) // Excel 5 avec entêtes CASE "xls5h" uo_dw_generic.SaveAs (ls_pathname_final, Excel5!, TRUE) ... END CHOOSE
Les cas simples (tous les cas sauf les CSV) sont faciles à gérer. Pour le CSV sans entêtes cela fonctionne aussi très
bien, simplement, je ne comprend pas pourquoi l'importation de mon fichier CSV avec entêtes échoue, je me prend
un -4, soit un Invalid input d'après la fiche d'aide de la méthode ImportFile ().
J'ai même fait 2 dataobject différents, mais rien à faire, toujours la même erreur. Si quelqu'un a une idée, moi
entre temps je continue de chercher et de tester.
Hors ligne
Bonjour,
Le code de retour -4 de la méthode ImportFile () était lié au fait que comme j'importe un fichier
contenant un entête, cette dernière n'arrivait pas à l'interprêter.
En faisant un :
li_rc = lds_csv_import.ImportFile (ls_pathname_final, 2)
cela fonctionne, il fallait commencer à la deuxière ligne pour que l'importation fonctionne.
En tout cas merci à tous d'avoir eut la patience de m'aider.
Doctor Z.
Hors ligne
nico a écrit:
Salut Steph,
ton séparateur décimal est bien "," ?Code: pb
SQLCA.DBParm = "DecimalSeparator=','"
Tu peux également vérifier les paramètres régionaux à la rubrique "Symbole décimal"
Lorsque tu fais ton retrieve() sous PB, tes données sont 'elles affichées correctement?
J'avais bien mis le DecimalSeparator mais j'avais une simple quote mal placée. C'est maintenant résolu ;)
Merci
Hors ligne
Pages: 1 2