Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Déclarations

CTL-OPT

Options de contrôle du programme

Fixe, en tête de source, les options qui valent pour tout le programme : groupe d'activation, formats de date et d'heure, présentation des nombres, options de compilation.

Syntaxe

ctl-opt mot-clé [(valeur)] [mot-clé [(valeur)] …];
ctl-opt dftactgrp(*no) actgrp(*new);
ctl-opt datfmt(*eur) timfmt(*hms) decedit('0,');
dftactgrp(*no)
Indique que le programme ne tourne pas dans le groupe d'activation par défaut. C'est la forme habituelle des programmes modernes.
actgrp(*new | *caller | 'NOM')
Le groupe d'activation du programme : *new en crée un neuf à chaque appel et le détruit à la fin, *caller reprend celui de l'appelant.
datfmt(*iso | *eur | *usa | *dmy …)
Format interne des zones de type date, des littéraux d'…' et de %CHAR sans format.
timfmt(*iso | *hms | *eur …)
Même chose pour les heures.
decedit('0,' | '0.' | ',' | '.')
Séparateur décimal et zéro devant la virgule pour %CHAR et %EDITC.
alwnull(*usrctl)
Autorise la lecture d'enregistrements dont des zones sont nulles, que le programme teste lui-même.
Effet
Aucun indicateur ni %FOUND. L'instruction n'est pas exécutée : elle est lue à la compilation et change le comportement de tout le programme (formats de date et d'heure, présentation des nombres, groupe d'activation). Elle se place en tête du source, avant les déclarations.

À quoi ça sert

En RPG full free, ctl-opt remplace la spécification H du RPG IV en colonnes. Elle se place juste après **free, avant les autres déclarations. Les mots-clés sont séparés par des espaces et la liste se termine par un point-virgule.

Presque tous les programmes commencent par dftactgrp(*no) actgrp(*new) : on sort du groupe d'activation par défaut, ce qui est la condition pour utiliser les procédures, les fichiers et les paramètres comme on le fait aujourd'hui. Les options de format (datfmt, decedit) servent à adapter le programme aux usages de l'entreprise, une fois pour toutes, plutôt que de formater chaque valeur à la main.

Exemple 1 : Formats français pour tout le programme

**free
// CTL-OPT : options de compilation et de presentation, valables pour tout le programme.
ctl-opt dftactgrp(*no) actgrp(*new) datfmt(*eur) timfmt(*hms) decedit('0,');

dcl-s facture date inz(d'30.09.2026');
dcl-s heure   time inz(t'14:05:00');
dcl-s remise  packed(5:2) inz(0.5);
dcl-s total   packed(9:2) inz(1250.5);

snd-msg 'Date    : [' + %char(facture) + ']';
snd-msg 'Heure   : [' + %char(heure) + ']';
snd-msg 'Remise  : [' + %char(remise) + ']';
snd-msg 'Total   : [' + %char(total) + ']';
snd-msg 'Edite   : [' + %editc(total : 'J') + ']';

*inlr = *on;

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

Date    : [30.09.2026]
Heure   : [14:05:00]
Remise  : [0,50]
Total   : [1250,50]
Edite   : [    1.250,50 ]

Avec datfmt(*eur) et decedit('0,'), %char sans format donne 30.09.2026 pour la date et 0,50 pour la remise. %editc(total : 'J') sépare aussi les milliers : 1.250,50. Aucune ligne de code ne s'en occupe, tout vient de ctl-opt.

Exemple 2 : Sans option : les formats par défaut

**free
// CTL-OPT : sans option, les formats par defaut s'appliquent (*ISO, point decimal).
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s facture date inz(d'2026-09-30');
dcl-s remise  packed(5:2) inz(0.5);

snd-msg 'Date    : [' + %char(facture) + ']';
snd-msg 'Remise  : [' + %char(remise) + ']';
snd-msg 'Format  : [' + %char(facture : *eur) + ']';

*inlr = *on;

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

Date    : [2026-09-30]
Remise  : [.50]
Format  : [30.09.2026]

Le même type de code, sans datfmt ni decedit, produit une date *ISO et le point décimal, avec .50 sans zéro. On voit ce qui change d'un programme à l'autre : à vous de fixer le format une fois dans ctl-opt.

Le piège

Un littéral de date doit respecter le format du programme. Avec datfmt(*eur), d'2026-09-30' est refusé à la compilation (RNF0305, « Valeur D'2026-09-30' incorrecte pour littéral de date »). Il faut écrire d'30.09.2026', comme dans l'exemple 1. Changer datfmt dans un programme existant casse donc tous ses littéraux de date.

Le format change aussi, sans prévenir, ce que produit %char : un programme qui écrit des dates dans un fichier texte ou les compare à une valeur *ISO n'a plus le même comportement. Gardez le format par défaut quand le programme échange des dates avec d'autres, ou passez toujours le format explicite (%char(d : *iso)).