Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Tableaux, structures et bits

TESTN

Tester si une zone alphanumérique est numérique

Examine une zone alphanumérique et indique si elle ne contient que des chiffres, des blancs suivis de chiffres, ou que des blancs.

Syntaxe

     C                     TESTN          zone       NUBLVI
Zone résultat (43-48)
La zone alphanumérique à examiner (la saisie). Le facteur 1 et le facteur 2 restent vides.
Indicateurs (54-55)
S'allume si la zone ne contient que des chiffres de 0 à 9.
Indicateurs (56-57)
S'allume si la zone commence par des blancs et se termine par des chiffres (nombre cadré à droite, par exemple ' 123').
Indicateurs (58-59)
S'allume si la zone ne contient que des blancs.
Effet
Un seul des trois indicateurs s'allume, ou aucun si la zone contient autre chose (lettre, signe moins, blancs à droite). La zone n'est pas modifiée.

À quoi ça sert

Avant de transformer une saisie alphanumérique en nombre (MOVE vers une zone numérique), il faut s'assurer qu'elle ne contient que des chiffres. TESTN est ce contrôle : il distingue la saisie correcte, la saisie vide et la saisie à rejeter.

Exemple 1 : Classer six saisies de 5 caractères

     H*  TESTN : classer une saisie alphanumerique de 5 caracteres
     E                    SAIS    1   6  5
     C*  71 = que des chiffres, 72 = blancs a gauche puis chiffres, 73 = vide
     C                     DO   6         I       30
     C                     MOVE SAIS,I    SAI     5
     C                     SETOF                     717273
     C                     TESTN          SAI        717273
     C                     MOVEL'Autre'   LIB     8 P
     C           *IN71     IFEQ '1'
     C                     MOVEL'Chiffres'LIB       P
     C                     END
     C           *IN72     IFEQ '1'
     C                     MOVEL'Blanc-ch'LIB       P
     C                     END
     C           *IN73     IFEQ '1'
     C                     MOVEL'Vide'    LIB       P
     C                     END
     C           SAI       CAT  LIB:1     RES    14 P
     C           RES       DSPLY
     C                     END
     C                     SETON                     LR
**
12345
  123
     
12A45
123  
-1234

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

12345 Chiffres
  123 Blanc-ch
 Vide
12A45 Autre
123 Autre
-1234 Autre

12345 allume l'indicateur 71 (chiffres), « 123» l'indicateur 72 (blancs puis chiffres), « » l'indicateur 73 (vide). Les saisies 12A45, «123 » (blancs à droite) et -1234 n'allument rien : le libellé reste « Autre ».

Exemple 2 : Un MOVE sans contrôle donne un faux nombre

     H*  TESTN : MOVE d une saisie non numerique vers une zone numerique
     C                     MOVE '12A45'   SAI     5
     C                     MOVE SAI       NBR     50
     C           NBR       DSPLY
     C                     TESTN          SAI        71
     C           *IN71     IFEQ '0'
     C           'Refuse'  DSPLY
     C                     END
     C                     SETON                     LR

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

12145
Refuse

Le MOVE de «12A45» vers une zone numérique ne signale rien : il donne 12145 (le A vaut 1). TESTN n'allume pas son indicateur 71 sur cette saisie, ce qui permet de la refuser (« Refuse »).

Le piège

Un nombre avec blancs à droite ou un signe moins n'est pas « numérique » pour TESTN : «123 » et «-1234» n'allument aucun indicateur (premier exemple). Cadrez la saisie à droite avant le test.

Sans TESTN, le passage vers une zone numérique ne plante pas : MOVE '12A45' vers une zone numérique de 5 chiffres donne 12145 (deuxième exemple). L'erreur est silencieuse.

En RPG ILE full free

En RPG ILE, on contrôle la saisie avec %CHECK : il renvoie 0 si la chaîne ne contient que les caractères autorisés.

if %check('0123456789' : %trim(saisie)) = 0;
  nbr = %dec(saisie : 5 : 0);
endif;