Aller au contenu

%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.