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. SansP, 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);