Aller au contenu

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

TESTZ

Tester la zone du premier caractère

Examine la partie zone du premier caractère d'une zone alphanumérique et allume l'indicateur plus, moins ou autre.

Syntaxe

     C                     TESTZ          zone       PLMIAU
Zone résultat (43-48)
La zone alphanumérique dont on examine le premier caractère (celui de gauche). Facteur 1 et facteur 2 restent vides.
Indicateurs (54-55)
Premier caractère de zone « plus » : les lettres A et B, le caractère &, et leurs semblables (A à I).
Indicateurs (56-57)
Premier caractère de zone « moins » : les lettres J et K, le caractère -, et leurs semblables (J à R).
Indicateurs (58-59)
Tout autre premier caractère (chiffre, blanc…).
Effet
Un seul des trois indicateurs s'allume. La zone n'est pas modifiée.

À quoi ça sert

Dans un nombre zoné, le signe se cache dans la partie zone du dernier chiffre. TESTZ lit la partie zone du premier caractère d'une zone alphanumérique : on l'emploie pour reconnaître un champ dont le premier octet porte une marque « plus » ou « moins » dans des données reçues d'un autre système.

Exemple 1 : Premier caractère : lettre, signe, chiffre, blanc

     H*  TESTZ : zone du premier caractere d'une zone (lettre, signe, chiffre)
     E                    SAIS    1   6  3
     C*  71 = zone de A-I ou &, 72 = zone de J-R ou -, 73 = autre
     C                     DO   6         I       30
     C                     MOVE SAIS,I    SAI     3
     C                     SETOF                     717273
     C                     TESTZ          SAI        717273
     C                     MOVEL'?'       LIB     3 P
     C           *IN71     IFEQ '1'
     C                     MOVEL'71'      LIB       P
     C                     END
     C           *IN72     IFEQ '1'
     C                     MOVEL'72'      LIB       P
     C                     END
     C           *IN73     IFEQ '1'
     C                     MOVEL'73'      LIB       P
     C                     END
     C           SAI       CAT  LIB:1     RES     8 P
     C           RES       DSPLY
     C                     END
     C                     SETON                     LR
**
A12
J12
&12
-12
123
 12

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

A12 71
J12 72
&12 71
-12 72
123 73
 12 73

A12 et &12 allument l'indicateur 71 ; J12 et -12 l'indicateur 72 ; 123 et la zone commençant par un blanc l'indicateur 73.

Exemple 2 : Seul le premier caractère compte

     H*  TESTZ : seul le premier caractere compte
     E                    SAIS    1   3  3
     C*  71 = zone de A-I ou &, 72 = zone de J-R ou -, 73 = autre
     C                     DO   3         I       30
     C                     MOVE SAIS,I    SAI     3
     C                     SETOF                     717273
     C                     TESTZ          SAI        717273
     C                     MOVEL'?'       LIB     3 P
     C           *IN71     IFEQ '1'
     C                     MOVEL'71'      LIB       P
     C                     END
     C           *IN72     IFEQ '1'
     C                     MOVEL'72'      LIB       P
     C                     END
     C           *IN73     IFEQ '1'
     C                     MOVEL'73'      LIB       P
     C                     END
     C           SAI       CAT  LIB:1     RES     8 P
     C           RES       DSPLY
     C                     END
     C                     SETON                     LR
**
12J
J12
1J2

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

12J 73
J12 72
1J2 73

12J et 1J2 contiennent un J, mais pas en tête : l'indicateur 73 s'allume. Seule J12 allume l'indicateur 72.

Le piège

Seul le premier caractère est examiné : 12J n'allume pas l'indicateur « moins » (deuxième exemple), et la longueur de la zone ne change rien. Pour examiner le dernier caractère, copiez-le d'abord dans une zone d'un caractère (MOVE).

En RPG ILE full free

Il n'y a pas d'équivalent direct en RPG ILE full free. On teste le premier caractère par comparaison.

if %subst(zone : 1 : 1) >= 'J' and %subst(zone : 1 : 1) <= 'R';
  dsply 'moins';
endif;