Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Chaînes de caractères

SUBST

Extraire une partie de chaîne

Copie dans la zone résultat une partie du facteur 2, à partir d'une position donnée et sur une longueur donnée.

Syntaxe

     C           long      SUBSTbase:dep  result
     C           long      SUBSTbase:dep  result    P  56
     C                     SUBSTbase:dep  result
Facteur 1 (18-27)
Nombre de caractères à copier : un littéral numérique ou une zone numérique sans décimale. Facultatif : sans lui, la copie va jusqu'à la fin de la chaîne.
Facteur 2 (33-42)
La chaîne source, suivie de :début, la position du premier caractère à copier (un littéral ou une zone numérique). Sans :début, la copie commence en position 1.
Zone résultat (43-48)
Zone alphanumérique qui reçoit les caractères.
Colonne 53
P : complète la zone résultat à droite avec des blancs. Sans P, la fin de l'ancien contenu reste.
Indicateurs (56-57)
Facultatif : s'allume si la position de début ou la longueur sort de la chaîne ; la zone résultat n'est alors pas modifiée. Il est éteint quand l'opération réussit.
Effet
Le résultat reçoit les caractères copiés. En cas d'erreur (indicateur 56-57 allumé), la zone résultat garde sa valeur.

À quoi ça sert

SUBST découpe une zone : l'année, le mois et le jour d'une date AAAAMMJJ, les deux premiers chiffres d'un code postal, un préfixe de référence. Les données des anciens fichiers IBM i sont souvent des zones composées, et c'est l'opération de base pour les lire.

Exemple 1 : Découper une date AAAAMMJJ

     H*  SUBST : extraire une partie de zone (position et longueur)
     C                     MOVEL'20240108'DATE    8
     C                     Z-ADD4         LONG    20
     C           LONG      SUBSTDATE:1    ANNEE   4
     C           ANNEE     DSPLY
     C           2         SUBSTDATE:5    MOIS    2
     C           MOIS      DSPLY
     C                     SUBSTDATE:7    JOUR    2
     C           JOUR      DSPLY
     C                     SETON                     LR

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

2024
01
08

L'année prend 4 caractères à partir de la position 1 (longueur dans la zone LONG), le mois 2 caractères à partir de la position 5 (longueur littérale), et le jour tout ce qui reste à partir de la position 7 (pas de facteur 1).

Exemple 2 : Zone résultat, P et indicateur d'erreur

     H*  SUBST : zone resultat plus longue, P en colonne 53, erreur 56-57
     C                     MOVEL'Dupont'  NOM     6
     C                     MOVEL'XXXXXXXX'R1      8
     C           3         SUBSTNOM:1     R1
     C           R1        DSPLY
     C                     MOVEL'XXXXXXXX'R2      8
     C           3         SUBSTNOM:1     R2        P
     C           R2        DSPLY
     C                     Z-ADD7         POS     20
     C           2         SUBSTNOM:POS   R3      4    10
     C           *IN10     DSPLY
     C                     SETOF                     10
     C                     MOVEL'ZZZ'     R3
     C                     Z-ADD4         POS
     C           4         SUBSTNOM:POS   R3           10
     C           *IN10     DSPLY
     C           R3        DSPLY
     C                     Z-ADD3         POS
     C           3         SUBSTNOM:POS   R3           10
     C           *IN10     DSPLY
     C           R3        DSPLY
     C                     SETON                     LR

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

DupXXXXX
Dup
1
1
ZZZ
0
pon

Sans P, « Dup » est copié dans une zone de 8 caractères déjà remplie de X : « DupXXXXX ». Avec P, la fin est mise à blanc. Ensuite, la position 7 sur une chaîne de 6 caractères allume l'indicateur 10 (colonnes 56-57), comme 4 caractères à partir de la position 4 : dans les deux cas la zone résultat garde sa valeur (« ZZZ » est toujours là). Une opération correcte éteint l'indicateur et la zone reçoit « pon ».

Le piège

Une position qui sort de la chaîne est une erreur, pas une troncature. Avec un littéral, le compilateur refuse la ligne : QRG7216, « La position de début indiquée en facteur 2 dépasse la longueur de la chaîne ». Avec une zone, l'erreur n'apparaît qu'à l'exécution : mettez un indicateur en colonnes 56-57 et testez-le (second exemple).

Sans P, la fin de la zone résultat n'est pas effacée (« DupXXXXX »).

En RPG ILE full free

En RPG ILE, %SUBST fait la même chose. La longueur est facultative comme en RPG III. Le résultat est complété de blancs, donc P disparaît.

annee = %subst(date:1:4);
mois  = %subst(date:5:2);
jour  = %subst(date:7);