, , , Les traitements asynchrones sur IBMi


Une définition simple, ce sont des traitements qui se déclenchent pour traiter des entrées d’une pile et qui ne renvoient pas de résultats directs au proccess émetteur

Il existe des produits spécifiques pour faire ça, sur l’IBMi le plus connu est bien sur mqseries .
Mais il est maintenant possible d’installer des produits open source comme RabbitMQ , etc…

Il existe également des solutions natives de la plateforme.

Parmi ces solutions il y a 2 méthodes

  • Cyclique ( toutes les 30 secondes)
  • A l’événement qui ne se déclencheront qu’en cas de nécessité (exemple triggers)

On ne présentera ici que les secondes.

Les triggers

Ce sont des programmes qu’on va enregistrer au niveau de la base de données, ils vont se déclencher sur un update, insert ou delete avant ou après l’action.

On peut les déclarer par commande ADDPFTRG ou par l’instruction SQL CREATE TRIGGER, on peut être plus précis sur l’exécution en SQL (Niveau zone modifiée par exemple)

Les DTAQs

Ce sont des files d’attentes que l’on crée par CRTDTAQ , on peut écrire dedans par API (QSNDDTAQ, QRCVDTAQ) ou par SQL QSYS2.SEND_DATA_QUEUE() et QSYS2.RECEIVE_DATA_QUEUE()

Pour la réception, on peut indiquer un temps négatif souvent -1, et le traitement se déclenchera quand il y aura un entrée dans la file !

soit dans le programme de traitement
CALL PGM(QRCVDTAQ) PARM(&DTAQNOM &DTAQBIB &DTAQLEN
&DATA &WAIT)
/* &wait = -1 */

Les msgqs en wait

historiquement, souvent utilisé, par exemple pour superviser la msgq qsysopr

dans le programme de traitement qui boucle sur cette instruction
RCVMSG … WAIT(*MAX)

Les fichiers à fin retardée

Le principe est le suivant, votre programme attendra un enregistrement quand il aura fini de lire les enregistrements trouvés

Avant le programme RPGLE
OVRDBF FILE(VOTREFIC) EOFDLY(99999)

dans le programme RPGLE

dou %eof() ;
….
read VOTREFIC ;

endif ;

Les watchers


Permettent d’analyser en temps réels des messages qui arrive dans les joblog, les historiques de log voir une autre file de message (MSGQ) .
Pour démarrer un watcher, on utilise la commande STRWCH
STRWCH SSNID(ANAWCH) WCHPGM(votre bib/votre programme) +
CALLWCHPGM(WCHEVT) WCHMSG((ALL))
WCHMSGQ((Votre bib/votre msgq))

votre programme reçoit 4 paramètres
L’option, la session, l’erreur et la donnée du message

exemple

/* Paramètres reçus */

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)

Les programmes d’exits

C’est des actions système enregistrées que vous pouvez voir par la commande WRKREGINF, et seules les actions définies dans cette liste sont utilisables.

Pour ajouter un programme c’est soit la commande addexitpgm ou l’option 8 dans wrkreginf.

Le principe , on reçoit un buffer avec les données en cours et on renvoie status pour dire ok ou ko, vous pouvez dire OK systématiquement et traiter ou faire un contrôle d’autorisation applicatif

Exemple sur FTP

PGM PARM (& APPID & OPID & USRPRF & REMOTEIP & REMOTELEN & OPINFO & OPLEN & OK)
DCL & APPID * CHAR 4 /* ID D’APPLICATION, NUM BINAIRE */
DCL & OPID * CHAR 4 /* ID D’OPERATION, NUMERO BINAIRE */
DCL & OPNUM * 4 /* OPERATION ID, UTILISABLE DANS CL */
DCL & USRPRF * CHAR 10 /* PROFIL UTILISATEUR UTILISANT FTP */
DCL & REMOTEIP * CHAR 251 /* ADRESSE IP */
DCL & REMOTELEN * CHAR 4 /* LONGUEUR DU PARAMETRE PRECEDENT */
DCL & OPINFO * CHAR 251 /* INFORMATIONS SPECIFIQUES OP */
DCL & OPLEN * CHAR 4 /* LONGUEUR DU PARAMETRE PRECEDENT */
DCL & OK * CHAR 4 /* SIGNAL DE CONFIRMATION / / seulement utilisateur FTPUSR */
if cond(&USRPRF *ne ‘FTPUSR’) then(do)
chgvar &ok (X’00000001′)
enddo
ENDPGM

pour l’ajouter

ADDEXITPGM EXITPNT(QIBM_QTMF_SVR_LOGON)
FORMAT(TCPL0100) PGMNBR(1) PGM(VOTRELIB/VOTREPGM)

Vous devez arrêter le service FTP pour que cela soit pris en compte
ENDTCPSVR *FTP puis STRTCPSVR

Conclusions

Vous avez plusieurs solutions dans certains cas , et certaines sont plus à jour

les 4 à utiliser aujourd’hui sont
Les triggers pour la base de données, si possible en SQL
Les watchers pour les événements de log systèmes
Les progammes d’exit pour les actions Système, par exemple pour les connexions ODBC
Les dtaq pour gérer des piles de données applicatives

Tous ces programmes sont appelés souvent, ils doivent être donc optimisés et ils ne doivent pas planter pour éviter de bloquer la file !

, 5 astuces pour utiliser SMTP sur l’IBMi

1) Utilisez l’annuaire SMTP

Il faut arrêter d’utiliser la directory SNA, l’objectif est se passer complètement de SNA
c’est le paramètre DIRTYPE, exemple CHGSMTPA DIRTYPE(*SMTP)
Il vous faudra inscrire les utilisateurs à SMTP , addsmtpusr ou wrksmtpusr pour qu’ils puissent envoyer des mails

Sinon vous recevrez un message TCP5090 comme celui ci !

2) Utilisez un user mail en NOREPLY

Créer un utilisateur NOREPLY sans mot de passe
inscrivez le à la directory SMTP
wrksmtpusr ou addsmtpusr

et ensuite envoyer vos mails en les soumettant avec cet utilisateur

exemple :

SBMJOB CMD(SNDSMTPEMM RCP((‘xxx@gaia.fr’)) SUBJECT(‘votre sujet’) NOTE(‘ici texte’)) JOB(MAIL)
USER(NOREPLY)

3) Utiliser du HTML dans le corps du message

paramètre CONTENT(*HTML)

dans la commande SNDSMTPEMM … CONTENT(*HTML)

Vous pouvez alors utiliser des balises HTML dans votre message
Un très bon site ici !
https://openclassrooms.com/fr/courses/1603881-apprenez-a-creer-votre-site-web-avec-html5-et-css3/1608357-memento-des-balises-html

4) Historique des mails

A partir du moment ou vous êtes en DIRTYPE(*SMTP)
Vous n’écrivez plus dans le journal QZMF de QUSRSYS, il est conseillé de passer à JOURNAL(*NO) et ALLMAILMSF(*NO)

pour arrêter MSF qui ne sert plus à rien vous devez supprimer le job à démarrage automatique avec la jobd QZMFEJBD ou vous pouvez changer la jobd et remplacer le STRMSF … par un SNDMSG (‘coucou’) TOUSR(*SYSOPR)

5) Utilisez un sous-système spécifique

Pour des questions d’administration, vous pouvez mettre un sous système spécifique qui permet de mieux gérer les travaux relatives aux mails et qui par défaut sont dans QSYSWRK

CHGSMTPA SBSD(QSYS/QSMTP)

Vous devez arrêter et redémarrer le service pour la prise en compte

Conclusion:

C’est la meilleur solution pour envoyer des mails, il y a des nouveautés à chaque version.

, Comparer 2 fichiers sur l’IBMi

Il y a maintenant un procédure qui permet de comparer 2 tables (COMPARE_FILE), c’est celle qui est utilisée dans ACS.

Voici comment elle s’utilise avec un exemple sur les fichiers AIRPORTS et AIRPORTS2

SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
LIBRARY1=>’FORM01′, FILE1=>’AIRPORTS’,
LIBRARY2=>’FORM01′, FILE2=>’AIRPORTS2′,
COMPARE_ATTRIBUTES=>’NO’,
COMPARE_DATA=>’YES’))

Il y a 2 options de comparaison sur les données et les attributs du fichier

COMPARE_DATA=>’YES’ et COMPARE_ATTRIBUTES=>’YES’ sont les valeurs par défaut
Vous avez alors la liste des rangs (RRN) qui sont différents !


vous pouvez indiquez QUICK si vous voulez juste savoir si vous avez une différence

Vous pouvez indiquez NO si un des 2 paramètres ne vous intéresse pas

Attention vous avez intérêt à faire ça en batch

Donc à mettre dans un fichier résultat

Exemple

create table … as(votre requête) with data

Attention les zones sont des VARGRAPHICs vous devrez les caster pour les utiliser simplement

Exemple :

cast(substr(ATTRIBUTE_NAME , 1 , 132) as char(132)) as ATTRIBUT_NAME

, , Rechercher dans l’IFS de votre IBMi

Il peut vous arriver de vouloir rechercher une chaine de caractères dans votre IFS voici comment vous pouvez faire en utilisant SQL service .

1) Recherche d’un nom fichier sur une chaine

SELECT cast(substr(PATH_NAME , 1 , 132) as char(132)) as PATH_NAME
FROM TABLE(IFS_OBJECT_STATISTICS(
START_PATH_NAME => ‘/HOME/PLB’ ,
OBJECT_TYPE_LIST => ‘*ALLSTMF’))
where ucase(PATH_NAME) like (‘%PRO%’)

Ici, recherche PRO dans le nom du fichier du répertoire /HOME/PLB

2) Recherche d’une chaine dans les fichiers

Création d’un fichier résultat !

CREATE OR REPLACE TABLE RETURN_TABLE
(STMF_NAME char(100),
LINE_NUMBER decimal(5 , 0),
LINE varchar(132))

Recherche de la chaine dans tous les fichiers

begin
for
SELECT PATH_NAME as IFS_PATH_NAME
FROM TABLE(IFS_OBJECT_STATISTICS(
START_PATH_NAME => ‘/HOME/PLB’ ,
OBJECT_TYPE_LIST => ‘*ALLSTMF’))
do
INSERT INTO RETURN_TABLE
SELECT IFS_PATH_NAME ,
LINE_NUMBER ,
cast(substr(LINE , 1 , 132) as char(132))
FROM TABLE(IFS_READ(
PATH_NAME => IFS_PATH_NAME))
WHERE UPPER(LINE) like ‘%’ concat ‘PRO’ concat ‘%’ ;

end for;
end

Ici, recherche PRO dans les fichiers du répertoire /HOME/PLB

Attention

Ces recherches sont très consommatrices elles doivent être soumises en batch

Conclusions :


Ça peut vous aidez dans vos recherches, mais attention au nombre de fichiers à scanner.
Si vous êtes amené à faire régulièrement ce type de recherche, préférer la mise en œuvre de OMNIFIND

Si vous voulez l’exemple en fonction table il est ici :

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

, 5 choses savoir sur les includes

Un include ou un /copy dans un programme permet de copier avant la compile des lignes de sources dans votre programme ou module.
C’est pour normaliser des parties de code qu’on utilise souvent dans une application, souvent des déclarations
exemple :
DS pour les données programme (SDS)
DS pour les données fichier (INFDS)
Découpage d’un paramétrage applicatif d’une *lda ou autre
etc…

1) Utilisation en CLP

C’est pas forcément le langage où en trouve le plus, mais ça peut avoir du sens si on utilise par exemple une routine d’erreur générale
pgm
DCL….
include erreur1
// votre code
include erreur2
ENDPGM

Vous pouvez préciser le fichier ou le répertoire ou se trouve vos includes

Sur les commandes CRTCLMOD ou CRTBNDCL c’est les paramètres INCFILE ou INCDIR

Vous pouvez indiquer dans votre source le fichier ou la bibliothèque , il est bien sur déconseillé de harcoder la bibliothèque, la gestion de la liste de bibliothèque étant préférable.

2) Utilisation en RPG

on peut utiliser des /copy ou des /include
la syntaxe est la même
libraryname/filename,membername
filename,membername
membername

Encore une fois il est fortement déconseillé d’utiliser la bibliothèque,

d/COPY QSYSINC/QRPGLESRC,ECHKPWD1
ou
d/INCLUDE QSYSINC/QRPGLESRC,ECHKPWD1

en free, elle doivent quand même être codé comme une carte …

on peut faire des includes d’includes par exemple on l’utilise dans l’ILE
sourceA
include prototype1
include prototype2

sourceB
include SourceA

C’est souvent utilisé pour le prototypage de fonction et procédure

Vous pouvez indiquer dans une carte h ou dans ctl-opt en free

COPYNEST( n )
Indique le nombre maximal d’imbrications, n étant une valeur
comprise entre 1 et 2048. Si le mot clé COPYNEST n’est pas
spécifié, 32 est utilisée comme valeur maximale.

Je n’ai jamais vu plus de 5 niveaux …

3) Utilisation dans un SQLRPGLE

Comporte une petite subtilité entre les /copy et les /include sur les variables HOSTs

Paramètre de compile , RPGPOPT de la commande du CRTSQLRPGI

  • NONE
    Le compilateur n’est pas appelé pour le prétraitement.
  • LVL1
    Le compilateur est appelé pour le prétraitement pour développer / COPY et gérer les directives de compilation conditionnelle à l’exception de la directive / INCLUDE.
  • LVL2
    Le compilateur est appelé pour le prétraitement pour développer / COPY et / INCLUDE et gérer les directives de compilation conditionnelle.

Le conseil est de forcer le paramètre à *LVL2 pour que même les include soit résolus avant la pré-compilations SQL

4) Les copies conditionnées

Pour éviter les inclusions en double suite à plusieurs inclusions venant de plusieurs endroits

Il y a un macro langage qui permet d’indiquer des instructions dans votre sources RPG

A) dans le source à inclure
source1

les instructions ici
à la fin
/define prototype

B) dans le programme ou on veut l’inclusion

/if not defined( prototype )
/include prototype
/endif

ou

/if defined( prototype )
/eof
/endif

5) Conversion RPGIII vers RPGIV

Pour convertir du RPG3 vers RPGIV ,vous avez une commande IBM qui s’appelle CVTRPGSRC, voici comment traiter les includes.

Il y a 2 méthodes possibles :

A) En précisant le paramètre EXPCPY à *YES de la commande CVTRPGSRC ce qui incluera le /copy dans le programme après l’avoir converti

B) Vous devrez commencer par convertir les /copy de votre application
Attention au nom de fichier que vous devrez éventuellement changer en QRPGLESRC par exemple dans les sources

Conclusion

Il peut être intéressant d’utiliser les includes, mais ça nécessite un minimum d’organisation, exemple pour les prototypages ILE

RDI permet de voir directement les includes à partir du source que vous éditez …

, , , , 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

, , 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