Aller au contenu

%OMITTED

Paramètre passé avec *OMIT ?

Indique si l'appelant a passé *OMIT à la place d'un paramètre déclaré avec options(*omit).

Syntaxe

%OMITTED(paramètre)
paramètre
Le nom d'un paramètre de la procédure en cours, déclaré avec options(*omit).
Résultat
Un indicateur : *ON si l'appelant a passé *OMIT, *OFF sinon.

À quoi ça sert

*OMIT permet à l'appelant de dire « je n'ai pas de valeur pour ce paramètre » tout en gardant les paramètres suivants dans leur position. C'est utile quand le paramètre facultatif n'est pas le dernier de la liste, ce que *nopass ne permet pas.

La procédure teste %OMITTED et applique alors une valeur par défaut.

Exemple 1 : Un taux facultatif au milieu de la liste

**free
// %OMITTED : parametre transmis avec *OMIT ?
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-pr calcul;
  base packed(9:2) const;
  taux packed(5:2) const options(*omit);
end-pr;

calcul(200 : 10);
calcul(200 : *omit);

*inlr = *on;

dcl-proc calcul;
  dcl-pi *n;
    base packed(9:2) const;
    taux packed(5:2) const options(*omit);
  end-pi;
  dcl-s remise packed(9:2);

  if %omitted(taux);
    remise = base * 20 / 100;
    snd-msg 'Taux omis, 20 % par defaut : ' + %char(remise);
  else;
    remise = base * taux / 100;
    snd-msg 'Taux recu ' + %char(taux) + ' : ' + %char(remise);
  endif;
end-proc;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Taux recu 10.00 : 20.00
Taux omis, 20 % par defaut : 40.00

Avec le taux 10, la remise de 200 est 20,00. Avec *omit, la procédure applique 20 % par défaut : 40,00.

Exemple 2 : Lire un paramètre omis sans tester

**free
// %OMITTED : lire un parametre omis sans le tester plante.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-pr calcul;
  base packed(9:2) const;
  taux packed(5:2) const options(*omit);
end-pr;

calcul(200 : 10);
calcul(200 : *omit);

*inlr = *on;

dcl-proc calcul;
  dcl-pi *n;
    base packed(9:2) const;
    taux packed(5:2) const options(*omit);
  end-pi;
  dcl-s remise packed(9:2);

  remise = base * taux / 100;
  snd-msg 'Remise : ' + %char(remise);
end-proc;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Remise : 20.00
Erreur : MCH3601 - Pointeur non défini pour position mémoire référencée.

Le premier appel fonctionne (20,00). Le second passe *omit et la procédure lit quand même taux : erreur MCH3601, pointeur non défini.

Le piège

Un paramètre omis n'a pas de valeur lisible. Toute lecture de taux quand l'appelant a passé *omit arrête le programme avec MCH3601 (exemple 2). Testez %OMITTED avant, comme dans l'exemple 1.