Exemple – SORT dans un programme

L’instruction SORT en cobol est utilisée pour trier les enregistrements par un champ clé que nous indiquons.
On peut choisir plusieurs clés et définir si l’ordre sera croissant ou décroissant.
Pour l’exemple, nous créons un fichier temporaire dans notre programme que nous utiliserons pour générer les informations triées qu’il contient.
En tant qu’enregistrements à trier, nous utiliserons une table interne, nous n’aurons donc à aucun moment besoin d’utiliser des fichiers.
Les informations demandées seront chargées du fichier temporaire dans le registre de sortie, qui peut être utilisé tout au long de l’exécution.

 IDENTIFICATION DIVISION.
 PROGRAM-ID. PRGSORT.

 ENVIRONMENT DIVISION.
 CONFIGURATION SECTION.
 SPECIAL-NAMES.
      DECIMAL-POINT IS COMMA.

 INPUT-OUTPUT SECTION.
 FILE-CONTROL.
     SELECT TABLE-SORT ASSIGN TO DISK "SORTWORK".

 DATA DIVISION.
 FILE SECTION.

 SD TABLE-SORT
 DATA RECORD IS ELEMENT-SORT.

 01  ELEMENT-SORT.
     05 SORT-CLE1              PIC X(01).
     05 SORT-CLE2              PIC X(03).
     05 SORT-CHAMP             PIC X(10).
     05 SORT-INDICATEUR        PIC X(01).

 WORKING-STORAGE SECTION.

 01  VARIABLES.
     05 WA-REGISTRE.
        10 WA-SORT-CLE1        PIC X(01).
        10 WA-SORT-CLE2        PIC X(03).
        10 WA-SORT-CHAMP       PIC X(10).
        10 WA-SORT-INDICATEUR  PIC X(01).

 01  SWITCHES.
     05 SW-FIN-TABLE-SORT      PIC X(01).
        88 SI-FIN-TABLE-SORT             VALUE 'S'.
        88 NO-FIN-TALEA-SORT             VALUE 'N'.
     05 WI-ELEM                PIC 9(02) VALUE ZEROES.   

 01  TABLE.
     05 WT-TBL-LISTE.
        10                     PIC X(15) VALUE 'F216CAMPO02802S'.
        10                     PIC X(15) VALUE 'M144CAMPO17114N'.
        10                     PIC X(15) VALUE 'Q651CAMPO24536S'.
        10                     PIC X(15) VALUE 'F217CAMPO03312N'.
        10                     PIC X(15) VALUE 'T487CAMPO44914S'.
        10                     PIC X(15) VALUE 'O372CAMPO52113N'.
        10                     PIC X(15) VALUE 'F457CAMPO61224N'.
        10                     PIC X(15) VALUE 'L547CAMPO73985N'.
        10                     PIC X(15) VALUE 'L354CAMPO89173N'.
        10                     PIC X(15) VALUE 'W516CAMPO92815N'.
     05 REDEFINES WT-TBL-LISTE.
        10 WT-TBL-ELEMENTE     OCCURS 10 TIMES.
           15 WT-TBL-CLE1       PIC X(01).
           15 WT-TBL-CLE2       PIC X(03).
           15 WT-TBL-CHAMP      PIC X(10).
           15 WT-TBL-INDICATEUR PIC X(01).

 01  WR-ELEMENTE-SORT.
     05 WR-SORT-CLE1           PIC X(01).
     05 WR-SORT-CLE2           PIC X(03).
     05 WR-SORT-CHAMP          PIC X(10).
     05 WR-SORT-INDICATEUR     PIC X(01).

 PROCEDURE DIVISION.

     PERFORM 1000-INIT
     PERFORM 2000-PROCESS
     PERFORM 9000-FINAL
     STOP RUN.
     .

 1000-INIT.
     INITIALIZE VARIABLES
     .

 2000-PROCESS.
     SORT TABLE-SORT
          ON ASCENDING KEY SORT-CLE1
          ON DESCENDING KEY SORT-CLE2
          INPUT PROCEDURE 2100-PROCESS-ENTREE
          OUTPUT PROCEDURE 2200-PROCESS-SORTIE

     IF  SORT-RETURN NOT EQUAL ZEROES
         DISPLAY 'ERROR SUR LE SORT:' SORT-RETURN
     END-IF
     .

 2100-PROCESS-ENTREE.
     PERFORM VARYING WI-ELEM
        FROM 1 BY 1 UNTIL WI-ELEM > 10
        MOVE WT-TBL-CLE1       (WI-ELEM) TO WR-SORT-CLE1
        MOVE WT-TBL-CLE2       (WI-ELEM) TO WR-SORT-CLE2
        MOVE WT-TBL-CHAMP      (WI-ELEM) TO WR-SORT-CHAMP
        MOVE WT-TBL-INDICATEUR (WI-ELEM) TO WR-SORT-INDICATEUR
        RELEASE ELEMENTE-SORT FROM WR-ELEMENTE-SORT
        DISPLAY 'REGISTRE EN ENTREE :' WR-ELEMENTE-SORT
     END-PERFORM
     .

 2200-PROCESS-SORTIE.
     SET NO-FIN-TABLE-SORT TO TRUE
     PERFORM UNTIL SI-FIN-TABLE-SORT
        RETURN TABLE-SORT INTO WR-ELEMENTE-SORT
        AT END
           SET SI-FIN-TABLE-SORT TO TRUE
        NOT AT END
           MOVE WR-SORT-CLE1       TO WA-SORT-CLE1
           MOVE WR-SORT-CLE2       TO WA-SORT-CLE2
           MOVE WR-SORT-CHAMP      TO WA-SORT-CHAMP
           MOVE WR-SORT-INDICATEUR TO WA-SORT-INDICATEUR
           DISPLAY 'REGISTRE EN SORTIE :' WA-REGISTRE
        END-RETURN
     END-PERFORM
     .

 9000-FINAL.
     DISPLAY "FIN DU PROGRAMME DE CLASSIFICATION"
     .

RESULTAT

REGISTRE EN ENTREE :F216CAMPO02802S
                    M144CAMPO17114N
                    Q651CAMPO24536S
                    F217CAMPO03312N
                    T487CAMPO44914S
                    O372CAMPO52113N
                    F457CAMPO61224N
                    L547CAMPO73985N
                    L354CAMPO89173N
                    W516CAMPO92815N

REGISTRE EN SORTIE :F457CAMPO61224N
                    F217CAMPO03312N
                    F216CAMPO02802S
                    L547CAMPO73985N
                    L354CAMPO89173N
                    M144CAMPO17114N
                    O372CAMPO52113N
                    Q651CAMPO24536S
                    T487CAMPO44914S
                    W516CAMPO92815N	

FIN DU PROGRAMME DE CLASSIFICATION