, , , , Utiliser ACS pour produire des fichiers Excel depuis l’IBM i

Access Client Solutions (ACS)

Pour rappel, ACS est le successeur de Client Access et permet toujours les exports de données.

ACS est également un produit entièrement Java, et utilisable en mode ligne de commande.

Il est donc possible de le piloter sur l’IBM i. Pour cela il vous faut :

  • Avoir le produit sous licence 5770JV1 (Java) version 8 ou supérieur
  • Access Client Solutions sur l’IFS (désormais installé via PTF (7.4: SI71900 / 7.3: SI71934 / 7.2: SI71935) dans /QIBM/ProdData/Access/ACS/Base

Exemples

Il est alors possible de provoquer le transfert de données de deux façons :

  • le fichier complet
  • une requête SQL permettant la sélection, transformation, jointure …

Syntaxe :

/PLUGIN=cldownload /system=<system>
                          [/userid=<userid>]
                          {/hostfile=<library/filename> | /sql="statement"}
                          {/clientfile=<path><filename>.<extension> | /display}
                          [/<options>]

    /userid     - user id to use when connecting to the target system
    /hostfile   - Source library and file on the IBM i system for the download
                  e.g. /hostfile=QIWS/QCUSTCDT
    /sql        - specify an SQL statement
                  e.g. /sql="select CUSNUM,LSTNAM,INIT,ZIPCOD from QIWS/QCUSTCDT"
    /clientfile - Target file location for the download.
                  The format of this file will be determined by the specified
                  extension (for example, .csv .ods .xlsx .xlsx)
                  If the file extension is not specified or is of a type
                  not supported, the data will be formatted as a .csv file
    /display    - write the output to the terminal
    
    Valid options are:
       /colheadings=<1/0> - Include column headings as the first row. When specified, the column names will be the heading.
       /usecollabels      - Use column labels for the heading.

Puisque ACS est directement sur votre IBM i, on peut utiliser localhost pour la valeur /system. Cela permet également la portabilité de la commande d’une machine à l’autre.

Pour transférer tout un fichier on utilisera le paramètre /hostfile. Ici sous QSH :

cd /QIBM/ProdData/Access/ACS/Base

java -jar acsbundle.jar
/PLUGIN=cldownload /system=localhost
/hostfile=sqlsample/employee
/clientfile=/home/nb/export/employe.xlsx

Cela produit :

Remarquer le nom de l’onglet.

Pour transférer par une requête SQL :

cd /QIBM/ProdData/Access/ACS/Base

java -jar acsbundle.jar
/PLUGIN=cldownload /system=localhost
/sql="select trim(firstnme) concat ' ' concat trim(lastname), hiredate, current date - hiredate as \"Ancienneté\" from sqlsample.employee" /clientfile=/home/nb/export/employesql.xlsx

Attention à l’échappement des caractères spéciaux …

On obtient :

Des options supplémentaires vous permettent d’affiner la sortie :

  • /colheadings=<1/0> – Inclure ou non l’entête
  • /usecollabels – Utiliser les labels au lieu des noms de colonne

Ces fonctions nécessitent une version de ACS > 1.1.8.6 pour fonctionner correctement.

Comment automatiser ?

Il est relativement simple d’intégrer cette commande Java dans un programme CL. Ici en utilisant /clientfile.

Par exemple avec RUNJVA :

Ou par QSH :

Ici on a paramétré plus d’éléments pour avoir une base de programme plus générique.

Avantages ?

Access Client Solutions permet facilement d’automatiser vos conversions depuis l’IBM i, et non depuis un poste client. Cela rend beaucoup plus naturel l’intégration de ces traitements dans vos chaines, la maitrise des transferts par l’IT et non par les utilisateurs, la maitrise des flux, des versions de produits utilisées etc …

, Création d’un référentiel de vos sources

Cette astuce ne remplace pas un outil du marché qui vous offrira beaucoup plus d’opportunités, en terme d’analyses et d’interactions avec d’autres outils de développements de la plateforme IBM i.

Mais il est possible que vous n’ayez pas la chance de posséder un de ces outils, et voici une méthode qui va vous permettre basiquement de trouver ou est utilisée une zone par exemple si vous désirez changer ses attributs.

La méthode utilisée dans notre cas consiste à créer un fichier avec l’intégralité de vos lignes sources, que vous pouvez faire générer chaque nuit par exemple

Pour cela il va falloir d’abord faire liste des membres sources de votre machine

Creation de la table pour votre liste

CREATE TABLE LSTMBRsrc (
LIB CHAR(10) CCSID 297 NOT NULL ,
FILE CHAR(10) CCSID 297 NOT NULL ,
MBR CHAR(10) CCSID 297 NOT NULL ,
TYP CHAR(10) CCSID 297 DEFAULT NULL )

Remplissage de la table, vous pouvez affiner en éliminant des bibliothèques inutilisées.

ici on utilise le fichier de référence du système SYSPARTITIONSTAT en SQL une partition = un membre

insert into lstmbrsrc
SELECT
substr(TABLE_SCHEMA, 1, 10) as lib,
substr(TABLE_NAME, 1, 10) as file,
substr(TABLE_PARTITION, 1, 10) as mbr,
source_type
FROM SYSPARTITIONSTAT WHERE substr(TABLE_SCHEMA, 1, 1) <>  »Q » and +
not source_type isnull and NUMBER_ROWS > 0′)

Création de la table résultat

qui aura les informations du sources (srcdta, srcseq, srcdta et du fichier srclib, srcfil, srcmbr, srctyp) , vous pouvez ajouter d’autre zones sur les dates par exemple .

CREATE TABLE LSTSRC (
SRCLIB CHAR(10) CCSID 1147 NOT NULL DEFAULT  » ,
SRCFIL CHAR(10) CCSID 1147 NOT NULL DEFAULT  » ,
SRCMBR CHAR(10) CCSID 1147 NOT NULL DEFAULT  » ,
SRCTYP CHAR(10) CCSID 1147 NOT NULL DEFAULT  » ,
SRCSEQ NUMERIC(6, 2) NOT NULL DEFAULT 0 ,
SRCDTA CHAR(100) CCSID 1147 NOT NULL DEFAULT  » ,
SRCDAT NUMERIC(6, 0) NOT NULL DEFAULT 0 )

Maintenant, il faut la remplir en lisant le fichiers des membres

Voici en clp un exemple de code, à faire pour chaque membre

Création de l’alias (nécessaire à SQL pour accéder aux données d’un membre)

CHGVAR &REQUETE ( +
‘CREATE ALIAS QTEMP/WLSTMBR FOR’ *BCAT &LIB *TCAT ‘/’ *TCAT &FILE +
*BCAT ‘(‘ *TCAT &MBR *TCAT ‘)’)
RUNSQL SQL(&REQUETE) COMMIT(*NONE)
monmsg sql0000

Remplissage du fichier avec les informations du membre

CHGVAR &REQUETE +
(‘INSERT INTO LSTSRC SELECT  »’ *TCAT &LIB *TCAT  »’ ,  »’ *TCAT +
&FILe *TCAT  »’ ,  »’ *TCAT +
&MBR *TCAT  »’ ,  »’ *TCAT +
&typ *TCAT  »’ , ‘ BCAT + ‘SRCSEQ , SRCDTA , SRCDAT FROM WLSTMBR’) RUNSQL SQL(&REQUETE) COMMIT(NONE)
monmsg sql0000

Suppression de l’alias

CHGVAR &REQUETE ( +
‘DROP ALIAS QTEMP/WLSTMBR’)
RUNSQL SQL(&REQUETE) COMMIT(*NONE)
monmsg sql0000

Ce traitement est un peu long , il est fréquent d’avoir plusieurs millions d’enregistrements dans votre fichier résultat, attention donc aussi à la place disponible sur votre partition !

Maintenant vous pouvez rechercher une chaine de caractère dans votre fichier exemple un NOM de ZONE.

Dans notre exemple recherche *LDA en majuscule ou minuscule avec création d’un fichier source ici LISTE

create table QTEMP/LISTE as (
SELECT * FROM
lstsrc
WHERE SRCDTA like(‘%*LDA%’)
) with data

Conclusion :

Pensez à faire du ménage dans tout les sources qui ne servent plus.
Si vous n’avez pas les sources vous ne pouvez rien faire mais c’est vrai dans tous les cas.
En cas d’analyse d’impacts vous devrez croiser avec une analyse sur les objets , exemple sortie de dsppgmref
Si vous devez faire de gros changements à effectuer, il est opportun de s’équiper d’un produit qui fera tout ca pour vous .
En attendant d’avoir tout dans l’IFS et de pouvoir tout mettre sous GIT … , c’est le monde d’après .

Editer du RPGLE avec Visual Studio Code

Voici une autre solution pour éditer vos codes sources RPGLE

Vous connaissez RDI basé sur Eclipse et ILEditor

Voici une troisième alternative pour les gens réfractaires à SEU !

Ce n’est pas une alternative complète, puisqu’on ne pourra que manipuler des sources de L’IFS sans compilations et autres opérations sur le système.

C’est Visual Studio Code que vous pouvez télécharger gratuitement à cette url https://visualstudio.microsoft.com/fr/ , il est intéressant pour gens qui code sur d’autre langages C#, .NET etc …

Comme Eclipse vous allez pouvoir choisir des extensions (on parle plutôt de plugin sur Eclipse), il en existe 3 principales pour éditer du RPG sur IBMi .

Voici les principaux contributeurs merci à eux

Niels Liisberg
Steve Richter, il a fait également un éditeur pour SQL
Barrett Otte

Nos équipes ont choisi celui de Barrett Otte parce qu’il fait également le CLLE et qu’il fonctionne bien.

Anand Kekhale a fait fait un gros travail (SSH FS) pour que vous puissiez accéder à votre ifs, vous pouvez charger ici

https://www.anandk.dev/2020/11/VSCode-IBMi-AS400.html

Conclusion:

Ce n’est pas la solution miracle mais pour les utilisateurs multi-techno qui font de la maintenance occasionnelle, ca peut permettre d’avoir un seul IDE

Son point fort c’est l’interfacage avec GIT qui permet de créer des repositories à la volée !

Un autre lien utile pour en savoir plus

https://en.wikipedia.org/wiki/Visual_Studio_Code

, , Exécuter une action sur une liste SQL service

Vous avez tous compris qu’une grande partie de l’administration de vos IBMi se fera par SQL service.

Pour faire des contrôles, l’accès aux vues est suffisante.

Par exemple, le contrôle du nombre de pages dans une OUTQ :

SELECT sum(TOTAL_PAGES)
FROM QSYS2.OUTPUT_QUEUE_ENTRIES_BASIC
where OUTPUT_QUEUE_LIBRARY_NAME = ‘SRCEXPL’ and OUTPUT_QUEUE_NAME = ‘VOTREOUTQ’

Mais pour agir c’est plus compliqué, dans certains cas il existe des procédures pour les DTAQ par exemple.

Mais la plus part du temps, vous devrez passer par une commande système dans ce cas en SQL ; vous pouvez utiliser la procédure cataloguée QCMDEXC.

Elle fonctionne comme l’api du même nom.

Exemple :

Pour épurer l’OUTQ QEZJOBLOG

Call qcmdexc(‘CLROUTQ QEZJOBLOG’)

Mais comment faire pour agir sur une liste sans faire un programme ou une procédure qui lirait un curseur ?

L’astuce est d’utiliser un For et dans le select de générer directement la commande à exécuter

Voici un exemple de script qui déplace les spools des OUTQs, commençant par ACT en mettant en référence utilisateur l’OUTQ d’origine.

les zones SPOOLNAME, JOBNAME, FILENUM, OUTQ_QUEUE_NAME proviennent de la vue.

begin
for
SELECT ‘ chgsplfa FILE(‘ concat SPOOLNAME concat ‘) JOB(‘ concat JOB_NAME concat ‘) SPLNBR(‘ concat char(FILENUM) concat ‘) outq(Votreoutq) save(*yes) usrdta( »’ concat OUTPUT_QUEUE_NAME concat  »’)’ as chgspl
FROM QSYS2.OUTPUT_QUEUE_ENTRIES_BASIC
where OUTPUT_QUEUE_LIBRARY_NAME = ‘Votrelib’ and OUTPUT_QUEUE_NAME like(‘ACT%’)
do
call qcmdexc(CHGSPL);
end for;
end

Conclusions :

Cette solution est souvent utilisée par exemple avec la fonction table OBJECT_STATISTICS.

Exemple :

pour faire la liste des fichiers SAVF

SELECT objname, objlib, ifnull(objtext, ‘ ‘) as objtext
FROM TABLE (QSYS2.OBJECT_STATISTICS(‘ALL’,’FILE’) ) AS X
WHERE OBJATTRIBUTE = ‘SAVF’

La seule limite est qu’il est un peu plus compliqué pour gérer les erreurs sur le qcmdexc …

Bien sûr pour la bible rendez vous sur la page de Scott Forstie

, 5 choses à connaitre sur la notion de membre

1) Qu’est ce qu’un membre ?
Un membre est une notion purement IBM i, il sert à cloisonner les données dans un fichier, l’usage le plus connu c’est les fichiers sources où chaque objet est défini dans un membre.
mais on peut également utiliser cette notion pour des fichiers de données , exemple un fichier client avec un membre par régions pour cloisonner les informations.

Pour choisir le membre, on utilisait la commande ovrdbf
OVRDBF FILE(VOTREFIC) MBR(VOTREMEMBRE) quand vous aviez fini, vous faisiez un DLTOVR

Attention un LF peut pointer sur les données de pluseiurs membre du PF, c’est même la valeur par défaut de la commande,
CRTLF … DTAMBRS(*ALL)

2) Pourquoi utiliser la commande DSPPFM
Parce que c’est la seule commande qui montre les données brutes dans l’ordre réel, en effet SQL pourra faire des modifications de présentation, voire indiquer des erreurs de lectures.
Les touches de fonction F10 et F11 permettent de voir les données en hexadécimal.

3) Pourquoi réorganiser les membres des fichiers.
Quand on supprime un enregistrement dans un fichier donc dans un membre, cet enregistrement est juste tagué comme étant inutilisable.
il y a 2 cas:

  • en DDS, les fichiers sont créés avec le paramètre par défaut reusedlt(no) => un nouvel enregistrement est ajouté à la fin.
  • en SQL, les fichiers sont créés avec le paramètre par défaut reusedlt(yes) => un nouvel enregistrement est ajouté sur la place d’un enregistrement supprimé.

En SQL, on a donc besoin de moins de RGZPFM et surtout, si on a sensiblement le même nombre de créations et de suppressions.

4) Executer une requête sql sur un membre d’un fichier physique

Par défaut SQL s’exécute sur le premier membre crée en effet, il considère qu’il n’y a qu’un membre,
en effet un create table ne permet qu’un membre.

Si vous voulez lire un membre particulier sur un fichier physique multi-membres par SQL, vous devez faire un create alias
exemple :
CREATE ALIAS BIBLIO/NOMALIAS FOR BIBLIO/FICHIER (NOMMEMBRE)

vous utilisez désormais votre alias comme un fichier ou une vue

Select * from BIBLIO/NOMALIAS

Vous pouvez supprimer votre alias
DROP ALIAS BIBLIO/NOMALIAS

5) Avoir des informations sur les membres
il y a 2 solutions, de manière historique en lançant la commande dspfd … TYPE(*MBRLIST)
ou avoir des informations par SQL (on parle de partition …)
Vous avez une vue dans qsys2 qui s’appelle SYSPARTITIONSTAT et qui permet de voir ces informations.

Conclusion :
Utiliser les membres n’est pas le sens de l’histoire
En SQL on utilise des fichiers mono-membre
Pour les sources préférer L’IFS qui vous permettra d’utiliser des outils comme GIT
Mais il serait étonnant que vous n’en rencontriez pas, il faut donc comprendre comment ça marche.

, Comparer le niveau de ptf entre 2 systèmes IBMi

Pour comparer les niveaux de PTF de 2 partitions, vous pouvez utiliser ARE (logiciel 5733ARE).
Mais vous allez devoir l’installer et le paramétrer.

Mais si vous ne l’avez pas installé vous pouvez utiliser Navigator for i.

L’instance admin de htpp doit être démarrée sur votre partition, voici comment faire :

vous devez vous connecter avec un profil qui est *iosyscfg au minimum.

à l’url http://votresys:2004

Une fois connecté vous devez définir vos systèmes distants ou groupe de systèmes.

Après vous allez utiliser l’interface graphique

en choisissant le système à contrôler

il est conseillé de ne pas appliquer mais de faire un IPL sur le système cible.

Vous pouvez choisir les produits

si vous êtes à jour vous obtenez cela

Rappel

Pour envoyer un groupe de PTF sur un système distant vous devez envoyer la description de la PTF, mais aussi les SAVF nécessaires.

, ACS sous Chromebook

Vous nous avez demandé plusieurs fois, si on pouvait installer et faire fonctionner ACS sur un Chromebook.

Donc nous avons fait une RFE chez IBM qui a été refusée .

Nous avons donc décider de faire un test par nous même :

Prérequis avoir un Chromebook à jour avec un processeur x86 en 64 bits

Installer Linux, vous pouvez laisser tout les paramètres par défaut
Après l’installation, lancer l’explorateur de fichier
Aller dans l’onglet ‘Linux fichiers’
Vous devez y extraire le fichier ZIP d’ACS
Vous devez maintenant installer Java
Par exemple ‘sudo apt install openjdk-11-jre’
Aller dans Linux_Application (‘cd Linux_Application’)
Exécuter la commande : ‘./install_acs_64’
Suivre le processus classique de setup (sélectionner les options nécessaires)
Une fois l’installation terminée, quitter le terminal
Chercher IBM dans les applications
Si il est présent, tout est bon
Sinon redémarrer le ChromeBook

Ca peux paraitre compliqué comme ca, mais c’est relativement simple en réalité et ça prend moins d’une heure.

Nous avons donc testé pendant une demi-journée le travail sur ce terminal.

Voici ce qu’on a constaté


Le lancement est un peu long
Pas de touche Fx sur le clavier vous devrez les mettre en incrusté dans votre session
Pas de clic droit
Des comportements d’affichage assez particuliers en cas de perte de focus.


Ma ca reste tout à fait utilisable.

Conclusion :


Ca fonctionne et sur un poste pour une utilisation occasionnelle c’est tout à fait acceptable

Merci à Clément pour ces tests.

, , Comment administrer vos sessions NODEJS

Rappel

Nodejs est disponible en open source sur l’IBMi, vous pouvez l’installer à partir de l’option de ACS :
Outils / Gestion des modules open source

Pour savoir si le produit est installé sur votre machine vous devez taper :
/QOpenSys/pkgs/bin/node -v
Si NODEJS est installé vous aurez la version installée qui s’affiche

Pour lancer une session nodejs, vous devez indiquer l’adresse ip et le port d’écoute
webserver.listen(port, ip)

L’astuce qui va vous simplifier la vie c’est de passer le port en paramètre, ce qui vous permettra de lancer plusieurs sessions du même script.

Pour lancer votre session Nodejs avec votre script vous devez passer la commande suivante :

/QOpenSys/pkgs/bin/node votrescripte.js votreport

Pour réaliser ceci, un script Nodejs reçoit un tableau d’argument
0 = node
1 = votre script
2 = premier paramètre dans votre cas le port

Pour le récupérer dans votre script vous devez indiquer

port = process.argv[2] ;

Vous pouvez lancer autant de scripts que vous le voulez en gérant le port à chaque lancement !

Quand vous soumettez une session nodejs, il lance plusieurs travaux

NODE2999 QSECOFR BATCH ACTIF
QP0ZSPWT QSECOFR BATCHI ACTIF
QZSHSH QSECOFR BATCHI ACTIF

Le plus simple serait donc de tout isoler dans un sous système pour gérer, les sessions, le démarrage et l’arrêt de l’environnement

Nous avons réalisé une console qui permet de gérer tous ces aspects, vous pouvez trouver le source de cette console à l’adresse suivante :

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

Avec SQL Service vous pouvez administrer ces sessions

SELECT
* FROM TABLE(QSYS2.ACTIVE_JOB_INFO( JOB_NAME_FILTER => ‘xxx*’,
SUBSYSTEM_LIST_FILTER => ‘yyy’)) X
where job_type = ‘SBS’

xxx racine des travaux soumis

yyy sous-système de votre environnement

Ci dessous quelques site web qui peuvent vous aider .

https://www.ibm.com/developerworks/ibmi/library/i-running-node-js-web-app-trs/index.html

https://www.ibm.com/support/pages/node/1127733

https://developer.ibm.com/components/ibm-i/articles/i-native-js-app-ibmi-with-nodejs/

, , , IDE IBMi , une alternative à RDI

Vous n’avez pas forcément le budget pour acheter RDI , mais vous voudriez éditer vos sources avec un outil un peu plus FUN que SEU.

Voici un produit qui peut vous permettre de réaliser vos modifciations.

Il sagit de ILEditor qui est un produit open source et que vous pouvez télécharger ici :

https://worksofbarry.com/ileditor/#cta

Nos tests

L’installation est très simple


La prise en main est très simple aussi, vous définissez vos systèmes, ils doivent être accessibles en ODBC et FTP. Attention FTP est réglé en auto, il vaudra mieux essayer PASV.


L’interface est classique
Vous pouvez Browser vos membres sources
Vous pouvez paramétrer vos options de compile

Les plus qu’on aime :
Il est interfaçable avec ACS pour l’émulation 5250 et system debugger …
Vous avez une option Object Diagram qui permet de modéliser rapidement vos applications –ne rêvez pas ce n’est pas parfait– mais c’est utilisable et pratique.


Un comparateur de sources simple et efficace
Un interfaçage avec git qui permet des clones locaux et des pushs par la suite

En résumé

Si vous faites beaucoup RPG en mode FREE, peu de CL (pas d’invite)
C’est un très bon produit.
Pour le reste, du code colonné, des clp, des includes il y a quelques lacunes.

Mais c’est un produit gratuit et parfaitement opérationnel merci à ceux qui le proposent, et un petit don s’impose quand vous le pouvez.

Divers

On a également testé rpgnextgen qui n’a plus évolué depuis 2012 et qui semble un peu dépassé

Vous pouvez également regarder du coté de ILEditor2 à l’adresse suivante https://ileditor.dev/ , un peu plus complet mais payant

, Contrôle des dates de validité de vos certificats

Vous allez utiliser de plus en plus de certificats et la problématique est que les certificats ont des périodes de validité.

Je vous rappelle que vous avez une interface pour gérer ces certificats qui s’appelle DCM accessible à l’adresse, http://votre_systéme:2006/dcm.

La nouvelle interface vous indique par une coloration jaune que votre certificat va expirer et rose pour vous indiquer que votre certificat est expiré.

Mais on ne va pas passer notre temps sur DCM.

Les TR V7R4 Niveau 7 et V7R3 Niveau 18 nous apportent une nouvelle fonction TABLE, QSYS2.CERTIFICATE_INFO() qui va nous permettre d’automatiser un contrôle.
Vous avez des informations à cette adresse, https://www.ibm.com/support/pages/node/6156105
Exemple :
On fixe la date de contrôle à – 1 mois, vous devrez avoir le mot de passe de votre magasin de certificat.

SELECT Substr(CERTIFICATE_LABEL, 1, 50) as label, VALIDITY_END as date_de_fin FROM
TABLE(QSYS2.CERTIFICATE_INFO(CERTIFICATE_STORE_PASSWORD=>’votre mot de passe’))
WHERE VALIDITY_END < CURRENT DATE + 1 MONTH

Pour vous aider on a fait une petite commande CHKCRTDAT qui est disponible sous github à l’adresse, https://github.com/Plberthoin/PLB/tree/master/GTOOLS

Vous pourrez planifier le contrôle de vos certificats, par exemple toutes les semaines.

Attention, il reste une problématique à gérer c’est le passage et le stockage du mot de passe.
Il y a plusieurs écoles, mais une chose est sûre : il doit être crypté au moins une fois.