%PARMS
Compter les paramètres reçus
Renvoie le nombre de paramètres réellement transmis à la procédure (ou au programme) en cours.
Syntaxe
%PARMS
- Résultat
- Un entier : le nombre de paramètres transmis par l'appelant, y compris ceux passés avec
*OMIT. Il vaut 0 quand l'appelant n'en passe aucun.
À quoi ça sert
Un paramètre déclaré avec options(*nopass) peut manquer à l'appel. Lire un tel paramètre sans précaution fait planter le programme. %PARMS dit combien de paramètres sont arrivés, donc jusqu'à quel rang on peut lire.
C'est la méthode historique pour écrire une procédure qui accepte plusieurs formes d'appel : avec 1, 2 ou 3 paramètres. Pour tester un paramètre précis, %PASSED est plus lisible.
Exemple 1 : Une même procédure appelée avec 1, 2 ou 3 paramètres
**free
// %PARMS : nombre de parametres recus par une procedure.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-pr prixTtc;
ht packed(9:2) const;
tva packed(5:2) const options(*nopass : *omit);
remise packed(5:2) const options(*nopass);
end-pr;
prixTtc(100);
prixTtc(100 : 5.5);
prixTtc(100 : 5.5 : 10);
prixTtc(100 : *omit : 10);
*inlr = *on;
dcl-proc prixTtc;
dcl-pi *n;
ht packed(9:2) const;
tva packed(5:2) const options(*nopass : *omit);
remise packed(5:2) const options(*nopass);
end-pi;
snd-msg 'Appel avec ' + %char(%parms()) + ' parametre(s)';
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Appel avec 1 parametre(s)
Appel avec 2 parametre(s)
Appel avec 3 parametre(s)
Appel avec 3 parametre(s)
La procédure prixTtc a un paramètre obligatoire et deux facultatifs. Chaque appel affiche le nombre reçu : 1, 2, puis 3.
Le dernier appel, prixTtc(100 : *omit : 10), passe *OMIT à la place de la TVA. %PARMS renvoie quand même 3 : un paramètre omis est un paramètre transmis.
Le piège
%PARMS compte les paramètres omis. Avec prixTtc(100 : *omit : 10), le résultat est 3, alors que le deuxième paramètre n'a aucune valeur. Tester %PARMS() >= 2 ne garantit donc pas que le paramètre 2 est lisible s'il accepte *OMIT : il faut alors ajouter %OMITTED.