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.