Utiliser un sous fichier à cocher

Vous pouvez utilisez des sous fichiers pour faire des sélections par case à cocher, ce qui améliore la gestion des écrans pour les utilisateurs

Voici 2 exemples

Sélection unique

Mot clé SFLSNGCHC,
https://www.ibm.com/docs/en/i/7.4?topic=dkedfp4t8-sflsngchc-subfile-single-choice-selection-list-keyword-display-files

Le DSPF

 A*%%TS  SD  20231024  203749  QSECOFR     REL-V7R4M0  5770-WDS
     A* SOUS FICHIER À CHOIX MULTIPLE
     A*
     A*%%EC
     A                                      DSPSIZ(24 80 *DS3)
     A                                      CA03(03)
     A          R SFL01                     SFL
     A*  ZONE À COCHER
     A            ZONCTL         1Y 0H      SFLCHCCTL
     A            ZONE          10A  O  4 10
     A          R CTL01                     SFLCTL(SFL01)
     A*%%TS  SD  20231024  203749  QSECOFR     REL-V7R4M0  5770-WDS
     A                                      SFLPAG(0005)
     A                                      WINDOW(5 5 9 31)
     A* SOUS FICHIER A SELECTION UNIQUE
     A                                      SFLSNGCHC(*SLTIND *AUTOSLT)
     A* TAILLE DYNAMIQUE À FOURNIR
     A                                      SFLSIZ(&SFLSIZ)
     A                                      SFLDSP
     A                                      SFLDSPCTL
     A  41                                  SFLCLR
     A  45                                  SFLEND(*SCRBAR *SCRBAR)
     A* LIGNE EN COURS  < FOURNIT PAR LE SYSTÈME
     A            DEMANDE        5S 0H      SFLSCROLL
     A* LIGNE DE LA PAGE À AFFICHER > A FOURNIR PAR LE PROGRAMME
     A            LIGNE          4S 0H      SFLRCDNBR(*TOP)
     A* TAILLE DU SOUS FICHIER > A FOURNIR PAR LE PROGRAMME
     A            SFLSIZ         5S 0P
     A* CLÉ DU SOUS FICHIER
     A            CLE01          4Y 0H
     A                                  2 01'Sous Fichier Sélection Simple'

Le RPGLE

**free
// sous fichier à choix unique
ctl-opt DFTACTGRP(*NO) ;
dcl-f BOUTON8 WORKSTN
  SFILE(sfl01:cle01) ;
dcl-s i                int(10) ;
 // Initialisation du sous fichier
  SFLSIZ = 10;
  LIGNE = 1;
  cle01 = 0 ;
  *in41  = *on ;
  write ctl01 ;
  *in41  = *off ;
  // Chargement  du sous fichier
  cle01 =  cle01+1 ;
  zone = 'AAAAAAAAA' ;
  Write sfl01;
  cle01 =  cle01+1 ;
  zone = 'BBBBBBBBB' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'CCCCCCCCC' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'DDDDDDDDD' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'EEEEEEEEE' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'FFFFFFFFF' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'GGGGGGGGG' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'HHHHHHHHH' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'IIIIIIIII' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'JJJJJJJJJ' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'KKKKKKKKK' ;
  Write sfl01;
  // Boucle d'affichage
  dou *in03 ;
    exfmt ctl01 ;
    if not *in03;
  // Lecture de l'enregistrement sélectionné
      readc sfl01                       ;
      if not %eof() ;
        dsply zone                        ;
        ZONCTL  = 0                       ;
        update(e) sfl01                      ;
        LIGNE  = demande ;
      endif ;
    endif ;
  enddo ;
  *inlr = *on ;

Sélection multiple

Mot clé SFLMLTCHC
https://www.ibm.com/docs/en/i/7.4?topic=dkedfp4t8-sflmltchc-subfile-multiple-choice-selection-list-keyword-display-files


Le DSPF

A*%%TS  SD  20231025  044340  QSECOFR     REL-V7R4M0  5770-WDS
     A* SOUS FICHIER À CHOIX MULTIPLE
     A*
     A*%%EC
     A                                      DSPSIZ(24 80 *DS3)
     A                                      CA03(03)
     A          R SFL01                     SFL
     A*  ZONE À COCHER
     A            ZONCTL         1Y 0H      SFLCHCCTL
     A            ZONE          10A  O  4 10
     A          R CTL01                     SFLCTL(SFL01)
     A*%%TS  SD  20231025  043531  QSECOFR     REL-V7R4M0  5770-WDS
     A                                      SFLDSP
     A                                      SFLDSPCTL
     A  41                                  SFLCLR
     A  45                                  SFLEND(*SCRBAR *SCRBAR)
     A* TAILLE DYNAMIQUE À FOURNIR
     A                                      SFLSIZ(&SFLSIZ)
     A                                      SFLPAG(0005)
     A                                      WINDOW(5 5 9 31)
     A* SOUS FICHIER A SELECTION MULTIPLE
     A                                      SFLMLTCHC(&NBSEL *SLTIND)
     A* LIGNE EN COURS  < FOURNIT PAR LE SYSTÈME
     A            DEMANDE        5S 0H      SFLSCROLL
     A* LIGNE DE LA PAGE À AFFICHER > A FOURNIR PAR LE PROGRAMME
     A            LIGNE          4S 0H      SFLRCDNBR(*TOP)
     A* TAILLE DU SOUS FICHIER > A FOURNIR PAR LE PROGRAMME
     A            SFLSIZ         5S 0P
     A* NOMBRE DE SELECTIONS   < FOURNIT PAR LE SYSTÈME
     A            NBSEL          4Y 0H
     A* CLÉ DU SOUS FICHIER
     A            CLE01          4Y 0H
     A                                  2  1'Sous Fichier Sélection Multiple'
     A                                      DSPATR(HI)

Le RPGLE

**free
// sous fichier à choix multiple
ctl-opt DFTACTGRP(*NO) ;
dcl-f BOUTON7 WORKSTN
  SFILE(sfl01:cle01) ;
dcl-s i                int(10) ;
 // Initialisation du sous fichier
  SFLSIZ = 10;
  LIGNE = 1;
  cle01 = 0 ;
  *in41  = *on ;
  write ctl01 ;
  *in41  = *off ;
  // Chargement du sous fichier
  cle01 =  cle01+1 ;
  zone = 'AAAAAAAAA' ;
  Write sfl01;
  cle01 =  cle01+1 ;
  zone = 'BBBBBBBBB' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'CCCCCCCCC' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'DDDDDDDDD' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'EEEEEEEEE' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'FFFFFFFFF' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'GGGGGGGGG' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'HHHHHHHHH' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'IIIIIIIII' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'JJJJJJJJJ' ;
  Write sfl01;
  cle01 = cle01+1 ;
  zone = 'KKKKKKKKK' ;
  Write sfl01;
  // Boucle d'affichage
  dou *in03 ;
    exfmt ctl01 ;
    if not *in03;
  // Traitement des enregistrements cochés
      for i = 1 to nbsel ;
        readc sfl01                       ;
        if not %eof();
          dsply zone                        ;
          ZONCTL  = 0                       ;
          update(e) sfl01                      ;
          LIGNE  = demande ;
        endif ;
      endfor;
    endif ;
  enddo ;
  *inlr = *on ;

Remarques:

Vous devez compiler avec l’option ENHDSP(*YES)

Pour les sélection simple , vous pouvez utiliser une alternative aux cases à cocher, SFLCSRRRN qui renvoit la clé de l’enregistrement lu sans faire un READC

Utilisation de cases à cocher

Vous pouvez dans vos DSPF utiliser des cases à cocher, ce qui les rendra plus sympathique sans passer sur un vrai interface graphique.

Voici deux exemples d’utilisation.

1) A choix unique

C’est le mot clé SNGCHCFLD qui permet de les définir.

https://www.ibm.com/docs/en/i/7.4?topic=dkedfp4t8-sngchcfld-single-choice-selection-field-keyword-display-files

Le DSPF

A* Case à cocher                                                      
A* Bouton à choix unique                                              
A                                      DSPSIZ(24 80 *DS3)             
A                                      CA03(03)                       
A          R FMT01                                                    
A                                  1 20'Zone choix simple'            
A                                  3  2'Sexe :'                       
A            F1             2Y 0B  3 20SNGCHCFLD(*AUTOSLT (*NUMCOL 3))
A                                      CHOICE(1 '>Homme  ')           
A                                      CHOICE(2 '>Femme  ')           
A                                      CHOICE(3 '>Inconnu')           
A                                 23 02'F3=Exit'                      

Le programme RPGLE

**free                                           
ctl-opt DFTACTGRP(*NO) ;                         
dcl-f BOUTON5 WORKSTN ;                          
  dou *in03 ;                                    
    exfmt fmt01 ;                                
    if not *in03;                                
      dsply ('Valeur sélectionée ' + %char(f1)) ;
    endif ;                                      
  enddo ;                                        
  *inlr = *on ;                                  

2) A choix multiple

C’est le mot clé MLTCHCFLD qui permet de les définir.

https://www.ibm.com/docs/en/i/7.4?topic=dkedfp4t8-mltchcfld-multiple-choice-selection-field-keyword-display-files

Le DSPF

A* Case à cocher                                             
A* Bouton à choix multiple                                   
A                                      DSPSIZ(24 80 *DS3)    
A                                      CA03(03)              
A          R FMT01                                           
A                                  1 20'Zone choix multiple' 
A                                  3  2'Plat :'              
A            F1             2Y 0B  3 20MLTCHCFLD((*NUMCOL 3))
A                                      CHOICE(1 'Entrée   ') 
A                                      CHOICE(2 'Plat     ') 
A                                      CHOICE(3 'Dessert  ') 
A                                      CHCCTL(1 &CHOIX1  )   
A                                      CHCCTL(2 &CHOIX2  )   
A                                      CHCCTL(3 &CHOIX3  )   
A            CHOIX1         1Y 0H                            
A            CHOIX2         1Y 0H                            
A            CHOIX3         1Y 0H                            
A                                 23 02'F3=Exit'                                                               

Le programme RPGLE

**free                                    
ctl-opt DFTACTGRP(*NO) ;                  
dcl-f BOUTON6 WORKSTN ;                   
  dou *in03 ;                             
    exfmt fmt01 ;                         
    if not *in03;                         
      dsply ('Entrée  ' + %char(choix1)) ;
      dsply ('Plat    ' + %char(choix2)) ;
      dsply ('Dessert ' + %char(choix3)) ;
    endif ;                               
  enddo ;                                 
  *inlr = *on ;                                                                                                      

Remarque :

Vous pouvez utiliser des variables ou des identifiants de message comme texte associé.

*NUMCOL sert à mettre les options sur la même ligne , par défaut elles sont en colonne.

, , Convertir les carte H, D et F sous RDI

Vous utilisez RDI pour éditer vos programmes RPGLE et vous avez des cartes de déclaratives

H,D,F et vous voulez les convertir en free , voici 2 solutions simples

Solution 1, en ligne sur notre site

https://www.volubis.fr/convertisseur.html

Collez votre sélection dans le formulaire et appuyer sur le bouton Convert

Il vous faudra recopier votre sélection.

Solution 2, installez un plugin Eclipse

Craig Rutledge en a créé un bien il est disponible ici

https://jcrcmds.sourceforge.net/eclipse/rdi8.0/

Suivez la procédure pour paramétrer le plugin dans RDI et l’installation de la bibliothèque JCRCMDS s’il elle n’existe pas sur votre partition, c’est la commande JCRHDF qui sera utilisée, vous pouvez également l’utiliser en 5250, si vous le désirez

L’utilisation est très simple dans un source de type RPGLE ou SQLRPGLE , vous avez une nouvelle option sur le clic droit, JCRCMDS.

.

.

.

Voila , simple et efficace

Fenêtre sans le mot clé WINDOW

Vous connaissez tous le mot clé WINDOW dans les DDS qui vous permet d’afficher une fenêtre.

Cette solution a certaine contraintes comme les réaffichages par exemple.

Voici une alternative qui permet d’afficher une fenêtre sans utiliser ce mot clé

Le code l’écran

     A*%%TS  SD  20231003  225454  PLB         REL-V7R4M0  5770-WDS
     A* EXEMPLE DE FENETRE SANS WINDOW
     A*
     A*%%EC
     A                                      DSPSIZ(24 80 *DS3)
     A                                      USRDSPMGT
     A                                      INDARA
     A          R FMT01
     A*%%TS  SD  20231003  225454  PLB         REL-V7R4M0  5770-WDS
     A                                      CA03(03)
     A                                      CA12(12)
     A                                      SLNO(01)
     A                                      CLRL(*NO)
     A            TITRE         25A  O 15 45DSPATR(HI)
     A                                      DSPATR(RI)
     A                                 16 45' '
     A                                      DSPATR(HI)
     A                                      DSPATR(RI)
     A            TEXTE01       21A  O 16 47
     A                                 16 69' '
     A                                      DSPATR(HI)
     A                                      DSPATR(RI)
     A                                 17 45' '
     A                                      DSPATR(HI)
     A                                      DSPATR(RI)
     A            TEXTE02       21A  O 17 47
     A                                 17 69' '
     A                                      DSPATR(RI)
     A                                      DSPATR(HI)
     A                                 18 45' '
     A                                      DSPATR(HI)
     A                                      DSPATR(RI)
     A            TEXTE03       21A  O 18 47
     A                                 18 69' '
     A                                      DSPATR(HI)
     A                                      DSPATR(RI)
     A                                 19 45' F2=Valider       F3=Fin '
     A                                      DSPATR(HI)
     A                                      DSPATR(RI)

Le programme RPGLE

**free
// Affiche une fenêtre sans window
// renvoi OK si vous appuyez sur <ENTER>
// renvoi KO si vous appuyez sur F3 ou F12
// call fenetre ('Titre' 'texte01' 'texte02' 'texte03' ' ')
dcl-f fenetre  workstn  ;
  dcl-pi *N ;
   Titre   char(25);   // Titre fenêtre
   Texte01 char(21);   // texte première ligne
   Texte02 char(21);   // texte deuxiéme ligne
   Texte03 char(21);   // texte troisième ligne
   Retour  char(2);    // code retours
  end-pi ;
if %parms = 0 ;
  dsply ('Ce programme nécessite 6 paramètres') ;
else ;
  // Affichage format
  Exfmt FMT01 ;
  if *in03 or *in12 ;
    Retour = 'KO' ;
  else ;
    Retour = 'OK' ;
  endif ;
endif;
// Fin de programme
*inlr = *on ;

Exemple :

call fenetre (‘Titre’ ‘texte01’ ‘texte02’ ‘texte03’ ‘ ‘)


, , , Effacer la log de votre travail

Vous faites le l’administration, le plus souvent en 5250 sous l’écran de commandes IBMI
==> call QCMD

Vous voulez effacer la log que vous voyez par la commande DSPJOBLOG.

La première solution consiste à vous déconnecter, du coup la log est effacée ou transformée en spool.

Cette méthode efface tout le contexte mis en place, liste de bibliothèques , variables d’environnement, objets dans QTEMP que vous avez peut être mis beaucoup de temps à construire dans vos tests.

L’idée c’est d’avoir une solution moins radicale qui permette de n’effacer que la log de votre travail, c’est pourquoi vous devriez avoir dans vos tools un outil comme celui la

Une commande qu’on a appelé astucieusement CLRLOG que vous pouvez trouver ici

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

Comme le code est simple on le remet ici

On utilise la commande RMVMSG qui n’est utilisable que dans un programme CLLE

Le programme en CLLE

 PGM /*------------------------------------*/        
 /* Supprime les messages de votre log     */        
 /* Ne supprime pas les messages *PGMQ     */        
 /*----------------------------------------*/        
              RMVMSG     PGMQ(*ALLINACT) CLEAR(*ALL) 
              RMVMSG     PGMQ(*EXT) CLEAR(*ALL)      
 ENDPGM                                              

La commande

 /* Supprime les messages de votre log     */ 
CMD        PROMPT('Clearer la log de votre job') 

Remarque :

Cette commande n’efface pas les messages de type *PGMQ

, Différence touche CAXX et touche CFXX

Vous avez encore des développements en 5250 avec des DSPF et vous vous posez la question : dois je utiliser une touche CA ou CF ?

Nous allons essayer de vous apporter quelques éclaircissements sur les usages et les bonnes pratiques

Première chose, vous pouvez utiliser une touche de fonction de 2 manières

CA03(03)
ou
CA03 uniquement

Avec CA03(03), vous testerez *IN03 dans vos programmes RPGLE et &IN03 en CLLE.
Avec CA03, vous testerez *INKC dans vos programmes RPGLE et c’est plus compliqué à gérer en CLLE.

Jusque la on utilisait les indicateurs *inka … pour économiser les indicateurs de 01 à 24 (99 disponibles),
sur les nouveaux développement on utilise moins d’indicateurs et plus de fonctions intégrées comme %EOF(). Il est donc conseillé d’utiliser les indicateurs *IN01 à *IN24 ; de plus vous pouvez les renommer pour rendre plus lisible dans les programmes !

Pour ce faire, vous devez déclarer votre écran en INDARA pour indiquer que les indicateurs sont séparés du flux des données.

A* Niveau fichier dans le dds :
A INDARA

Dans le source du programme RPG :
dcl-f
MONECR WORKSTN
indds(DS_Ind)
;
Dans les déclaration :

Dcl-DS DS_Ind len(99);
// Touches de fonctions
Sortie ind pos(3);
Liste ind pos(4);
Reaffichage ind pos(5);
Creer ind pos(6);
Valider ind pos(10);
Annuler ind pos(12);

End-DS;

Conseil

Comme vous devez vous baser sur la NORME AUA , vous pouvez faire un include avec ces touches de fonction.

dans le code vous pouvez indiquer :


IF SORTIE ;

Comment déclarer les touches dans vos DDS ?
Vous pouvez les déclarer

  • au niveau du fichier, votre touche sera utilisable dans tous les formats.
    C’est le cas par exemple de CA03 pour sortir.
  • au niveau du format, on ne peut pas redéclarer une touche déjà décrite au niveau fichier

Exemple :


A* niveau fichier
A CA03(03)
A R PREMIER
A
A R DEUXIEME
A* niveau du format
A CA12(12)

vous pourrez utiliser :
CA03 sur le format PREMIER
CA03 et CA12 sur le DEUXIEME

Plus vous serez précis dans vos déclarations, plus vos programmes serons clairs et précis.
Toutes les touches déclarées dans les formats doivent être traitées dans le code.
Si vous utilisez une touche dans un programme et qu’elle n’est pas traitée … ça peut poser problème, du genre mise à jour sans lecture de l’écran.

Pourquoi CA et pas CF !?

Pour vous expliquer nous avons choisi de faire ce petit exemple (écran + programme RGPLE)

le programme CACF

**free                                
Ctl-Opt DFTACTGRP(*NO) ;              
Dcl-f CACF      WORKSTN ;             
dou *in07 or *in08                  ; 
  exfmt fmt01                       ; 
  dsply zone                        ; 
enddo                               ; 
*inlr = *on                         ; 

Et l’écran CACF

     A*%%TS  SD  20230914  164942  PLB         REL-V7R4M0  5770-WDS             
     A*%%EC                                                                     
     A                                      DSPSIZ(24 80 *DS3)                  
     A          R FMT01                                                         
     A*%%TS  SD  20230914  164942  PLB         REL-V7R4M0  5770-WDS             
     A                                      CA07(07)                            
     A                                      CF08(08)                            
     A                                  4 10'Test pour comprendre la différence-
     A                                       entre une touche CA et CF'         
     A                                      DSPATR(HI)                          
     A                                  9 10'Saisir une valeur ici '            
     A                                  9 33':'                                 
     A            ZONE           1A  B  9 35VALUES('1' '2')                     
     A                                  9 38'Veuillez saisir 1 ou 2'            
     A                                      DSPATR(HI)                          
     A                                 20 10'CA07==> Sortir sans lecture'       
     A                                 21 10'CF08==> Sortir avec lecture'       

Où il est possible d’utiliser les touches de fonction 07 déclarée CA et 08 déclarée CF.

f

Premier test

Vous tapez directement F7 ou F8, le comportement est le même si votre buffer n’a pas été modifié, il n’y a pas de lecture.
Pour déterminer si le buffer est modifié le système se sert d’un octet attribut (dans le format ou dans la zone) dans le quel on un MDT qui sera à *ON.
Si le buffer ou la zone à été modifiée. vous devrez forcer ce tag dans le cas ou contrôlez des données.

C’est le mot clé DSPATR(MDT) dans les DDS qui permet ça, vous pouvez le conditionner par un indicateur.

Deuxième test

Vous saisissez 9 dans l’écran.
F7 sort directement et tient pas compte de la saisie, c’est ce qui convient pour les touches F3 ou F12.
F8 déclenche une lecture avant de sortir et comme on a fait le choix de contrôler la valeur saisie à 1 ou 2, on est bloqué jusqu’à ce qu’on ait renseigné la zone à la bonne valeur,
C’est ce qui convient pour les touches F6 ou F10.
On imagine bien que si vous avez 10 zones avec contrôles, ça poser problèmes quel que soit le contrôle

Rappel sur l’ordre à faire sur vos contrôles

1) Contrôle de valeurs, gérer par VALUES() ou CHECK() dans le DDS, aucun code à traiter côté programme.

2) Contrôles de dépendance exemple borne début < borne de fin (toutes les informations de l’écran sont suffisantes pour le contrôle).

3) Contrôles nécessitants une ressource externe, le plus souvent en base de données (saisie d’un numéro de client à contrôler).

La règle si la valeur saisie n’est pas bonne ce n’est pas la peine de faire le contrôle suivant !

Conseil :
Soyez précis dans vos déclarations dans le niveau format ou tous les format au fichier.
et n’utilisez les touches CF que quand vous devrez traiter les données de l’écran.

Merci à Nicolas pour son aide !

, Tables avec informations de création et modification

Comment gérer simplement les informations de modifications sur les enregistrements
utilisateur + date de création ou de modification

Vous connaissez la méthode applicative par sql ou update

Vous connaissez la méthode par trigger after, vous modifiez les zones dans le buffer après avec les informations en cours.

Voici un solution ou vous n’avez rien à faire, vous laissez faire SQL

Soit la table suivante des applications :

CREATE TABLE APPLICATION1 FOR SYSTEM NAME APPLICAT1 (
DESCRIPTION_APPLICATION FOR COLUMN DES_APP CHAR(50) NOT NULL WITH DEFAULT,
APPLICATION_CODE FOR COLUMN APP_COD CHAR(8) NOT NULL WITH DEFAULT,

/* Informations de mise à jour */
APPAUSRCHG VARCHAR(18) GENERATED ALWAYS AS (USER),
APPATMPCHG TIMESTAMP FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP NOT NULL,
APPAUSRCRT CHAR(18) NOT NULL DEFAULT USER IMPLICITLY HIDDEN,
APPATMPCRT TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP IMPLICITLY HIDDEN
)
Explications :

GENERATED ALWAYS AS (USER), indique que la zone est systématiquement forcée avec l’utilisateur en cours
FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP indique qu’a chaque modification, vous aurez la date en cours
DEFAULT USER indique valeur par défaut utilisateur en cours
DEFAULT CURRENT_TIMESTAMP indique valeur par défaut date en cours
HIDDEN indique que la zone n’apparaitra pas dans un select *

Exemple d’insertion

INSERT INTO GDATA.APPLICATION1 (
DESCRIPTION_APPLICATION,APPLICATION_CODE ) VALUES ( ‘TEST’, ‘TEST’ )

Exemple de mise à jour

UPDATE GDATA.APPLICATION1
SET
DESCRIPTION_APPLICATION = ‘TEST2’,
APPLICATION_CODE = ‘test2’
WHERE DESCRIPTION_APPLICATION = ‘TEST’

Visualisation du résultat

Sauf zones cachées


SELECT * ROM GDATA.APPLICATION1

Avec les zones cachés

SELECT DESCRIPTION_APPLICATION, APPLICATION_CODE, APPAUSRCHG,
APPATMPCHG, APPAUSRCRT, APPATMPCRT FROM GDATA.APPLICATION1

Remarques :
Les zones user devront être sur 18 en varchar
Vous devez utiliser le format explicite pour la création
Voila , Simple et efficace
Merci à Patrick pour son exemple de code

Ajouter de l’aide à vos DSPF

Vous voulez ajouter de l’aide à vos écrans DSPF ?

Nous allons vous présenter la méthode que nous utilisons en interne.

Nous avons choisi, comme format, les aides en UIM (panel de groupe).

Pour mettre en place de l’aide sur vos écrans vous devez faire 2 choses :

Mettre en place les mots clés dans le source de votre DSPF

D’abord au niveau fichier (au début du source) :

A                                      HLPTITLE('AIDE GPARAME')   
A                                      HLPPNLGRP(GPARAME GPARAME) 
A                                      ALTHELP(CA01)              
A                                      HELP                       
  • HLPTITLE indique le titre de votre fenêtre d’aide
  • HLPPNLGRP indique le nom du panel de groupe (conseil : mettre le même nom)
  • HELP pour pouvoir utiliser la touche de fonction Aide
  • ALTHELP pour indiquer que l’aide pourra être invoqué par F1, ce qui est le standard AUA

Ensuite au niveau du format (après la carte qui contient le R du format correspondant) :

A          H                           HLPPNLGRP('GPARAME/GLOG GPARAME')
A                                      HLPARA(*FLD GLOG)                
  • HLPPNLGRP indique le panneau d’aide et le groupe
  • HLPARA aire pour laquelle ce panneau sera affiché, *FLD pour indiquer une zone

https://www.ibm.com/docs/en/i/7.5?topic=80-hlppnlgrp-help-panel-group-keyword-display-files

Créer votre panneau d’aide

Vous devez coder un source en UIM, qui correspond aux déclarations que vous avez indiqué dans votre DSPF :

                                       
:PNLGRP.                                        
:HELP NAME = 'GPARAME' .AIDE (GPARAME).         
:XH3. AIDE GPARAME.                             
:P.                                             
Ce programme vous permet de (ici descriptif général du programme)                
:EHELP.                                         
:HELP NAME = 'GPARAME/GLOG' .AIDE (GLOG).       
:XH3. AIDE GLOG.                                
:P.                                             
Cette zone (ici descriptif de la zone)                                 
:EHELP.  
...
:EPNLGRP.                                        

C’est relativement simple à faire, vous pouvez utiliser tout le langage UIM.

Pour en savoir plus sur UIM : https://www.ibm.com/docs/en/i/7.4?topic=interfaces-user-interface-manager

Vous devez compiler votre panel de groupe :

==> CRTPNLGRP PNLGRP(lib/pannel) SRCFILE(libsrc/QPNLSRC)

Voici un exemple de ce que cala donne en faisant <F1> sur une Zone ici numéro de série

Pour vous aider, nous proposons un outil qui vous permet de générer les mots clés nécessaires pour le DSPF et le squelette de votre panel de groupe. Vous pouvez trouver l’outil ICI il s’appelle GENUIMDSP :

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

Vous devez indiquer le fichier écran , le source avec les mots clés ici QDDSSRC, le squelette du panel ici dan QPNLSRC.

Remarque :

L’outil n’est pas parfait mais, il vous aide bien, si vous voulez contribuer, n’hésitez pas !

L’ajout des mots clés dans le DSPF ne change pas la commande de compile, ni les niveaux des formats dans lesquels vous ajoutez des aides.

La liaison est dynamique et si l’aide n’est pas trouvée, il n’y a pas de plantage donc pas de régression applicative, vous aurez « juste » le message suivant :

Ça peut être intéressant quand vous faites de la maintenance d’ajouter des aides, et avec notre méthode c’est rapide, simple et efficace.

Merci à Julien et Yoann pour leur aide.

IA et développement IBMI

Vous avez tous entendu parler de l’IA et de Chat GPT ou Bard (Google).

Nous avons décidé de faire quelques tests.

Tout n’est pas parfait mais le résultat est parfois bluffant.

Sur Chat GPT, ici https://chat.openai.com/

Nous avons fait des tests sur du CLP

Exemple :

Résultat

Nous avons fait des tests du RPG

Exemple

Résultat

C’est plus décevant il génére en colonné mais sur les demandes simples ce n’est pas mal du tout

Je ne sais pas pourquoi, il met **FREE au début ??

Du coup nous lui avons également demandé de traduire du code RPGLE colonné vers FREE
sur les carte c ce n’est pas mal

Et Sur les DDS

Voici la réponse

Sur BARD ici https://bard.google.com/u/1/

Il ne connait visiblement pas l’Ibmi, il n’y a pas de résultat probant ?

Conclusion:

Tout n’est pas parfait, mais ça progresse et les logiciels apprennent rapidement.
Le conseil, il faut être précis, n’hésitez pas à le conseiller

A suivre …

, , , Exemple de panel liste

C’est une solution à base d’UIM qui permet de gérer des sous fichiers sans écran DDS, en utilisant un panel de groupe et des API pour le manipuler.

Toutes les commandes WRKXXX de votre IBMi sont codées avec cette solution.

Nous allons vous présenter un exemple pour les PF par exemple vous trouverez le code sur github ici https://github.com/Plberthoin/PLB/tree/master/WRKPF

Cet article est inspiré à l’origine d’un article de mcpressonline, j’ai remis le RPG à jour

Vous devrez avoir un PNLGRP avec la structure suivante, pour indiquer les listes

:PNLGRP.

:CLASS.
:ECLASS.

:VAR.

:VARRCD.

:LISTDEF.

:KEYL.
:KEYI.
:EKEYL.

:PANEL.
.
.
:LIST.

:LISTACT.
:LISTCOL.
:LISTVIEW.
.
.
.
:ELIST.
.
:CMDLINE.
.
:EPANEL.
.
.
.
:HELP.
.
.
.
:EHELP.

:EPNLGRP.

Vous aurez un programme ici en RPG qui va utiliser les API suivantes :

Api Utilisation

QUIOPNDA Ouverture du panel création du Handle
QUIPUTV Renseignement variable
QUIADDLE Ecriture d’un poste dans la liste
QUIDSPP Affichage du panel
QUIDLTL Suppression du contenu de la liste
QUICLOA Fermeture du panel

Rappel, vous pouvez chercher les APIs disponibles sur votre IBMi avec API-FINDER disponible

ici https://www.ibm.com/docs/en/i/7.5?topic=interfaces-api-finder

Conclusion

C’est une solution standard qui ne nécessite pas de DSPF, mais qui nécessite de connaitre un peu le langage UIM.
Avec un squelette de PNL et de programme on peut créer des outils WRKXXX rapidement, idéal pour les outils d’administration par exemple