Accueil du site > Les articles > Appel d’une procédure REXX à partir d’un programme RPG
Version à imprimer Enregistrer au format PDF

Appel d’une procédure REXX à partir d’un programme RPG

Utilisation de la data queue externe permettant les échanges entre REXX et d’autre langages via l’API QREXQ

vendredi 25 novembre 2005, par David Malle Visites  3009

Pour évaluer une expression numérique, il est très utile d’utiliser une procédure REXX. Mais comment l’appeler à partir d’un programme écrit en RPG, et récupérer la valeur calculée par la procédure REXX.


Voir en ligne : REXX/400 Programmer’s Guide

Avertissements

Cet article contient des exemples de codes et non un utilitaire finalisé. Consultez la documentation IBM sur le REXX pour aller plus loin.

Création de la procédure REXX

- Créer un membre CALCEXP dans le fichier source BIBSRC/QREXSRC et taper le code suivant dans le membre CALCEXP :

numeric digits 31      
arg extarg              
myval = "value =" extarg
interpret myval        
push value              
return 0                

Contenu du programme RPG

- Description de la procédure d’appel d’une commande CL :

     *                                                      
     * Pour exécution de commande CLP                      
    DCommande         S            250                      
    DCLPCMD           PR                  EXTPGM('QCMDEXC')
    D cmd                          250                      
    D cmdlen                        15P 5 CONST            

- Appel de la commande CL pour éxécuter la procédure REXX :

   
     /free                                            
        //  ------------------------------------------
        //  Création du fichier de travail dans QTEMP.
        //  Commitment désactivé.                    
        //  ------------------------------------------
        Commande = 'STRREXPRC SRCMBR(CALCEXP) ' +
                   'SRCFILE(BIBSRC/QREXSRC) ' +
                   'PARM(''125 + 69 * (12 / 3)'')';
        CLPCMD(commande:%size(commande));    
     /end-free                      

- Récupérer le résultat dans la variable REP d’un programme RPG via l’API QREXQ qui permet d’écrire et lire les données entre REXX et d’autres langages, via une data queue.

     *- Déclaration des variables
    D LNG             S              5  0
    D REP             S            256  
    D WMIC£5          S            256
    D WMIC£6          S              1
    D WMIPGM          S             10    
    DB£REX1           DS                  INZ
    D WMIB£1                  1      4B 0    
    D WMIB£2                  5      8B 0    
    D WMIB£3                  7     10B 0        
    C*- Lire la queue                                
    C                   MOVEL     'QREXQ'       WMIPGM
    C                   MOVEL     *BLANK        WMIC£5
    C                   MOVEL     'P'           WMIC£6
    C                   Z-ADD     256           WMIB£1
    C                   Z-ADD     0             WMIB£2
    C                   Z-ADD     0             WMIB£3
    C                   CALL      WMIPGM              
    C                   PARM                    WMIC£6
    C                   PARM                    WMIC£5
    C                   PARM                    WMIB£1
    C                   PARM                    WMIB£2
    C                   PARM                    WMIB£3
    C                   MOVEL     *BLANK        REP  
    C                   MOVEL     WMIC£5        REP  

- En résumé : appel de la procédure REXX avec en paramètre l’expression mathématique à évaluer (ici ’125 + 69 * (12 / 3)’), puis lecture de la data queue via QREXQ pour récupérer le résultat calculé par la procédure REXX.
- Le résultat obtenu dans REP doit normalement être : 401

Que faire en plus ?

- Paramétrer le passage de l’expression mathématique à évaluer dans une variable pour rendre dynamique l’appel de la procédure REXX.
- Tester le 5ème paramètre (WMIB£3) qui représente le code retour (succès ou erreur).
- Plein d’autres choses.

Quelle utilisation ?

- Vous mettez en place une saisie de paramétrage pour des calculs.

  • Par exemple, l’utilisateur peut saisir dans un fichier : QTE_CMD * PRIX * CAT_PROF1 ou QTE_CMD * PRIX * CAT_PROF2.
  • QTE_CMD représente une variable contenant la quantité commandée pour un article, PRIX représente une variable contenant le prix de l’article commandé, CAT_PROF1 représente le taux de réduction appliqué à la catégorie professionnelle 1, et CAT_PROF2 représente le taux de réduction appliqué à la catégorie professionnelle 2.

- Lors de la lecture du paramétrage, vous obtenez la chaîne de caractère ’QTE_CMD * PRIX * CAT_PROF1’ :

  • Remplacer dans la chaine de caractère ’QTE_CMD * PRIX * CAT_PROF1’ QTE_CMD par sa valeur en numérique, idem pour PRIX et CAT_PROF1. Pour obtenir par exemple : ’3 * 15.7 * 0.90’.
  • Passer la chaine en paramètre lors de l’appel de la procédure REXX.
  • Vous obtenez en retour l’expression calculée.

- Lors de la lecture du paramétrage, vous obtenez la chaîne de caractère ’QTE_CMD * PRIX * CAT_PROF2’ :

  • Remplacer dans la chaine de caractère ’QTE_CMD * PRIX * CAT_PROF2’ QTE_CMD par sa valeur en numérique, idem pour PRIX et CAT_PROF2. Pour obtenir par exemple : ’3 * 15.7 * 0.85’.
  • Passer la chaine en paramètre lors de l’appel de la procédure REXX.
  • Vous obtenez en retour l’expression calculée.

Conclusion

La puissance de la solution, est que vous pouvez saisir une expression mathématique complexe : opérateurs (*, +, -, /, ...), paranthèses gauche et droite. Du moment que la chaîne représente une opération mathématique correcte, cela fonctionne. Une solution souple et efficace de paramétrage.

Attention si vous appelez la procédure à répétition dans des traitements de masse, car il y a tout de même un fort impacte sur les performances.

P.-S.

Voir aussi les articles :

- REXX400
- Calculatrice en REXX