, , Utiliser ACS depuis votre IBM i ?

Tout le monde connait ACS en tant que client sur un poste windows , mac , ou linux.

Je rappelle la principale différence avec ses prédécesseurs c’est que ACS et un client Léger et que l’exécutable JAVA acsbundle.exe suffit pour exécuter une requête

Vous pouvez l’installer sur votre ibm i, pour 3 raisons

1) la mise à disposition et la mise à jour peut désormais se faire par PTF

Déploiement disponible par PTF V7.3 PTF 5770SS1-SI71934 et après mise à jour de l’exécutable, pratiquement plus d’administration à faire

2) Le partager avec vos utilisateurs

Vous montez un partage sur le répertoire ou vous l’avez installé et vous exécuter acsbundle.exe à partir de ce ce dernier.
Ca marche très bien vous pouvez faire la mise à jour de tous vos postes en changeant l’exécutable de votre répertoire.
C’est à déconseiller, si vous avez des accès réseaux peut efficaces ou si vous avez des populations nomades qui accèdent à plusieurs IBM i

3) Pour exécuter des requêtes ACS directement sur l’IBM i.

C’est du java et votre partition sait faire du java, et vous pouvez lancer des commandes unix par STRQSH .

La première chose à vérifier c’est que le produit est bien installé sur votre partition

Par défaut, il se trouve dans le répertoire QIBM/ProdData/Access/ACS/Base/ , mais il peut se trouver ailleurs, par exemple dans /home/ qui est souvent monté par netserver.

Si vous ne l’avez pas utilisé depuis longtemps, il est conseillé de mettre une version ACSBUNDLE.EXE plus récente

En fonction de ce que vous voulez utiliser dans ACS, on parle de plugin

Dans notre exemple on veut créer une un fichier xls à partir d’une requête SQL c’est le plugin cldownload

Voici la syntaxe

STRQSH CMD( »java –jar votre_exe_java +
/plugin=cldownload +
/system=votre_systéme +
/clientfile= votre_fichier.xls +
/sql= »votre_requete_sql« ‘)

Exemple :

STRQSH CMD(‘java -jar /QIBM/ProdData/Access/ACS/Base/acsbundle.jar +
/plugin=cldownload +
/system=NEPTUNE +
/clientfile= /temp/liste_options_pdm.xls +
/sql= »Select * from qgpl.qauoopt »‘)

Nous avons packagé un outil (CRTXLSFIC) qui permet de faire ca et vous pouvez le trouver sur Github à l’adresse :

https://github.com/Plberthoin/PLB/tree/master/GTOOLS

Dans le plugin cldownload vous avez des options , par exemple, pour ajouter des entêtes de colonne, /colheadings=1 , etc …
il existe d’autres plugins dans ACS pour exécuter des commandes, exécuter de transfert etc …

Quelques liens intéressants à connaitre

ftp://ftp.software.ibm.com/as400/products/clientaccess/solutions/GettingStarted_en.html
https://www.volubis.fr/news/liens/courshtm/clientaccess/client%20solution_install.html
https://www.ibm.com/support/pages/automating-acs-data-transfer
https://developer.ibm.com/technologies/systems/articles/i-acs-commandline/
https://ibmsystemsmag.com/Power-Systems/02/2020/acs-shipped-with-ibm-i

Lancer une commande windows à partir de votre ibmi en session 5250

Vous pouvez exécuter une commande windows à partir de votre ibmi en session 5250

Pour cela vous devez d’abord démarrer l’intégrateur, c’est la commande STRPCO

STRCO
monmsg IWS4010 /* si déjà actif */

Ensuite vous demander l’exécution de la commande comme si vous étiez sous CMD, par la commande STRPCCMD

par exemple pour tester le bloc note

STRPCCMD PCCMD(‘%windir%\system32\notepad.exe’)

La commande doit être entre quotes

Conseil :

Préférer l’utilisation de la commande START qui associera automatiquement l’extension avec l’exécutable voulu.

exemple pour un pdf

STRPCCMD PCCMD(‘START votrepdf.pdf’) et non ‘C:\Program Files\PDFCreator\PDFCreator.exe votrepdfs.pdf’

STRPCCMD (‘calc.exe’) pour la calculatrice

Remarque :

Vous reprendrez la main quand vous aurez terminé votre session DOS
Vous ne pouvez pas intercepter de message d’erreur sur la commande STRPCCMD
La limitation de chaine de caractères est de 1023 de puis la V7R2, avant vous étiez limité à 123.
Vous pouvez monter des partages, avec netserver c’est la commande dos net use, vous pouvez aussi demander à exécuter des fonctions ACS transfert de fichier par exemple
Le paramètre PAUSE(*YES ou *NO) vous affichera une fenêtre dos par exemple sur un .bat , mais ne change rien sur un exécutable windows (calc.exe, notepad.exe)

5 commandes qui manquent à l’ibmi

En utilisant l’IBM i, vous avez sans doute remarqué que des commandes manquent, voici une liste de commandes qui pourraient vous rendre service.

DSPDTAQ

Cette commande permet de voir le contenu d’une Dtaq , sans cette commande vous devez faire un dmpobj et le lire , Merci thierry pour le coup de main

WRKSAVF

Cette commande permet gérer les SAVFs de votre partition en voyant toutes les bibliothèques, un peu comme wrkjrnrcv allusr/all pour les recepteurs.
Attention les savf q* dans qgpl sont des PTFs.

CHGUSRPWD

Permet de changer le mot de passe d’un autre utilisateur sans être *secadm, l’objet doit être compiler en adoption de droit

CHGNETBIOS

Permet de changer le nom netbios celui qui est utilisé par net server, vous pouvez le voir dans navigator for i

INIUSRNET

Réinitialisation d’un profil réseau utilisé par Netserver pour les partages

Vous retrouverez les sources de ces outils sur github à l’adresse suivante :

https://github.com/Plberthoin/PLB/tree/master/GTOOLS

, , Utiliser un scripte SQL pour faire du FTP

On est souvent amené, à envoyer des fichiers soit par mail ou par FTP, voici une solution simple en utilisant SQL

— génération de la table à transférer
create table votrebib.votrefic as (select …) with data;
— conversion en CSV , paramétrage excel
CL: CPYTOIMPF FROMFILE(votrebib.votrefic)
TOSTMF(votrefic.csv)
STMFCCSID(PCASCII) RCDDLM(CRLF)
STRDLM(NONE) FLDDLM(‘;’) ADDCOLNAM(SQL) ;

— Envoi par mail

cl: SNDSMTPEMM RCP((‘plb@gaia.fr’))
SUBJECT(‘liste du fichier votrefic’)
NOTE(‘Ci-joint le fichier votrefic.csv’)
ATTACH((VOTREFIC.CSV));

— Envoi par ftp

CL: CRTPF FILE(votrebib/FTPSRC) RCDLEN(192) ;
INSERT INTO votrebib/QFTPSRC VALUES(‘User_FTP Mot_de_passe’) ;
INSERT INTO votrebib/QFTPSRC VALUES(‘put votrefic.csv’) ;
INSERT INTO votrebib/QFTPSRC VALUES(‘quit’) ;

–re routage stdin
cl: OVRDBF FILE(INPUT)
TOFILE(votrebib/QFTPSRC) +
OVRSCOPE(*JOB) ;
— lancement ftp
CL: FTP RMTSYS(VOTRE_SYSTEME);
— suppression du fichier de commande FTP
CL: DLTF FILE(votrebib/FTPSRC);

REMARQUE :

Vous pourrez améliorer ce scripte en utilisant un mot de passe que vous récupérez à l »exécution, pensez bien à supprimer le fichier scripte FTP même dans QTEMP.

Vous pouvez également demander la log, en re-routant le stdout

Si vous utilisez le mail , l’utilisateur doit être inscrit à smtp ,

, 5 choses à savoir sur les logs de votre IBMi

1) Choisir le mode de production

C’est essentiellement fixé par 2 valeurs système

La première valeur système est QLOGOUTPUT

*JOBEND L’historique du travail sera généré par le
travail lui-même. Si l’historique du travail
ne peut pas générer son propre historique du
travail, celui-ci sera généré par un serveur
d’historique du travail.

*JOBLOGSVR L’historique du travail sera généré par un
serveur d’historique du travail.

*JOBEND est la valeur historique, cette valeur est beaucoup moins performante sur les nouveaux

systèmes que *JOBLOGSVR.

Il est donc conseillé de mettre en place la valeur *JOBLOGSVR.

la deuxième valeur système est QJOBMSGQFL
*NOWRAP
La file d’attente de messages du travail ne fait pas
l’objet d’un bouclage.

*WRAP
La file d’attente de messages du travail fait l’objet
d’un bouclage.

*PRTWRAP
La file d’attente de messages du travail fait l’objet
d’un bouclage et les messages écrasés sont imprimés.

il est conseillé pour éviter d’avoir des messages bloquants de mettre *WRAP,
qui permettra d’avoir les dernières informations loguées.

2) Choisir le niveau de log adapté

C’est les paramètres LOG() LOGCLPGM() du travail .

ils sont fixés par JOBD ou par les paramètres de la commande SBMJOB .

On divise généralement en trois les types les travaux de votre IBM i

Les travaux sensibles qui devront à voir le niveau de log maximum

LOG(4 00 SECLVL) LOGCLPGM(YES)

Les travaux communs , batchs traditionnels sessions interactives

LOG(3 00 SECLVL) LOGCLPGM(NO)

Les travaux qui ne doivent pas avoir de log , pour des questions de sécurité, ou des travaux trop nombreux et souvent très courts

LOG(0 99 NOLIST) LOGCLPGM(NO)

le niveau peut être ajusté par programme, CHGJOB LOG( ) LOGCLPGM( )

3) Choix du mode d’épuration

La meilleur solution est d’utiliser le cleanup standard de la machine.

Vous pouvez voir les paramètres par la commande ==> go cleanup

par l’option 1 vous voyez le paramétrage
si le ménage est possible, l’heure de démarrage et la durée .
Le plus souvent on est reglé à 30 jours

Pour démarrer le ménage c’est la commande STRCLNUP , il est conseillé de la mettre dans le programme STRUP de votre partition.

Les spools de log sont placés dans l’outq QEZJOBLOG, vous pouvez éventuellement épurer des spools particuliers, le mieux étant de ne pas les produire.

4) Nouveautés de SQL AS A service

Il y a plusieurs vues, et fonction table qui peuvent, vous aidez, voici les 2 principales :

La fonction table QSYS2.JOBLOG_INFO() permet de voir le contenu d’une joblog.

Exemple :

SELECT * FROM TABLE(QSYS2.JOBLOG_INFO(‘378809/QUSER/QZDASOINIT’)) A

pour voir la log du job identifié

La vue QSYS2.OUTPUT_QUEUE_ENTRIES permet de voir la liste des spools d’une OUTQ.

Exemple

select * from QSYS2.OUTPUT_QUEUE_ENTRIES where OUTPUT_QUEUE_NAME = ‘QEZJOBLOG’

pour voir les spools de l’outq des joblogs

5) Remarques générales

Il est souvent inutile de sauvegarder des spools de log , sauf à avoir une réel raison et un moyen de suivi.

Un surveillance quotidienne est plus efficace qu’une recherche hypothétique dans un spool de 10 mois

Attention, un spool qui reste est une place de travail occupé dans la table des travaux.

Vous pouvez décoreller les spools des travaux mais ce n’est pas culturel et ça peut compliquer vos recherches futurs.

Attention au programme en mode debug avec du SQL, l’optimiseur rempliera rapidement la log.

L’ILE produit plus de log que l’OPM, c’est normale vous avez un niveau de plus à gérer, ca peut doubler les lignes écrites !!!

Pour avoir une vue de des spools de log, pensez à la commande, WRKJOBLOG

Un travail n’a pas forcément de log , la seule qu’il laisse dans tous les cas c’est un message CPF1124 pour son démarrage et un message CPF1164 pour indiquer sa fin.

5 opérations à prévoir pour renommer une partition IBMi

Si vous voulez changer le nom de votre partition , attention il y a plusieurs noms à changer

1) Les attributs réseaux

Attention, on parle ici plutôt du réseau SNA, c’est le nom que vous avez sur la mire d’ouverture 5250.
Même si SNA est de moins en moins utilisé, le système l’utilise toujours.
Vous pouvez voir cette information par la commande DSPNETA et l’extraire dans un programme CLLE par l’autre commande RTVNETA.
C’est la commande CHGNETA qui permet de modifier
Exemple :

CHGNETA SYSNAME(VOTRESYS)
Pour que la modification soit prise en compte vous devez faire un IPL.


Vous devez ensuite modifier les inscriptions dans la directory SNA, vous pouvez les voir par la commande WRKDIRE. on ne peut pas changer l’identification SNA, vous devrez faire un ADDDIRE, et un RMVDIRE.
Vous pouvez avoir la liste des inscriptions par la table QAOKP01A .

Exemple :

SELECT WOS1DDEN As Id_utilisateur, WOS1DDGN as adresse , WOS1USRP
as Profil_util FROM QAOKP01A

2) Le nom de la base de données

Ce nom est utilisé par SQL, vous le voyez quand vous faites un connect (parfois implicite).
Si vous faites un STRSQL , vous avez ce message , Connexion en cours : base de données relationnelle

NEPTUNE.
Pour voir les bases de données définies vous avez la commande WRKRDBDIRE, vous avez une seule Base de données locale.
Vous pouvez voir la liste des bd par la table SQL QADBXRDBD

Exemple :

SELECT DBXRDBN nom_db
FROM QADBXRDBD
where DBXRMTN = ‘*LOCAL’

remarque :


Pour changer le nom de votre BD, vous devez la supprimer et la recréer ADDRDBDIRE et RMVRDBDIRE.
attention sur la commande vous aurez un message (CPA3E01), à ignorer en répondant ‘G’ et il faut également reprendre les attributs de sécurité existants
Vous devrez arrêter le service base de données pour que cela soit pris en compte

3) Le nom TCP/IP

C’est le nom utilisé par le réseau TCPIP , pour voir ces attributs, vous devez utiliser Navigator

for i, vous pouvez le voir également par la vue QSYS2.TCPIP_INFO
exemple :
SELECT substr(LOCAL_HOST_NAME, 1, (locate(‘.’, LOCAL_HOST_NAME)-1) )
FROM QSYS2.TCPIP_INFO

Pour le modifier c’est la commande CHGTCPDMN vous allez également indiquer un nom de domaine,

exemple: CHGTCPDMN HOSTNAME(‘votrenom’) …

Vous devrez arrêter TCPIP que cela soit pris en compte

remarque :

Ce nom peut être important pour certaines applications externes, surtout si vous mettez en place du SSO par exemple, le nom doit matcher avec celui qui est publié dans votre DNS

4) Le nom NETBIOS

C’est le nom utilisé par netserver , vous pouvez le voir par navigator for i dans les propriétés de navigator for i

pour le modifier vous devez utiliser par l’interface Navigator for i ou par l’api QZLSCHSN.
exemple CALL QZLSCHSN PARM(‘nom_server’ ‘window’ ‘Description’ ‘ ‘)
pour que la modification soit prise en compte vous devez arreter et redemarrer Netserver

remarque :

Attention, si vous avez deux machines avec le même nom sur votre réseau, seule la première pourra démarrer Netserver

5) Sur La HMC


Vous devez ouvrir votre HMC
Dans les propriétés de la partition vous pouvez changer le nom
Il existe des commandes ssh pour connaitre un nom de partition , voir même le changer , mais c’est un peu plus compliquer à automatiser.

Conseils :

Si vous faites une bascule de machine attention à n’avoir qu’une inscription dans votre DNS.
il est conseillé de mettre le même nom partout attention 8 caractères maximum, sinon vous devez avoir un transposition facile à faire.
Le plus simple et de faire les modifications et un IPL dans la foulée pour tout mettre tout à jour

, Journalisation Bibliothèque STRJRNLIB

Jusqu’en version 7.3, on utilisait une dtaara QFDTJRN qui indiquait comment journaliser les objets de la bibliothèque.

En version 7.4, les informations de journalisation sont inclues dans la description de la bibliothèque et la dtaara QDFTJRN n’est plus utilisée.

Il n’y aura pas d’erreur , juste les nouveaux fichiers ne seront pas journalisés , ce qui peut générer des problèmes plus tard ….

On peut les voir par la commande
==>DSPLIBD votre_bib puis <F10> Affichage des règles d’héritage

Vous avez une ligne par type d’objets, *FILE, *DTAARA, *DTAQ

Pour les mettre en place, on peut utiliser les commandes suivante
STRJRNLIB démarrer la journalisation
ENDJRNLIB arrêter la journalisation
CHGJRNOBJ *LIB modifier les attributs de journalisation

Exemple :

STRJRNLIB LIB(VOTREBIB)
JRN(VOTREBIB/VOTREJRN)
INHRULES((*FILE *ALLOPR *INCLUDE *BOTH *OPNCLO))

Ici les fichiers seront journalisés, pour toutes les opérations et on gardera l’image avant et après …

Si vous créer une bibliothèque par un create collection en SQL, vous aurez les valeurs suivantes

*FILE *CREATE *INCLUDE *BOTH *OPNCLO

Donc quand vous migrez vers la version 7.4, vous devrez migrer les informations de la dtaara QDFTJRN, vers la description de la bibliothèque.

Si vous êtes en V7R3, vous pouvez anticiper et déjà mettre en oeuvre les règles d’héritage.

Remarque :

Vous pouvez changer les règles d’héritage existantes par la commande
CHGJRNOBJ.

Ces informations ne concerne pas les fichiers journalisés avant la commande STRJRNLIB

Voici un lien ou vous trouverez un outil qui permet de migrer d’une manière à l’autre indispensable si vous passez en V7R4.

https://github.com/Plberthoin/PLB/tree/master/MGRJRNLIB

Superviser QSYSOPR simplement avec un watch !

Il existe beaucoup de techniques pour superviser des files d’attente

La première consiste à faire boucler un robot qui lira les messages par la commande RCVMSG

La deuxième consiste à utiliser une vue SQL AS SERVICE, QSYS2.MESSAGE_QUEUE_INFO en allant boucler dessus

il en existe d’autres avec des API etc…

J’ai choisi de vous présenter une technique un peu moins connu mais très efficace et très facile à mettre en oeuvre, les Watches.

Un watch c’est un peu comme un trigger ou un programme d’exit, on va associer un programme qui se déclenchera sur un événement , ici un message nécessitant une réponse dans la file QSYSOPR.

Vous pouvez voir les sessions de watch actives par la commande
==>WRKWCH WCH(*STRWCH)

Pour démarrer une session c’est la commande STRWCH

dans notre cas on indiquera les paramètres suivants

STRWCH SSNID(ANAWCH)
WCHPGM(ANAWCH)
CALLWCHPGM(WCHEVT) WCHMSG((ALL *NONE *MSGDTA *INQ *GE 00))
WCHMSGQ((QSYS/QSYSOPR))

Ce qui veut dire quand on a un message avec réponse dans qsysopr lance le programme ANAWCH (attention il devra être en ligne dans la LIBL)

Voici le programme ANAWCH

PGM PARM(&WCHOPTION &SESSIONID &ERROR &EVTDATA)
/—————————————————————–/
/* Ce programme est un watch il avertit quand on a un message dans */

/ *QSYSOPR en attente de réponse , il envoit un mail / /—————————————————————–

/*/ Paramètres recu */

DCL VAR(&WCHOPTION) TYPE(CHAR) LEN(10)
DCL VAR(&SESSIONID) TYPE(CHAR) LEN(10) DCL VAR(&ERROR) TYPE(CHAR) LEN(10)
DCL VAR(&EVTDATA) TYPE(CHAR) LEN(1024) / Variables de travail / DCL VAR(&MSG) TYPE(CHAR) LEN(173)
DCL VAR(&EMAIL) TYPE(CHAR) LEN(50) value(‘votre@email.fr’)

/*découpage de EVTDATA */

DCL VAR(&MSGID) TYPE(CHAR) STG(DEFINED) LEN(7) + DEFVAR(&EVTDATA 5) DCL VAR(&MSGQ) TYPE(CHAR) STG(DEFINED) LEN(10) + DEFVAR(&EVTDATA 13)

DCL VAR(&MSGQLIB) TYPE(CHAR) STG(DEFINED) + LEN(10) DEFVAR(&EVTDATA 23)

DCL VAR(&MSGKEY) TYPE(CHAR) STG(DEFINED) + LEN(4) DEFVAR(&EVTDATA 387)

ADDLIBLE votrebib

MONMSG CPF0000

/ *Lecture du texte du message */

RCVMSG MSGQ(&MSGQLIB/&MSGQ) MSGKEY(&MSGKEY) + RMV(NO) MSG(&MSG)
/* Envoi d’un mail d’alerte */
SNDSMTPEMM RCP((&mail)) SUBJECT(‘Message avec +
réponse dans qsysopr’) NOTE(&MSG)
CHGVAR VAR(&ERROR) VALUE(‘ ‘)
ENDPGM

Il reçoit 4 paramètres , le plus intéressant est &EVTDATA qui contient la clé du message que vous pourrez alors lire par RCVMSG ça suffit

Pour arrêter la supervision par votre watch c’est la commande


==>ENDWCH SSNID(ANAWCH)

Remarque :


Il est préférable que le programme soit compiler en adoption de droit avec comme propriétaire qsecofr

Si vous envoyez un mail, votre utilisateur doit être inscrit sinon soumettez cette envoi avec un user qui l’est

On pourrait très bien répondre au message par la commande SNDRPY, sur certain messages connus

Comment connaitre les tables ou PF Supprimés ?

Sur L’ibmi on a du mal à matérialiser la base de données

Pourtant en gros, elle a un catalogue c’est les fichiers QADB de QSYS…

Les fichiers SYS* de QSYS2 pointent dessus

On peut les voir par exemple

SELECT *
FROM SYSTABLESTAT where
TABLE_SCHEMA = ‘QSYS’ and TABLE_NAME
like(‘QADB%’)

Ses fichiers sont journalisés sur des journaux qui sont dans QRECOVERY

Les 2 principaux sont :

QDBJRNCOLM qui va contenir les modifications de zones
QDBJRNFILE qui va contenir les modifications de fichiers

Voici comment analyser pour connaitre les fichiers PF ou tables supprimés dans la journée.

Vous devez générer un table à partir de votre journal

DSPJRN JRN(QRECOVERY/QDBJRNFILE)
FROMTIME(votre_date 000001)
OUTPUT(*OUTFILE)
OUTFILE(QTEMP/LISTE1)

Vous devez effectuer cette requête sur le fichier que vous avez généré

SELECT JODATE, JOTIME, substr(joesd, 1, 10) as fichier ,
substr(joesd, 11, 10) as biblio ,
substr(joesd, 31, 10) as User ,
substr(joesd, 91, 2) as type ,
joesd
FROM qtemp/liste1
WHERE JOCODE = ‘R’ and JOENTT = ‘DL’
and substr(joesd, 91, 2) = ‘TB’

Conclusion :

On ne peut pas agir sur les fichiers du catalogue, c’est le système qui les gérent, les seules commandes qui permettent d’inter agir sur le catalogue sont

==>RCLDBXREF
==>QSYS/RCLSTG SELECT(*DBXREF)

Par exemple, dans le cas ou vous commencez à avoir des messages sur la base de données , ou un nombre très important d’enregistrements supprimés dans les fichiers du catalogue …

, 5 conseils pour utiliser CPYTOIMPF efficacement

Vous conaissez tous la commande CPYTOIMPF qui va vous permettre de générer un fichier d’exportation , que vous pourrez fournir à un partenaire .

Voici quelques informations complémentaires qui pourront vous aidez

1) C’est un moyen simple de centraliser sur L’ibmi des conversions de fichier base de données vers du CSV ou du EXCEL.

Ça vous évitera les .TTO dispatchés partout sur vos environnements windows et difficiles à maintenir.
L’utilisateurs retrouvera ses fichiers dans l’IFS, les bonnes pratiques poussent vers le répertoire /home/votreuser/
L’utilisateur pourra également se faire envoyer son fichier par mail, la commande IBMi native SNDSMTPEMM permettant de joindre une pièce jointe.
Si vous utiliser un outil complémentaire vous pouvez même faire des envois FTP vers des serveurs annexes.

2) Gestion du CCSID

Vous allez avoir à gérer celui du fichier source est celui du fichier cible

Pour le fichier source, il est conseillé si ce n’est pas le cas de forcer un ccsid

Par La commande en début de programme
CHGJOB CCSID(1147) ou 297 pour la France, vous éviterez ainsi les problèmes d’extractions intermédiaires.

L’ennemi c’est le CCSID(65535) qui d’ailleurs va vous poser de plus en plus de problèmes notamment avec les produits Open source.

Pour le fichier cible il vous suffit d’indiquer le paramètre STMFCCSID(*PCASCII) ou 1252 qui est le CCSID de windows par défaut, sur la commande CPYTOIMPF.

Oui on pourrait faire de l’unicode …

3) CSV ou XLS

il y a peu de différence entre un CSV et un XLS que sait produire votre IBMi.

La vérité, elle se joue quand votre utilisateur double clique sur le fichier et qu’il ne s’ouvre pas directement par excel.

voici les paramètres pour un CSV
CPYTOIMPF
TOSTMF(‘xxxx.csv’) +
RCDDLM(CRLF) STRDLM(NONE)
FLDDLM(‘;’)

le fichier s’ouvrira directement dans EXCEL

voici les paramètres pour un EXCEL
CPYTOIMPF
TOSTMF(‘xxxx.XLS’)
RCDDLM(CRLF) STRDLM(NONE)
FLDDLM(‘*TAB’)

Vous pouvez avoir malgrè tout un message à l’ouverture, mais aucune manipulation à faire .

4) Tri du fichier

Vous avez un paramètre qui va vous permettre de trier votre fichier comme un order by SQL

c’est le paramètre ORDERBY , exemple ORDERBY(‘Datecreat desc’) qui criera par ordre de création

5) entête de colonne

Si vous désirez un entête de colonne

le meilleur compromis c’est de mettre le paramètre ADDCOLNAM(*SQL)

Si vous avez un nom long SQL provennant de votre table

vous aurez ceci

;nom_utilisateur;prenom_utilisateur;dat_naissance
;Berthoin;Pierre-Louis;28-08-1964

Vous aurez ceci

Si vous avez un PF

;nomuti;preuti;datnai
;Berthoin;Pierre-Louis;28-08-1964

il y a toujours la solution de passer par une requête intermédiaire sur les zones vous pourrez indiquer la clause AS .

Par exemple

select numcli as ‘Numero_client’ ….

Conclusion:

La commande CPYTOIMPF est une commande simple pour convertir vos fichiers Base de données.
Elle vous permet de garder la main , un batch de nuit peut générer des extractions, les utilisateurs n’ont pas besoin d’ ODBC , ni de droit sur le fichier d’origine.