, , Visual studio code IBM i Snippets

Vous connaissez tous, au moins de nom l’extension « code for i » qui vous permet d’éditer vos sources RPGLE dans votre éditeur favori qui est publié par notre Ami Liam Allan

Si voulez en savoir plus une vidéo très bien faite de notre ami de Yvon est disponible sur la chaine youtube de Volubis ici

Mais il existe également des extensions créé par d’autres contributeurs en voici une qui est apparu en 2022 « IBM i Snippets », elle a été créée par Andy Youens.

L’installation est très simple à partir de la gestion des extensions

Le principe de cette extension est de vous proposer des exemples de codes (par exemple des squelettes pour du RPGLE ou CLLE).

Son usage est très simple vous devez saisir « !i » dans votre éditeur favori .


Cette extension bouge beaucoup depuis sa sortie et les dernières contributions sont récentes, n’hésitez pas à proposer des exemples de codes si vous en avez qui soit présentable

Nous pensons qu’il y aura de plus en plus de extensions disponibles pour l’IBMI et une amélioration de celle exitantes extensions existantes, il est donc important d’avoir un œil ce mode de développement , en sachant que les « JEUNNNNES » connaissent déjà cet interface

, RDi : configurer et déployer les Actions de l’utilisateur

Les actions utilisateur vous permettent d’exécuter des commandes préformatées sur les objets ou sur les membres de vos filtres, en utilisant le clic droit pour exécuter l’action.

Elles sont équivalentes aux options définies par l’utilisateur que l’on peut gérer par F16 sous PDM.

Gérer les actions de l’utilisateur

La gestion des actions utilisateur est accessible par clic droit sur les objets ou membres des filtres.

Créer une action objet

Nous allons créer une action pour exporter une table vers l’IFS au format CSV.

L’action utilisera la commande CPYTOIMPF que nous allons préformater.

Le bouton « Insérer une variable » affiche la liste des variables que nous allons pouvoir utiliser dans les paramètres de la commande pour substituer les attributs de l’objet sur lequel l’action s’exécute :

Le bouton « Invite » permet d’afficher l’invite de commande pour compléter les paramètres :

La case « Interroger d’abord » permettra d’afficher l’invite de commande lors de l’utilisation de l’action.

Enfin, il est conseillé d’indiquer les types de ressources pour lesquelles cette action sera proposée dans le clic droit :

Une fois créée, l’action apparait dans le catalogue des actions Objet :

Elle peut être utilisée par clic droit sur un objet de type fichier :

L’invite de commande est affichée avec les valeurs de substitution des variables utilisées :

Le message d’exécution de l’action s’affiche dans l’historique des commandes de RDI :

Le fichier CSV est créé dans l’IFS :

Créer une action membre

Nous allons créer une action permettant de convertir un membre source RPG 4 en RPG FREE.

Pour cela, nous avons créé une commande CVTRPGFREE basée sur un convertisseur Open Source auquel GAIA contribue.

Pour limiter l’action au membres sources de type RPGLE et SQLRPGLE, nous allons Editer la liste des Types définis et créer un Type défini que nous nommerons RPGLE et qui rassemblera les types de membre RPGLE et SQLRPGLE :

Le fenêtre « Gérer les types nommés » s’ouvre :

Le bouton « Parcourir » permet de choisir les types de membre existants pour les ajouter à la liste :

Le nouveau Type défini « RPGLE » s’affiche dans la liste des types de membres définis :
On peut maintenant l’utiliser pour notre action :

Une fois créée, l’action apparait dans le catalogue des actions Membre :

Elle peut être utilisée par clic droit sur un membre de type RPGLE ou SQLRPGLE pour le convertir en RPG FREE :

Le message d’exécution de l’action s’affiche dans l’historique des commandes de RDI :
Le membre PGMRPGFREE a été créé avec la conversion en RPG FREE du membre initial PGMRPG4 :

Notons qu’en effectuant une sélection de plusieurs ressources dans un filtre, on peut exécuter une action utilisateur sur toutes ces ressources par un seul clic droit.

Exemple ci-dessous : on peut exporter 4 fichiers vers l’IFS au format CSV en un seul clic

Exporter/Importer les actions utilisateur

Les actions utilisateur peuvent être exportées vers un fichier de configuration à partir du menu

Fichier > Exporter > Rational Developer for i :

2 modes d’exportation sont possibles :

  • l’export « Fichier de configuration » permet d’exporter la configuration vers un fichier local, qui pourra si on le souhaite être partagé et importé par d’autres utilisateurs vers leur Workspace.
  • l’export « Fichier de configuration pour distribution automatique » permet d’exporter la configuration pour la distribuer automatiquement aux autres utilisateurs

Exporter Fichier de configuration pour distribution automatique

Pour exporter les actions utilisateur, décocher toutes les cases et ne conservez que la configuration « Artefacts de systèmes distants ».

Les filtres sont exportés, lors de l’import vous perdrez donc les filtres de votre Workspace.

Ca peut être gênant, mais ça peut aussi être l’occasion de faire du ménage dans vos filtres….

Le fichier de configuration sera généré dans le répertoire suivant de l’IFS :

/QIBM/ProdData/Devtools/clientconfig

Choisissez un numéro de version pour identifier le fichier de configuration :

Avant de Terminer, assurez-vous d’avoir les droits d’écriture dans le répertoire de destination.

Le fichier de configuration est généré dans l’IFS pour une distribution automatique de cette configuration :

Lorsque les utilisateurs se connecteront à l’IBM i, une fenêtre d’importation leur sera automatiquement proposée :

L’import peut être accepté (OK) ou pas (Annuler) mais tant qu’il n’aura pas été accepté, il sera reproposé à chaque connexion à l’IBM i par RDI.

C’est terminé !

PS :

Si le fichier de configuration a été exporté vers un fichier local par l’export Fichier de configuration au lieu de Fichier de configuration pour distribution automatique, il peut être importé de la même manière par le menu Fichier > Importation > Rational Developer for i > Fichiers de configuration. Il suffit d’indiquer l’emplacement du fichier de configuration, ensuite la procédure est identique à celle de la distribution automatique :

, CONTROLER IBAN & RIB

L’International Bank Account Number, généralement nommé sous l’acronyme IBAN, est un système international de numérotationLe numéro IBAN, ou code IBAN, est affiché sur votre Relevé d’Identité Bancaire (RIB). Formalisé par une suite de chiffres et de lettres pas toujours compréhensibles pour les usagers bancaires, l’IBAN est une norme internationale ISO qui a été mise en place pour sécuriser et faciliter les échanges et transferts bancaires internationaux sur tous les continents.

Dans cet article nous allons voir comment vérifier si la clé d’un IBAN est correcte. Ensuite nous effectuerons la vérification de la clé d’un RIB. Les exemples sont basés sur un compte bancaire français.

Contrôler la clé IBAN

Structure de l’IBAN

FRKK BBBB BGGG GGCC CCCC CCCC CKK

B = code banque
G = code guichet
C = numéro de compte
K = clef

Le RIB (ou BBAN) comprend les informations suivantes :

– Le nom de la banque et de l’agence;
– Le code banque à 5 chiffres;
– Le code guichet à 5 chiffres ;
– Le numéro du compte à 11 chiffres ou lettres au maximum;
– La clé RIB, à 2 chiffres.

Le calcul de la clé IBAN est fonction de l’enchaînement entre le BBAN, le code pays (transformé en données chiffrées) et 00.
Concernant la conversion du code pays, il faut savoir que la lettre A équivaut au nombre 10, B = 11, C = 12, D = 13… jusqu’à la dernière lettre de l’alphabet Z qui vaut 35.


La formule arithmétique pour résoudre l’équation et déterminer une clé IBAN est :

Clé IBAN = 98 – ((Valeur numérique) modulo 97).

Il faut donc procéder en deux étapes :

  • Reconstituer l’IBAN sous la forme BBAN + [Code Pays ISO2] + « 00 »
  • Remplacer toutes les lettres de l’IBAN par le nombre qui leur correspond (entre 10 et 35)

Voici une procédure, écrite dans un programme de service, qui permet la vérification de la clé d’un IBAN.

dcl-proc checkIban export;
  dcl-pi *n ind;
    numIban char(27) const;
  end-pi;

  dcl-s count int(3) ;
  dcl-s index int(3) ;
  dcl-s posit int(3) ;
  dcl-s stringToCalculate varchar(50) ;
  dcl-c letters    'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;

  stringToCalculate = %subst(numIban:5) + %subst(numIban:1:2) + '00';

  for count = 1 to %len(%trim(stringToCalculate)) ;
    index = %scan(%subst(stringToCalculate:count:1):letters) ;
    if index > 0 ;
      posit = count - 1 ;
      index += 9 ;
    
      stringToCalculate = %subst(stringToCalculate : 1 : posit)
                        + %trim(%char(index))
                        + %subst(stringToCalculate : posit + 2) ;
    endif ;
  endfor;

  return (98 - %rem(%DEC(%trim(stringToCalculate) : 50 : 0):97)
         = %DEC(%SUBST(numIban : 3 : 2) : 2 : 0)) ;

end-proc;                       

Ajouter le code suivant dans le source de liage

EXPORT     SYMBOL("CHECKIBAN") 

Utilisation du contrôle

// Déclaration
dcl-PR checkIban ind ;
 P_Iban char(27) const;
end-pr ;         

// Appel
 retour = checkIban('FR3330002005500000157841Z25');
  if retour;
    dsply 'IBAN Correct' ;
  else ;
    dsply 'IBAN Faux' ;
  endif;  

Contrôler la clé RIB

Structure du RIB (voir paragraphe précédent, c’est un composant de l’IBAN)

Le numéro de RIB permet l’identification du compte pour une utilisation Nationale. C’est le numéro à transmettre pour effectuer un virement en France.

La clé RIB est une formule mathématique, qui ne peut s’appliquer que sur des valeurs numériques. Il convient donc de remplacer les éventuelles lettres présentes dans les données du RIB avant de pouvoir en calculer la clé.

Chaque lettre est remplacée par son équivalent numérique :

A,J = 1

B,K,S = 2

C,L,T = 3

D,M,U = 4

E,N,V = 5

F,O,W = 6

G,P,X = 7

H,Q,Y = 8

I,R,Z = 9

La clé peut alors être calculée avec la formule suivante :

Clé RIB = 97 – ( ( 89 x Code banque + 15 x Code guichet + 3 x Numéro de compte ) modulo 97 )

Voici une procédure, écrite dans un programme de service, qui permet la vérification de la clé d’un RIB.

dcl-proc checkRib export;
  dcl-pi *n ind;
    numRib char(23) const ;
  end-pi;

  dcl-s count int(3) ;
  dcl-s index int(3) ;
  dcl-s posit int(3) ;
  dcl-s stringToCalculate varchar(23) ;
  dcl-c letters    'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ;

  stringToCalculate = numRib ;

  for count = 1 to %len(%trim(stringToCalculate)) ;
    index = %scan(%subst(stringToCalculate:count:1) : letters) ;
    if index > 0;
      posit = count - 1 ;
      select ;
        when index >= 10 and index <= 18 ;
          index -= 9 ;
        when index >= 19 ;
          index -= 17 ;
      endsl ;

      stringToCalculate = %subst(stringToCalculate : 1 : posit)
                        + %trim(%char(index))
                        + %subst(stringToCalculate : posit + 2) ;
    endif ;
  endfor ;

  return (97 - %rem(
                  (%DEC(%subst(stringToCalculate:1:5) : 5 : 0)*89
                  + %DEC(%subst(stringToCalculate:6:5) : 5 : 0)*15
                  + %DEC(%subst(stringToCalculate:11:11) : 11 : 0)*3)
                    :97)
          = %DEC(%SUBST(stringToCalculate : 22 : 2) : 2 : 0)) ;

end-proc;  

Ajouter le code suivant dans le source de liage

EXPORT     SYMBOL("CHECKRIB") 

Utilisation du contrôle

// Déclaration
dcl-PR checkRib ind ;
 P_Rib char(23) const ;
end-pr ;               

// Appel
retour = checkRib('3000200550044AB57O41Z68') ;
  if retour;
    dsply 'RIB Correct'  ;
  else ;
    dsply 'RIB Faux' ;
  endif; 
, , /Include contre /Copy

On entend beaucoup de choses, je vais essayer de vous clarifier un peu les choses

Les directives /COPY et /INCLUDE sont identiques sauf qu’elles sont gérées différemment par le précompilateur SQL, en gros si vous codez avec un Source en SQLRPGLE.

Sur la commande CRTSQLRPGI vous avez le paramètre RPGPPOPT
Permet d’indiquer si le compilateur ILE RPG va être appelé pour prétraiter le membre source avant lancement de la
précompilation SQL. Cette étape sur le membre source SQL permet de traiter certaines instructions de compilation
avant la précompilation SQL. Le source prétraité est placé dans le fichier QSQLPRE de la bibliothèque QTEMP.
Il servira à la précompilation SQL. puis à la complilation RPGLE

3 valeurs possibles sont :
*NONE
Le compilateur n’est pas appelé pour le prétraitement.
*LVL1
Le compilateur est appelé pour le prétraitement afin de développer /COPY et traiter les instructions de compilation conditionnelles à l’exception de /INCLUDE.
*LVL2
Le compilateur est appelé pour le prétraitement afin
de développer /COPY et /INCLUDE et traiter les instructions de compilation conditionnelles

voici un exemple
Un module utilise la description d’un fichier qui est dans un include

le source à inclure

sa déclaration dans le programme ou le module

.

Compile avec *NONE

Compile avec *LVL2

Remarque
Si vous faites du SQLRPGLE, ce qui est fortement recommandé à ce jour forcer cette valeur *LVL2 comme ca pas de doute !

, , , , Verrouiller vos sources pour VSCODE

Une des difficultés, quand on développe avec VSCE sur IBMi ,
C’est que si on est 2 deux à modifier le même source, c’est le dernier qui a raison avec perte de modification du premier même s’il a sauvegardé

Voici comment on peut améliorer les choses.
On va créer un fichier base de données qui liste les sources qui sont en cours de maintenance, un peu comme un ALM.

Avec GIT on peut arriver à des mécanismes identiques, et surtout, il faut commencer à mettre vos sources dans l’IFS directement

Voila comment, vous pouvez faire pour améliorer les choses

CREATE TABLE DB_OPENLCK (FICHIER CHAR ( 10) NOT NULL WITH
DEFAULT, BIBLIO CHAR ( 10) NOT NULL WITH DEFAULT, MEMBRE CHAR ( 10)
NOT NULL WITH DEFAULT, PARTAGE CHAR ( 3) NOT NULL WITH DEFAULT,
PUSER CHAR ( 10) NOT NULL WITH DEFAULT, PDATE DATE NOT NULL WITH
DEFAULT, PTIME TIME NOT NULL WITH DEFAULT)

Pour ajouter un source à verrouiller

INSERT INTO DB_OPENLCK VALUES(‘QRPGLESRC’, ‘GDATA’, ‘AAAA’,
‘NON’, ‘PLB’, current date, current time)

Et parmi les programmes d’exit il en a un qui va nous permettre de mettre en œuvre ce contrôle
C’est le QIBM_QDB_OPEN

On va donc écrire un programme, ici en SQLRPGLE

**free
//
// ce programme permet d'éviter de travailler à 2 sur un même source
//
Dcl-Pi *N;
  DS_parm          likeds(ds_parm_t) ;
  reponse          int(10);
End-Pi;
// dsprogramme
 dcl-ds *N PSDS ;
  nom_du_pgm CHAR(10) POS(1);
  init_user  CHAR(10) POS(254);
  enc_user  CHAR(10) POS(358);
End-ds ;
// ds format  DBOP0100
Dcl-DS ds_parm_t qualified template ;
  taille_entete  Int(10);
  format         Char(8);
  offset_liste   Int(10);
  nbr_fichiers   Int(10);
  taille_liste   Int(10);
  job            Char(10);
  profil         Char(10);
  jobnbr         Char(6);
  cur_profil     Char(10);
  reste          Char(1024);
End-DS;
  // liste des fichiers dans notre cas un seul
Dcl-DS liste  ;
  fichier       Char(10);
  biblio        Char(10);
  membre        Char(10);
  filler         Char(2);
  typefichier    Int(10);
  sous_jacent    Int(10);
  access         Char(4);
End-DS;
// variable de travail
Dcl-S partage      char(4);
Dcl-S puser      char(10);

ds_parm.offset_liste += 1;
dsply   enc_user ;

  liste = %subst(ds_parm : ds_parm.offset_liste :
  ds_parm.taille_liste);

    ds_parm.offset_liste += ds_parm.taille_liste;
 // lecture des informations dans le fichier de verrouillage explicite
 // le verrouillage est donc par utilisateur
   exec sql
   SELECT PARTAGE, PUSER into :partage , :puser
      FROM DB_OPENLCK WHERE FICHIER = :FICHIER and BIBLIO
             = :BIBLIO and MEMBRE = :MEMBRE  ;
   //
   // La régle mise en oeuvre ici
   // on autorise
   // si même utilisateur
   // si non trouvé en modification
   // Si on on a dit partage à oui
   //
  if (sqlcode = 100  or partage = 'OUI' or puser = enc_user) ;
    reponse = 1 ;
  else ;
    reponse = 0 ;
  endif ;
  // fin de programme

*inlr = *on; 

ici notre règle est la suivante
on autorise
Si le source n’est pas présent dans le fichier
Si l’utilisateur est le même que celui en cours
Si on a accepté le partage et donc le risque

Pour ajouter votre pgm exit

SYSTEM/ADDEXITPGM EXITPNT(QIBM_QDB_OPEN)
FORMAT(DBOP0100)
PGMNBR(1)
PGM(GDATA/OPENSRC)
REPLACE(*NO)

Quand on essaye d’accéder par VSCDE à notre source

Remarque


Le contrôle marche aussi avec RDI
mais ne marche pas sur SEU, si vous voulez qu’il contrôle également SEU, vous devrez utiliser le programme d’exit
QIBM_QSU_ALW_EDIT en utilisant le même fichier par exemple !

 **free                                                                                       
 //                                                                                           
 // Ce programme eviter de travailler à 2 sur un même source                                 
 //                                                                                           
 Dcl-Pi *N;                                                                                   
   biblio     char(10);                                                                       
   fichier    char(10);                                                                       
   membre     char(10);                                                                       
   reponse    char(1);                                                                        
 End-Pi;                                                                                      
 // dsprogramme                                                                               
  dcl-ds *N PSDS ;                                                                            
   nom_du_pgm CHAR(10) POS(1);                                                                
   init_user  CHAR(10) POS(254);                                                              
   enc_user  CHAR(10) POS(358);                                                               
 End-ds ;                                                                                     
                                                                                              
 Dcl-S partage      char(4);                                                                  
 Dcl-S puser      char(10); 
                                                                           
 // lecture des informations dans le fichier de verrouillage explicite     
 // le verrouillage est donc par utilisateur                               
   exec sql                                                               
   SELECT PARTAGE, PUSER into :partage , :puser                           
      FROM DB_OPENLCK WHERE FICHIER = :FICHIER and BIBLIO                 
             = :BIBLIO and MEMBRE = :MEMBRE  ;                            
   //                                                                     
   // La règle mise en œuvre ici                                         
   // on autorise                                                         
   // si même utilisateur                                                 
   // si non trouvé en modification                                       
   // Si on on adit partage à oui                                         
   //                                                                     
  if (sqlcode = 100  or partage = 'OUI' or puser = enc_user) ;            
    reponse = '1' ;                                                       
  else ;                                                                  
    reponse = '0' ;                                                       
  endif ;     
  // fin de programme    
                         
*inlr = *on;      

On ajoute comme ca

SYSTEM/ADDEXITPGM EXITPNT(QIBM_QSU_ALW_EDIT)
FORMAT(EXTP0100)
PGMNBR(1)
PGM(GDATA/OPENSRCE)
REPLACE(*NO)


Ca ne fait pas tout, que faire si on est 2 sur le même source ? peut être faut il avoir un source de référence pour éviter le versionnage

, , , Préciser la bibliothèque dans un SELECT INTO

Vous avez dans un programme RPGLE un select into en SQL à faire, mais vous devez choisir la bibliothèque ou se trouve le fichier !

Voici 3 solutions pour éviter le hard codage

1ére solution

Cette solution est plus adaptée à un curseur.

Formater une variable exemple sqlstm

sqlstm = ‘select votrezone from ‘ + votre_lib + ‘/votre_table’ ;

exec SQL
declare curs01 Cursor
for sqlstm ;

exec SQL
prepare sqlstm
from :sqlstm ;

exec SQL
open curs01 ;

exec sql
fetch next
from curs01
into :votrezone ;

On est d’accord, c’est un peu lourd

Voici une alternative

Si vous êtes en convention de nommage *SYS, vous pouvez utiliser la liste de bibliothèques

exec sql
call qcmdexc( ‘addlible ‘ concat :votre_lib) ;
// select sans bibliothèque
exec sql
select mazone into : wmazone from matable ;

Si vous êtes en convention de nommage *SQL, vous devez préciser le schéma courant – par défaut c’est le profil utilisateur.
// select sans bibliothèque
exec sql
set schema :votre_lib ;

exec sql
select mazone into : wmazone from matable ;

A noter que dans la cas d’une convention de nommage *SQL, toutes vos tables doivent être dans la même bibliothèque, en cas de jointure par exemple

Il existe effectivement une autre alternative avec dynamic SQL,

Merci Birgitta pour cette précision .

Avec dynamic SQL et VALUES … INTO:
Exemple:
CmdSQL = ‘Values( Select Count(*) from ‘ + %Trim(YourSchema) + ‘.YourTable ‘ +
‘ ) into ?’;

Exec SQL Prepare DynSQL from :CmdSQL;
Exec SQL Execute DynSQL using :YourResult;

Vous installez de nouveaux PCs et vous désirez savoir les ports à ouvrir pour pouvoir accéder à vos partitions IBMi.

Voici une liste de ports à ouvrir en priorité

Pour ACS :


23 requis TELNET
449 requis arborescence du serveur IBM i
8470 à 8476 (voir RDI)

Pour RDi :


446 Requis (DRDA : connecteur base de données entre serveurs)
449 (as-srvmap) requis arborescence du serveur IBM i
3825 (Debugger) : débogage RDi
4300 (STRRSESVR) débogage via RDi (permet le rappel par l’IBM i du client RDi)
8470 (as-central) requis : Gestion des licences
8471 (as-database) requis base de données
8472 (as-dtaq) requis : serveur de file d’attente de données
8473 (as-file) requis : serveur de fichiers
8474 (as-netprt) serveur d’impression réseau
8475 (as-rmtcmd) requis : envoi de commandes
8476 (as-signon) requis : serveur ouverture de session

Merci à Jean-Marie pour son aide !

, Convertir un menu SDA en UIM

Suite de nos articles sur UIM

On a vu comment générer une structure d’aide à partir d’une commande, comment générer un menu en UIM, cette troisième partie vous fournira un outil (CVTMNUUIM) pour migrer un menu SDA classique en UIM. il est disponible ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS/
Pour standardiser vos menus et les faire bénéficier de la puissance du langage UIM !

1) Génération du source UIM

On part du fichier message pour régénérer les commandes associées aux options
On ne sait pas récupérer de manière simple le texte de l’option, celle ci étant dans un source DDS (si vous l’avez…)

On met donc comme texte la commande à exécuter, vous pourrez donc éditer le source pour changer le texte affiché

2) Compilation du source

CRTMNU MENU(GAIA/GMODERN) TYPE(*UIM) SRCFILE(GAIA/QMNUSRC)

3) Lancement

Go gaia/gmodern

, , Créer un menu UIM

Voici un 2ème post d’une série consacré à UIM (User Interface Manager).

Ce langage peut vous permettre de réaliser des menus standards IBM, en effet tous les menus sont codés en ce langage !

Vous allez devoir saisir un code source au format UIM puis le compiler.
Ça peut être fastidieux à réaliser, c’est pourquoi nous avons réalisé un outil (CRTMNUUIM) qui va vous permettre de réaliser un menu sans aucune compétence dans ce langage.

Vous pouvez le retrouver ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS/

1) Génération du source du menu

vous pouvez indiquer jusqu’à 10 commandes

Exemple

CRTMNUUIM MENU(GAIA/MONMENU)
FICHIER(GAIA/QMNUSRC)
SOCIETE(GAIA)
TITRE(‘Gestion Spools’)
OPTION1(‘Gestion Spools’)
COMMANDE1(WRKSPLF)
OPTION2(‘Gestion Outqs’)
COMMANDE2(‘?WRKOUTQ’)

Si vous avez quelques compétences malgré tout, vous pouvez éditer le source ici MONMENU du fichier source QMNUSRC, en complétant par exemple les aides !

2) Vous pouvez ensuite compiler le menu en indiquant que vous avez un source UIM

CRTMNU MENU(GAIA/MONMENU) TYPE(*UIM) SRCFILE(GAIA/QMNUSRC)

3) Vous avez alors un menu identique à tous les menus IBM

Pour le lancer
GO MENU(MONMENU)

, , Ajouter de l’aide à vos commandes

Vous créez des commandes et vous voudriez leur ajouter de l’aide, ces aides sont écrites dans un langage UIM (User Interface Manager) qui vous permet de générer des panneaux d’aide que vous pouvez ensuite ajouter à vos commandes.
Le langage UIM est un langage de présentation un peu similaire à HTML, il existe de nombreux sites pour l’apprendre.
Pour les commandes, il existe une commande IBMi qui permet de générer une structure qui vous permettra de vous concentrer sur le texte à mettre sans avoir de connaissance approfondie du langage UIM.

Nous avons fait un outil que vous pouvez trouver ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS/
qui vous permettra d’automatiser la génération votre source et voici ce que vous devrez faire ensuite

1) Génération du source en utilisant notre outil

GTOOLS/GENCMDUIM COMMANDE(GTOOLS/SCANSRC)
FICHIER(GTOOLS/QPNLSRC)

2) Modification du source

Vous devez customiser votre source en indiquant vos spécificités

3) Compilation du panel de groupe

CRTPNLGRP PNLGRP(GREFER/SCANSRC)
SRCFILE(GREFER/QPNLSRC)

4) Association de l’aide à la commande

CHGCMD CMD(GREFER/SCANSRC)
HLPPNLGRP(GREFER/SCANSRC)
HLPID(*CMD)

5) Tester votre commande

==>SCANSRC puis <F4> et <F1>

Quelques sites pour vous aider

https://www.rpgpgm.com/2017/02/creating-help-text-using-uim.html

https://www.volubis.fr/news/liens/AF4SRC/ANIMTXT/UIM.htm

https://larreya.pagesperso-orange.fr/as400/hlphlp.html