%PARMNUM
Rang d'un paramètre
Renvoie la position (1, 2, 3…) d'un paramètre dans la liste des paramètres de la procédure.
Syntaxe
%PARMNUM(paramètre)
paramètre- Le nom d'un paramètre déclaré dans le
dcl-pide la procédure en cours. - Résultat
- Un entier : le rang du paramètre, en comptant à partir de 1.
À quoi ça sert
On compare le rang d'un paramètre au nombre de paramètres reçus (%PARMS) pour savoir s'il a été transmis. L'avantage sur un chiffre écrit en dur : si on insère un paramètre dans la liste, le test reste juste sans qu'on ait à le corriger.
Exemple 1 : Le rang comparé au nombre reçu
**free
// %PARMNUM : rang d'un parametre dans la liste de la procedure.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-pr saisie;
client char(10) const;
ville char(10) const options(*nopass);
montant packed(9:2) const options(*nopass);
end-pr;
saisie('Dupont' : 'Lyon');
saisie('Martin' : 'Brest' : 250);
*inlr = *on;
dcl-proc saisie;
dcl-pi *n;
client char(10) const;
ville char(10) const options(*nopass);
montant packed(9:2) const options(*nopass);
end-pi;
snd-msg 'Rang de client : ' + %char(%parmnum(client));
snd-msg 'Rang de ville : ' + %char(%parmnum(ville));
snd-msg 'Rang de montant: ' + %char(%parmnum(montant));
snd-msg 'Parametres recus : ' + %char(%parms());
// Un parametre a ete transmis si son rang est <= au nombre de parametres recus.
if %parms() >= %parmnum(montant);
snd-msg 'Montant transmis : ' + %char(montant);
else;
snd-msg 'Montant non transmis';
endif;
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Rang de client : 1
Rang de ville : 2
Rang de montant: 3
Parametres recus : 2
Montant non transmis
Rang de client : 1
Rang de ville : 2
Rang de montant: 3
Parametres recus : 3
Montant transmis : 250.00
Le premier appel passe 2 paramètres, le second 3. Les rangs sont toujours 1, 2 et 3, quel que soit l'appel. Le test %parms() >= %parmnum(montant) répond donc « non transmis » au premier appel et « transmis » au second.
Le piège
Seul un paramètre de la procédure est accepté. Avec une variable locale, le compilateur refuse (message RNF0369 : le paramètre de %PARMNUM n'indique pas le nom d'un paramètre). Et le rang ne dit rien de la présence du paramètre à l'appel : c'est la comparaison avec %PARMS qui répond.