fichier dans ifs

26-01-2007 à 13:16:29
Bonjour,

je relisais un ancien post traitant de la mise à disposition d'un fichier as400 aux utiisateurs.

le fichier est copié dans l'ifs (CPYTOIMPF ... avec + ou - de paramètres).

pour le récupérer dans Excel, il faut lui donner une extension particulière où pas ?
faut-il systématiquement passer par l'assistant d'importation texte d'Excel pour rapatrier les données... et se "retaper" les 3 étapes à chaque fois ?

je rappelle que dans mon cas, un code article 00012 est différent du code article 012, c'est à dire que les zéros de gauche sont significatifs.

Merci de votre aide
  • Liens sponsorisés



09-01-2007 à 11:19:06
Bonjour Erick,

je ne sais pas à quel post tu fais allusion concernant les "3 étapes" mais pour rapatrier des infos d'un fichier base de données AS400 dans un fichier CSV exploitable dans excel, tu peux utiliser effectivement la commande CPYTOIMPF :

CPYTOIMPF FROMFILE( BIB400/FICHIER400 )
TOSTMF( '/monrepertoireifs/monfichierifs.csv' )
MBROPT( *REPLACE )
STMFCODPAG( *PCASCII )
RCDDLM( *CRLF )
STRDLM( '"" )
FLDDLM( ';')
DECPNT( *COMMA )

le fait de mettre dans le paramètre STRDLM le caractère " permet de conserver l'information en type texte c'est à dire que ton code
012 devient "012" et 0012 "0012" : les zéros significatifs sont conservés.

Ensuite tout dépend de la version de excel utilisé :
- je crois que jusqu'à la version 2000, tu dois d'abord ouvrir excel puis ouvrir ton fichier qui est chargé par colonnes (si tu doubles clic, tout est chargé dans la même colonne)
- à partir d'excel 2003, tu peux faire les 2 et ton fichier est correctement chargé par colonnes

Bien sûr, il faut utiliser l'extension .csv (comma separated values) qui correspond à un fichier texte de valeurs séparées par des ; (paramètre FLDDLM).

Voilà comment je pratique en règle générale avec cette commande.

Wilfrid.


--Message édité par philippe le 10-01-07 à 12:39:54--

--Message édité par philippe le 10-01-07 à 12:40:19--
09-01-2007 à 11:58:17
Toutes les manip' que Wilfrid indique sont OK, mais je pense à une autre méthode qui serait peut-être plus rapide à terme.

Dans la mesure où le fichier .csv en question est toujours placé dans le même répertoire sur le même serveur, on peut faire une fois pour toutes les manip' qui suivent pour simplifier le transfert:
- Sur chaque PC client, "maper" un drive virtuel qui pointe sur le dossier de l'IFS où se trouve le fichier .csv. Pour maper, ouvrir l'explorateur de fichiers Windows, puis, à partir de la barre des menus, aller dans Outils>Connecter un lecteur réseau>Choisir une lettre disponible pour le lecteur (drive) et indiquer le chemin d'accés au dossier IFS ( par exemple,/home/monprofil/mondossier/monfichier.csv )
Créer ensuite un raccourci ( par ex. sur le bureau Windows ). Ce raccourci pointe sur ce fichier .csv.
Une fois que ces manip' ont été faites, l'utilisateur n'a plus qu'à cliquer dessus pour ouvrir le fichier .csv
Côté AS400, CPYTOIMPF en *replace remplacera le fichier précédent dans l'IFS.
Il n'y aura plus de manip' à faire côté PC.



--Message édité par philippe le 10-01-07 à 11:40:50--
09-01-2007 à 12:11:17
Effectivement,
il y a toujours d'autes possibilités dans le cas d'échanges entre PC et AS400.

Par exemple, s'il y a un serveur windows NT/2000/2003 sur le réseau (ce qui est souvent le cas), j'utilise régulièrement le système /QNTC qui permet d'accéder directement aux répertoires partagés par le serveur et mis à disposition pour chaque utilisateur selon ses droits.
Attention, dans ce cas il faut recréer le lien AS400-ServeurWindows après chaque IPL (dans le QSTRUP par exemple) et avoir une correspondance de profil et de mot de passe réseau et ceux de l'AS400.

Sinon pour mapper un lecteur, j'utilise aussi un NET USE non persistant dans un petit script .bat (voir un script de suppression du lecteur après traitement) car selon les cas, NetServer peut s'avérer gourmand en ressources et on peut être amener à limiter le nombre de connexions.
C'est utile aussi selon les politiques de mots de passe car le profil/pwd peut être redemandé ou fixé.

Voilà peut être encore quelques pistes ...

Wilfrid
10-01-2007 à 07:13:03
merci à vous,
je vais finaliser et essayer tout ça.

10-01-2007 à 11:25:57
désolé, ça ne fonctionne pas chez moi.
les zéros de gauche du code article disparaissent

si je fais un dspf j'ai :

"M638990";"262564 ";"*TAM3-3035";"000315 ";,0000000 ;6,000 ;6,000 ;"
"M638990";"262564 ";"*TAM3-3035";"000601 ";,0000000 ;1,000 ;1,000 ;"

dans excel je récupère :

M638990 262564 *TAM3-3035 315 0 6 6 0 0
M638990 262564 *TAM3-3035 601 0 1 1 0 0


ça n'est peut-être pas très lisible mais mon code article, c'est 000315 et pas 315

merci
10-01-2007 à 11:49:06
J'ai déjà rencontré ce problème il y a quelques années.

Il me semble que le problème vient d'excel: il supprime lui même les zéro non significatif que ta zone soit alpha ou num.

Essaye de modifier le catégorie de la cellule. Pour cela, tu clique sur une cellule (ou une colonne ou un ligne entière) avec le bouton droit de ta souris. Tu choisis l'option "format cell" (sorry, office est en anglais chez moi), tu clique sur l'onglet "number" et tu changes la catégorie.

Tu vas peut être devoir chercher un peu.

Autre solution, c'est d'abandonner le csv et de passer tes interfaces en XML ou de mettre sur l'IFS un simple fichier texte et executer une macro VB qui va lire ce fichier d'interface, formater tes colonnes et effectuer tout le formattage nécessaires.

Une troixième solution peut être d'écrire une macro VB qui se connecte à l'AS/400 et récupère tes données via SQL. Ensuite, tu effectues le formatage.
10-01-2007 à 12:44:26
Erick,

Comment est déclaré le code article dans le fichier AS400 ?
Indique moi sa définition telle qu'elle apparaît dans les DDS.
10-01-2007 à 13:00:16
Xavier,
D'abord merci, et oui, je suis pratiquement persuadé que le problème vient d'Excel.
Si on n'affecte pas une mise en forme spéciale, texte dans mon cas précis, il doit considérer que la zone est numérique et donc enlève les zéros de gauche.
J'en veux pour preuve que si le code article ne contient que des chiffres, Excel cale à droite en enlevant les zéros de gauche, si le code article contient une lettre, il cadre à gauche.

Philippe,
merci à toi aussi, la zone est déclarée en 15 a.
le DSPFFD donne :
Type Long Long Position Usage En-tête
Zone données zone tampon tampon zone colonne
CORDNO ALPHA 7 7 1 E/S X
Texte descriptif de la zone . . . . . . . : X
ID codé de jeu de caractères . . . . . : 297
CFITEM ALPHA 15 15 8 E/S X
le source donne ça :
A CFITEM 15A
10-01-2007 à 13:32:43
Oui, c'est Excel qui est le responsable et c'est pas la première fois qu'on rencontre ce problème.
J'ai essayé diverses variantes en changeant l'extension du fichier. Excel ne semble réagir favorablement -- c'est à dire ventilation de chaque zone sur une colonne séparée et non remplacement des zéros -- que lorsque
- le fichier porte l'extension .csv
- Excel est ouvert en premier
- le fichier .csv est ouvert à partir d'Excel.

Pour répondre à la 1ère question de ton post initial, il est donc effectivement préférable que le fichier porte l'extension .csv.
Pour ce qui concerne les "3 étapes à se taper", pour réduire les manips', je ne vois que ce que je t'ai indiqué précedemment (mapper un drive) et, selon la version de ton Excel, respecter ou non les étapes d'ouverture "Excel en premier puis le fichier .csv".
Tu peux toujours faire une macro pour faire ces dernières manips' comme te le propose Xavier.
10-01-2007 à 13:39:30
ok merci.
le résultat obtenu est toujours le même quelle que soit la méthode employée.
10-01-2007 à 13:55:14
Non, pas si le fichier porte l'extension .csv. Ou alors, tu n'as pas suivi l'ordre des manips' indiquées...
10-01-2007 à 14:32:14
Erick,
Après quelques recherches, il semble que pour conserver tes zéros significatifs, il y a 2 solutions :
- soit tu générères un fichier avec l'extension .txt et tu passes par le wizard d'excel en indiquant le caractère séparateur et le format des colonnes (texte pour l'article par exemple)
- soit tu travailles toi-même le formatage lors de la génération de ton .csv. Par exemple ton code article 000601 doit être formaté ...;""="000601";... et là les zéros sont conservés.
Cette 2ème solution est possible en utilisant les APIs de l'IFS
(de bons exemples sur le site de Scott Klement http://www.scottklement.com/rpg/ifs.html)
Sinon la solution de passer par un fichier xml est pas mal car les formats des champs sont conservés (et tu peux le générer facilement par les APIs).
Reste encore l'utilisation des APIs Java POI pour générer un véritable document excel sans aucun problème de formatage (pas d'exemples sur le sujet sur le web; par exemple : http://www.conduitedeprojet.net/spip.php?article155&var_recherche=excel

Philippe,
même avec ton ordre de procédure je n'arrive pas à une conservation des zéros non significatifs
...;"0061";...
- fichier .csv
- ouverture d'excel 2003
- ouverture du .csv à partir d'excel
- j'obtiens 61
Où est l'astuce ?
10-01-2007 à 14:38:16
Attention au fichier XML!!!!

La syntaxe XML Excell n'est ps standard. Microsoft ajoute toutes une série d'information supplémentaires.

Il est intéressant de créer un fichier excell à la main, de le sauver au format XML et d'ouvrir le fichier avec wordpad ou autre...

10-01-2007 à 14:57:57
On peut tout de même génrer un fichier XML assez simple reprenant l'archirecture d'un fichier de l'AS400.
Par exemple,
<?xml version="1.0" encoding="ISO-8859-1"?>
<FichierDB>
<Enregistrement>
<MoisDePaie>01</MoisDePaie>
<AnneeDePaie>2004</AnneeDePaie>
<Matricule>1</Matricule>
<CodeURSAFF>0045U0</CodeURSAFF>
<Montant>0,00</Montant>
<ConserveCaractere>àâäéèêëîïôöûü@</ConserveCaractere>
</Enregistrement>
<Enregistrement>
<MoisDePaie>02</MoisDePaie>
<AnneeDePaie>2004</AnneeDePaie>
<Matricule>1</Matricule>
<CodeURSAFF>00037U0</CodeURSAFF>
<Montant>0,00</Montant>
<ConserveCaractere>àâäéèêëîïôöûü@</ConserveCaractere>
</Enregistrement>
<Enregistrement>
<MoisDePaie>01</MoisDePaie>
<AnneeDePaie>2004</AnneeDePaie>
<Matricule>1</Matricule>
<CodeURSAFF>37U0</CodeURSAFF>
<Montant>7332,80</Montant>
<ConserveCaractere>àâäéèêëîïôöûü@</ConserveCaractere>
</Enregistrement>
</FichierDB>
Et cela s'importe bien dans excel (peut être des différences selon les versions d'excel !?)
Bien sûr, on est dans un processus uniquement de récupération de données sans MàJ en vue d'une redescente vers l'AS400.
10-01-2007 à 15:43:17
Wilfrid,
Effectivement, dans la méthode et l'ordre que je préconise, il faut ajouter par ex. un point décimal à la fin de la zone alpha pour ne pas éliminer les zéros (0061.), quitte à le supprimer ensuite de la feuille de calcul, je suis allé trop vite dans ma réponse...

Mais, il y a mieux avec les API Java HSSF (Horrible Spreadsheet Format) du projet Jakarta POI dont tu parles dans ce fil.
J'ai récupéré les sources dont il est question dans l'article de Giuseppe Costagliola intitulé "Bridge the Gap from Twinax to TCP/IP" à partir de ce lien : http://www.mcpressonline.com/mc?50@@.6ae8269f
Ils sont assortis d'une commande SQL2XLS qui permet de créer directement le dossier xls sans passer par des fichiers .csv.
J'ai testé avec le cas d'Erick et ça marche sans problème, les zéros sont bien conservés et les colonnes respectées.
Exemple :
SQL2XLS SQLSTMT('select * from MaTable') TOXLS('/tmp/MaTable.xls')
Ensuite, il n'y a plus qu'à ouvrir le fichier MaTable.xls dans l'IFS.

A tous,
Je vous recommande de télécharger le produit disponible sans frais à l'adresse indiquée plus haut. Vous pourrez ensuite utiliser la commande SQL2XLS directement ou l'insérer dans vos programmes.



--Message édité par philippe le 10-01-07 à 15:45:21--
  • Liens sponsorisés