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;