Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Procédures, sous-programmes et erreurs

TEST

Vérifier une date, une heure ou un horodatage

Contrôle qu'une zone caractère ou numérique contient une date, une heure ou un horodatage valide dans un format donné, sans la convertir ni arrêter le programme si elle ne l'est pas.

Syntaxe

TEST(DE) {format} zone;
TEST(TE) {format} zone;
TEST(ZE) zone;
D, T, Z
Ce que l'on contrôle : D une date, T une heure, Z un horodatage. Une de ces lettres est obligatoire.
E
Extension d'erreur, obligatoire en full free : TEST(D) sans E est refusé à la compilation (RNF5056). L'erreur positionne %ERROR au lieu d'arrêter le programme.
format
Le format attendu, avec ses séparateurs : *ISO (2026-09-30), *EUR (30.09.2026), *DMY (30/09/26), *HMS (14:05:00)…
zone
La zone à contrôler : une zone caractère de la longueur du format, ou une zone numérique (par exemple 20260930 avec *ISO).
Effet
%ERROR vaut *OFF si la zone contient une valeur valide pour le format, *ON sinon. La zone n'est ni modifiée ni convertie.

À quoi ça sert

Une date saisie ou lue dans un fichier texte peut être n'importe quoi. TEST(DE) permet de vérifier avant de convertir : si %error est vrai, on affiche un message ou on rejette la ligne, sinon on peut convertir sans risque.

Il vérifie à la fois la forme (séparateurs, longueur) et le contenu (le 30 février n'existe pas, 25 heures non plus). Le premier exemple valide '2026-02-30' : le format est correct mais la date est impossible, %error est vrai. En colonnes, c'était le code opération TEST avec un indicateur d'erreur en colonnes 73-74.

Exemple 1 : Dates et heures valides ou non

**free
// TEST : verifier qu'une zone contient une date ou une heure valide.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s saisie1 char(10) inz('2026-09-30');
dcl-s saisie2 char(10) inz('2026-02-30');
dcl-s saisie3 char(10) inz('30.09.2026');
dcl-s heure   char(8)  inz('25:10:00');
dcl-s valide  ind;

test(de) *iso saisie1;
valide = not %error;
snd-msg 'Saisie1 [' + saisie1 + '] valide ISO : ' + %char(valide);

test(de) *iso saisie2;
valide = not %error;
snd-msg 'Saisie2 [' + saisie2 + '] valide ISO : ' + %char(valide);

test(de) *iso saisie3;
valide = not %error;
snd-msg 'Saisie3 [' + saisie3 + '] valide ISO : ' + %char(valide);

test(de) *eur saisie3;
valide = not %error;
snd-msg 'Saisie3 [' + saisie3 + '] valide EUR : ' + %char(valide);

test(te) *hms heure;
valide = not %error;
snd-msg 'Heure [' + heure + '] valide HMS : ' + %char(valide);

*inlr = *on;

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

Saisie1 [2026-09-30] valide ISO : 1
Saisie2 [2026-02-30] valide ISO : 0
Saisie3 [30.09.2026] valide ISO : 0
Saisie3 [30.09.2026] valide EUR : 1
Heure [25:10:00] valide HMS : 0

'2026-09-30' est valide en *ISO. '2026-02-30' ne l'est pas : la date n'existe pas. '30.09.2026' est invalide en *ISO mais valide en *EUR : c'est le format qui décide. '25:10:00' n'est pas une heure.

Exemple 2 : Séparateurs, zone vide et zone numérique

**free
// TEST : le piege des separateurs, des zones vides et des zones numeriques.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s texte  char(10) inz('30/09/2026');
dcl-s court  char(8)  inz('30/09/26');
dcl-s vide   char(10) inz(' ');
dcl-s numdat packed(8:0) inz(20260931);
dcl-s numok  packed(8:0) inz(20260930);

test(de) *eur texte;
snd-msg 'EUR sur 30/09/2026 : erreur = ' + %char(%error);

test(de) *dmy court;
snd-msg 'DMY sur 30/09/26 : erreur = ' + %char(%error);

test(de) *iso vide;
snd-msg 'Zone vide : erreur = ' + %char(%error);

test(de) *iso numdat;
snd-msg 'Numerique 20260931 : erreur = ' + %char(%error);

test(de) *iso numok;
snd-msg 'Numerique 20260930 : erreur = ' + %char(%error);

*inlr = *on;

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

EUR sur 30/09/2026 : erreur = 1
DMY sur 30/09/26 : erreur = 0
Zone vide : erreur = 1
Numerique 20260931 : erreur = 1
Numerique 20260930 : erreur = 0

'30/09/2026' est refusé en *EUR, qui attend des points ; '30/09/26' est valide en *DMY (8 caractères, barres). Une zone vide est invalide. Une zone numérique est contrôlée en *ISO : 20260931 est refusé, 20260930 accepté.

Le piège

Le format impose les séparateurs et la longueur. Une date écrite '30/09/2026' est refusée par *EUR (qui veut des points) : la zone est lisible pour un humain mais invalide pour le format choisi, comme le montre le second exemple. Une zone vide l'est aussi. Testez la valeur dans le format réellement utilisé par la saisie ou le fichier, et n'oubliez pas le E : test(d) seul ne compile pas.