Aller au contenu

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