Instruction RPG full free · IBM i (AS/400) · Procédures, sous-programmes et erreurs
RETURN
Sortir d'une procédure ou du programme
Termine immédiatement la procédure ou le programme en cours et, pour une procédure qui renvoie une valeur, fournit cette valeur à l'appelant.
Syntaxe
RETURN;
RETURN expression;
expression- La valeur renvoyée. Elle est nécessaire si la procédure déclare un type de retour dans son
dcl-pi. Son type doit être compatible avec celui du retour. - Effet
- Rend la main à l'appelant. La valeur de l'expression devient le résultat de l'appel. Aucun indicateur ni fonction d'état n'est positionné.
À quoi ça sert
RETURN permet les sorties anticipées : on traite d'abord les cas particuliers (montant nul, client inconnu) avec un return immédiat, puis on écrit le cas général sans l'enfouir dans des if imbriqués. La procédure remise de l'exemple renvoie 0, 5 ou 2,5 selon l'encours du client, et chaque chemin possible se termine par un return.
Dans le programme principal, return met fin au programme. On l'écrit après *inlr = *on pour que le programme se ferme proprement.
Exemple 1 : Sorties anticipées avec et sans valeur
**free
// RETURN : sortir d'une procedure en renvoyant une valeur, ou sortir du programme.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-pr remise packed(5:2);
encours packed(9:2) const;
end-pr;
dcl-pr appel_sans_retour;
texte char(20) const;
end-pr;
dcl-s taux packed(5:2);
taux = remise(98000.00);
snd-msg 'Remise client Bernard : ' + %char(taux) + ' %';
taux = remise(1250.50);
snd-msg 'Remise client Dupont : ' + %char(taux) + ' %';
taux = remise(-320.00);
snd-msg 'Remise client Leroy : ' + %char(taux) + ' %';
appel_sans_retour('arret anticipe');
snd-msg 'Apres l appel';
*inlr = *on;
return;
snd-msg 'Apres RETURN du programme (jamais atteinte)';
dcl-proc remise;
dcl-pi *n packed(5:2);
encours packed(9:2) const;
end-pi;
if encours <= 0;
return 0;
endif;
if encours >= 10000;
return 5;
endif;
return 2.5;
end-proc;
dcl-proc appel_sans_retour;
dcl-pi *n;
texte char(20) const;
end-pi;
snd-msg 'Debut : ' + %trim(texte);
return;
snd-msg 'Fin de la procedure (jamais atteinte)';
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Remise client Bernard : 5.00 %
Remise client Dupont : 2.50 %
Remise client Leroy : .00 %
Debut : arret anticipe
Apres l appel
La procédure remise renvoie une valeur par trois return différents. Le programme appelle ensuite une procédure sans type de retour : son return; arrête la procédure avant la dernière ligne. À la fin du programme principal, return; termine tout : la dernière ligne n'est jamais exécutée.
Exemple 2 : Oublier le RETURN sur un chemin
**free
// RETURN : une procedure qui renvoie une valeur doit faire RETURN sur chaque chemin.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-pr categorie char(10);
solde packed(9:2) const;
end-pr;
snd-msg 'Solde 98000.00 : [' + %trim(categorie(98000.00)) + ']';
snd-msg 'Solde 45.10 : [' + %trim(categorie(45.10)) + ']';
snd-msg 'Solde -320.00 : [' + %trim(categorie(-320.00)) + ']';
snd-msg 'Suite du programme';
*inlr = *on;
dcl-proc categorie;
dcl-pi *n char(10);
solde packed(9:2) const;
end-pi;
if solde >= 10000;
return 'GRAND';
elseif solde >= 0;
return 'COURANT';
endif;
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Solde 98000.00 : [GRAND]
Solde 45.10 : [COURANT]
Erreur : RNX0224 - Valeur non renvoyée à la fin de la procédure RPG CATEGORIE.
La procédure categorie a deux return, mais aucun pour un solde négatif. Les deux premiers appels passent. Le troisième s'arrête avec l'erreur RNX0224 : la procédure s'est terminée sans valeur à renvoyer. Le message « Suite du programme » n'apparaît pas.
Le piège
Une procédure qui renvoie une valeur doit faire RETURN sur tous ses chemins. Le programme compile, passe en test avec des valeurs courantes, puis s'arrête en production sur le cas oublié avec RNX0224 - Valeur non renvoyée à la fin de la procédure RPG CATEGORIE. Terminez toujours une procédure à valeur de retour par un return final, y compris pour le cas « autre ».