Code opération RPG III / RPG/400 · IBM i (AS/400) · Tableaux, structures et bits
SORTA
Trier un tableau
Trie les éléments d'un tableau en ordre croissant, ou décroissant si la spécification E le demande.
Syntaxe
C SORTAtab
- Facteur 2 (33-42)
- Le nom du tableau à trier (spécification E). Pas d'index. Le facteur 1 et la zone résultat restent vides.
- Effet
- Les éléments du tableau sont réordonnés sur place. L'ordre est celui de la colonne 45 de la spécification E :
Aou blanc pour croissant,Dpour décroissant. Aucun indicateur n'est positionné.
À quoi ça sert
Un tableau chargé dans le désordre (montants saisis, codes lus dans un fichier) se trie en une ligne avant d'être parcouru ou consulté par LOKUP. L'ordre n'est pas un paramètre de l'opération : il se déclare une fois pour toutes dans la spécification E du tableau.
Exemple 1 : Montants triés en ordre croissant
H* SORTA : trier un tableau en ordre croissant
E MNT 1 5 5 0
C*
C SORTAMNT
C DO 5 IDX 30
C MNT,IDX DSPLY
C END
C SETON LR
**
00450
00120
00900
00030
00300
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
30
120
300
450
900
Le tableau MNT contient 450, 120, 900, 30 et 300. Après SORTA, la boucle affiche 30, 120, 300, 450, 900.
Exemple 2 : Ordre décroissant et tableau alphanumérique
H* SORTA : l'ordre vient de la colonne 45 de la spec E (D = decroissant)
E MNT 1 5 5 0D
E NOM 1 3 8
C*
C* MNT est decrit decroissant : le plus grand passe en tete
C SORTAMNT
C MNT,1 DSPLY
C MNT,5 DSPLY
C* NOM n'a pas de sequence : ordre croissant par defaut
C SORTANOM
C NOM,1 DSPLY
C NOM,2 DSPLY
C NOM,3 DSPLY
C SETON LR
**
00900
00450
00300
00120
00030
**
ZEBRE
ANE
MULET
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
900
30
ANE
MULET
ZEBRE
MNT porte D en colonne 45 : après SORTA, l'élément 1 vaut 900 et l'élément 5 vaut 30. Les données sous ** sont déjà dans cet ordre, car la séquence est vérifiée à la compilation. NOM n'a pas de séquence : il est trié par ordre croissant (ANE, MULET, ZEBRE).
Exemple 3 : Deux tableaux parallèles
H* SORTA : deux tableaux paralleles, un seul est trie
E CLI 1 3 8
E MNT 1 3 5 0
C*
C CLI,1 DSPLY
C MNT,1 DSPLY
C* On trie les montants seulement
C SORTAMNT
C CLI,1 DSPLY
C MNT,1 DSPLY
C SETON LR
**
DUPONT
MARTIN
LEROY
**
00900
00450
00030
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
DUPONT
900
DUPONT
30
CLI et MNT se correspondent élément par élément. Après SORTA MNT, l'élément 1 de CLI est toujours DUPONT mais son montant est devenu 30 : la correspondance est perdue.
Le piège
SORTA ne trie qu'un tableau. Deux tableaux parallèles (clients et montants) se désynchronisent dès que l'un est trié (troisième exemple : DUPONT apparaît avec 30 au lieu de 900). Pour trier des couples, rangez-les dans une même entrée de tableau, avec la clé de tri en tête.
Les données ** d'un tableau déclaré trié doivent être dans l'ordre. Avec A en colonne 45 et les montants 450, 120, 900, 30, 300, la compilation s'arrête : QRG8040, « Vérification de séquence demandée : poste table/tableau hors séquence ».
En RPG ILE full free
En RPG ILE, SORTA reste disponible, en croissant par défaut. L'option (D) de l'instruction, ou le mot-clé DESCEND de la déclaration, donne le sens décroissant.
sorta mnt;
sorta(d) mnt;