Aller au contenu

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 : A ou blanc pour croissant, D pour 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;