, , Plugin JCRCMDS pour RDI

Plugin open source peu connu de Craig Rutledge mais qui est bien utile pour convertir les spécifications H, F et D en RPG full free.

Il existe plusieurs outils pour convertir ces spécifications mais l’avantage de celui-ci est qu’on peut le faire directement dans RDI .

Lien pour le téléchargement :

https://sourceforge.net/projects/jcrcmds/

Installation

Extraire l’archive.

Comme pour le plugin isphere, il faut lancer RDI puis Aide > Installer un nouveau logiciel

Il suffit ensuite de sélectionner le dossier précédemment extrait.

Utilisation

1ère solution : Sélectionnez le code à convertir puis faites un clic droit JCRCMDS > convert selection(H,F,D).

Résultat :

2ème solution : Faites un clic droit directement dans le code puis JCRCMDS > Convert all(H,F,D)

Toutes les spécifications H, F ou D seront transformées.

, Utilisez un booléen dans une commande

Voici un exemple classique, vous devez définir dans vos commandes, un paramètre qui peut prendre comme valeur oui ou non par exemple

Généralement vous allez faire comme ceci

dans la commande

PARM KWD(CRTFILE) TYPE(CHAR) LEN(4) RSTD(YES) +
DFT(NO) VALUES(NO *YES) PROMPT('Création du +
fichier')


dans le programme

         PGM        PARM(.... &CRTFILE)
/* Paramètres */
//
DCL &CRTFILE *CHAR 4
//
IF COND(&CRTFILE = '*YES' ) THEN(DO)
//
ENDDO

Voici une solution en utilisant un booléen dans le programme

dans la commande

        PARM       KWD(CRTFILE) TYPE(*CHAR) LEN(4) RSTD(*YES) + 
                     DFT(*NO) VALUES(*NO *YES) SPCVAL(('*YES' + 
                     '1') ('*NO' '0')) PROMPT('Création du +    
                     fichier')                                  

dans le programme

         PGM        PARM(.... &CRTFILE)
/* Paramètres */
//
DCL &CRTFILE *LGL
//
IF COND(&CRTFILE) THEN(DO)
//
ENDDO

L’astuce consiste à indiquer une valeur à renvoyer dans la commande ici on se borne à ‘0’ et ‘1’ ce qui peut être interprété par votre programme comme un booléen

L’intérêt d’utiliser un booléen c’est d’avoir un code simplifier , un peu comme les indicateurs qui simplifient la lecture d’un code RPGLE ou CLLE

, , Tracer l’usage d’une commande

Vous voulez savoir si une commande est utilisée, il y a plusieurs solutions en voici une basée sur les
programme d’exit qui est assez simple

Il existe un programme d’exit QIBM_QCA_CHG_COMMAND

Pour ajouter votre programme vous avez une commande ADDEXITPGM

ADDEXITPGM EXITPNT(QIBM_QCA_CHG_COMMAND)   +
           FORMAT(CHGC0100)                +
           PGMNBR(1)                       +
           PGM(VOTREBIB/HSTCMD)           +
           TEXT('Tracer une commande') +
           PGMDTA('RSTLIB    QSYS')

Vous devrez lui indiquer dans la paramètre PGMDTA la commande qualifiée à tracer
exemple :
‘STRDBG QSYS’

Les données reçues sont sur le format CHGC0100 qui vous donne le découpage du buffer reçu par votre programme

Vous pouvez faire un programme générique qui va loguer l’utilisation d’une commande, vous pouvez en mettre plusieurs et la prise en compte est immédiate

Voici le source en clle du programme HSTCMD

 PGM    PARM(&ExitInfo  &NewString   &Newlength)                 
       DCL  &Class       *CHAR   10                                                                                 
       DCL  &OffsetDec   *DEC  (7 0)
       DCL  &CmdLenDec   *DEC  (7 0)
       DCL  &ExitInfo    *CHAR 2000   /* CHGC0100 interface data      */
/* Input parameters                                                   */
       DCL  &ExitPoint   *CHAR   20   /* Exit Point name              */ 
       DCL  &ExitFormat  *CHAR    8   /* Exit Point Format            */ 
       DCL  &CmdName     *CHAR   10   /* Command name being executed  */ 
       DCL  &CmdLib      *CHAR   10   /* Command Library              */ 
       DCL  &Change      *CHAR    1   /* Change allowed? 1=yes 0=no   */ 
       DCL  &Prompt      *CHAR    1   /* Prompt requested? 1=yes 0=no */ 
       DCL  &Filler      *CHAR    2   /* Reserved by IBM              */ 
       DCL  &Offset      *CHAR    4   /* Offset to command string     */ 
       DCL  &CmdLength   *CHAR    4   /* Command string length        */ 
       DCL  &CmdString   *CHAR 2000   /* Command String               */          
/* Output Parameters                                                  */
       DCL  &NewString   *CHAR 2000   /* Replace with this command    */
       DCL  &NewLength   *CHAR    4   /* Length of new command        */
                                      /* 0 = no new command           */ 
DCL &JOB *CHAR 10
DCL &USR *CHAR 10
DCL &NBR *CHAR  6
       MONMSG   CPF0000    EXEC(GOTO ERROR)
/* découpage du paramètre reçu                                   */
       CHGVAR  &ExitPoint  %SST(&ExitInfo   1  20)             
       CHGVAR  &ExitFormat %SST(&ExitInfo  21   8)              
       CHGVAR  &CmdName    %SST(&ExitInfo  29  10)             
       CHGVAR  &CmdLib     %SST(&ExitInfo  39  10)              
       CHGVAR  &Change     %SST(&ExitInfo  49   1)              
       CHGVAR  &Prompt     %SST(&ExitInfo  50   1)              
       CHGVAR  &Filler     %SST(&ExitInfo  51   2)              
       CHGVAR  &Offset     %SST(&ExitInfo  53   4)              
       CHGVAR  &CmdLength  %SST(&ExitInfo  57   4)               
       CHGVAR  &CmdLenDec  %BIN(&Cmdlength)                   
       CHGVAR  &OffsetDec  (%BIN(&Offset) + 1)          /* Set offset */
       CHGVAR  &CmdString  %SST(&ExitInfo &OffsetDec &CmdLenDec)
/* Extraction du travail */
                    RTVJOBA    JOB(&JOB) USER(&USR) NBR(&NBR)          
/* envoi message à qsysopr */ 
             SNDUSRMSG  MSG(&job *tcat '/' *tcat &usr *tcat +   
                          '/' *tcat &nbr *bcat %sst(&CmdString 1 + 
                          100) ) MSGTYPE(*INFO) TOUSR(*SYSOPR)
/* passage de la commande sans transformation */
chgvar &NewString &CmdString
chgvar &NewLength &CmdLength 
ERROR:
return
ENDPGM 

Remarque :

Vous n’avez pas besoin de mettre en place des audits et tout est dynamique

Vous pouvez transformer une commande ou la remplacer par une autre

Pour voir les commandes que vous tracez

==> WRKREGINF QIBM_QCA_CHG_COMMAND

Exemple :


Les commandes qui commencent par DLT, je remplace par un message suppression refusée pour certain utilisateurs

Rappel :

Un programme d’exit doit être simple et ne pas planter !

Vous voulez mettre à jour des informations dans une table sans faire de boucle de lecture ? Cet article est pour vous.

Prenons un exemple. Vous consommez un service web qui vous transmet une liste d’article que vous devez stocker en base de données.

L’ordre DB2 MERGE vous permettra d’ajouter les articles qui n’existent pas et de mettre à jour ceux qui existent.

Création de table ARTICLE

CREATE TABLE ARTICLE ( 
	CDART CHAR(10) CCSID 1147 DEFAULT ' ' , 
	DESART CHAR(30) CCSID 1147 DEFAULT ' ' )   
	  
	RCDFMT ARTICLE    ; 
  
LABEL ON TABLE ARTICLE 
	IS 'Base article' ; 
  
LABEL ON COLUMN ARTICLE 
( CDART IS 'Code article         ' , 
	DESART IS 'Désignation article  ' ) ;

Code RPG avec ajout ou mise à jour d’un article.

ctl-opt alwnull(*usrctl) option(*nodebugio:*srcstmt);

//Variables
dcl-s code_article        char(10);
dcl-s designation_article char(30);

exec sql SET OPTION commit = *none;

code_article        = 'AB123456';
designation_article = 'Ma désignation';

Exec Sql
   MERGE INTO ARTICLE as ARTICLE
   USING(VALUES (:code_article, :designation_article))
   AS SOURCE(CDART,DESART)
   ON ARTICLE.CDART = SOURCE.CDART
   -- Mise à jour de la désignation si code article trouvé
   WHEN MATCHED THEN UPDATE
         SET DESART  = SOURCE.DESART
   -- Ajout de l'article
   WHEN NOT MATCHED THEN INSERT VALUES (SOURCE.CDART,
                                        SOURCE.DESART)
   NOT ATOMIC CONTINUE ON SQLEXCEPTION;


*inLR=*ON;

Vous pouvez également supprimer l’article s’il est trouvé.

WHEN MATCHED THEN DELETE

On peut rajouter des conditions en plus du MATCHED. Dans la ligne ci-dessous je ne veux mettre à jour que l’article ‘TEST’. Pas grand intérêt mais c’était pour montrer un exemple.

WHEN MATCHED AND CDART='TEST' THEN UPDATE SET DESART  = SOURCE.DESART

Vous pouvez aussi tester la valeur pour la contrôler avant de faire la mise à jour.

WHEN MATCHED AND SOURCE.DESART IS NOT NULL THEN UPDATE SET DESART  = SOURCE.DESART

Il est également possible de prendre le résultat d’un select au lieu des deux variables

MERGE INTO ARTICLE as ARTICLE
   USING(VALUES (SELECT CDART, DESART FROM ARTICLE2))
   AS SOURCE(CDART,DESART)
   ON ARTICLE.CDART = SOURCE.CDART
   -- Mise à jour de la désignation si code article trouvé
   WHEN MATCHED THEN UPDATE
         SET DESART  = SOURCE.DESART
   -- Ajout de l'article
   WHEN NOT MATCHED THEN INSERT VALUES (SOURCE.CDART,
                                        SOURCE.DESART)
   NOT ATOMIC CONTINUE ON SQLEXCEPTION;

Je ne l’ai pas dit au début de l’article mais ça fonctionne aussi sur les PF.

, Plugin Isphere pour RDI

Isphere est un plugin open-source qui vous apportera quelques fonctionnalités intéressantes. Vous pourrez le télécharger grâce au lien ci-dessous :

https://isphere.sourceforge.io/

Pour l’installer, il faut tout d’abord télécharger et extraire l’archive en local puis lancer RDI. Cliquez ensuite sur l’onglet Aide > Installer un nouveau logiciel.

Cliquez sur local, sélectionnez le dossier que vous avez précédemment extrait puis faites OK.

Vous pouvez tout sélectionner et faire suivant jusqu’au bout.

Afficher les intitulés

Plus besoin de cliquer sur un objet / membre et de regarder la vue propriété pour avoir le texte.

Pour activer l’affichage des intitulés, cliquez sur Affichage > Préférences puis activez les deux rubriques isphere dans Général > Apparence > Décorations d’intitulés.

Résultat :

Recherche de chaine de caractères

Vous pouvez déjà le faire dans RDI en faisant un clic droit sur un fichier source / bibliothèque « Rechercher la chaine ». Mais cette option peut prendre du temps. Utilisez plutôt « Isphere source file search ».

Saisir la chaine à recherche et faites OK.

Si vous faites un double-clic sur la ligne ça ouvrira le source en édition.

Gestion des MSGF

Comme pour la recherche de chaine, on peut déjà modifier un fichier de message mais ce n’est pas très pratique. Il faut déplier le fichier de message, faire un clic droit modifier sur le message et modifier le texte.

Avec Isphere vous pouvez faire un clic droit « Isphere Message File Editor ».

Il va ouvrir le fichier de message et vous pourrez effectuer des recherches de texte, double cliquer sur un message pour l’éditer etc…

Gestion des postes d’un répertoire de liage

Clic droit sur le répertoire de liage puis « Isphere Binding Directory Editor ».

Dans l’onglet qui vient de s’ouvrir, vous pouvez ajouter un programme de service au répertoire de liage avec un simple clic droit / New (équivalent de la commande ADDBNDDIRE).

Vous avez également la possibilité d’en supprimer.

Copier un membre source

Très pratique si vous voulez copier un source d’un système à un autre (ou sur le même).

Clic droit sur un membre (ou plusieurs), puis « Copy Member’s to ».

Choisissez le système / fichier source / bibliothèque de destination et cliquez sur « Copy ».

Comparer des sources

Déjà disponible dans RDI mais Isphere permet de le faire plus facilement. Très pratique si l’on veut comparer deux sources sur deux systèmes (ou le même).

Faites un clic droit sur le source puis « Isphere compare Editor ».