Sorting a file

Sorting a file requires defining two files in addition to the input (unsorted) file: the sorted file and a work file. Each requires a SELECT statement. The sorted file requires an FD and the work file requires an SD. SDs (Sort file Description).

            SELECT IN-FILE     ASSIGN TO “infile.dat” ORGANIZATION IS LINE SEQUENTIAL.
            SELECT SORTED-FILE ASSIGN TO “sorted.dat” ORGANIZATION IS LINE SEQUENTIAL.
            SELECT SORT-WORK   ASSIGN TO “sortwork.dat”.
 
        FD  IN-FILE
        01  IN-RECORD          PIC X(200).
 
        FD  SORTED-FILE
        01  SORTED-RECORD      PIC X(200).
  
       *  ONLY NEED TO DEFINE THE FIELDS THAT THE FILE WILL BE
       *  SORTED ON. BUT ACCOUNT FOR THE ENTIRE RECORD.
 
        SD  SORT-WORK
        01  SORT-RECORD.
            05  SR-EMPLOYEE    PIC 9(09).
            05                 PIC X(21).
            05  SR-REGION      PIC X(03).
            05                 PIC X(87).
            05  SR-DEPT        PIC 9(02).
            05                 PIC X(78).

The above SD has prepared us to sort on the employee number, region and department number. Let's sort on region first, then department and then employee.

One COBOL statement will do the trick. The SORT statement will read the entire input file and sort it. You will use the sorted file as input to the rest of the program. Treat it as any other input file (read it, check for end of file, close it, etc.). Normally, the sort is done during program initialization but this depends on processing needs.

            SORT SORT-WORK
                 ON ASCENDING KEY SR-REGION
                 ON ASCENDING KEY SR-DEPT
                 ON ASCENDING KEY SR-EMPLOYEE
                     USING IN-FILE
                     GIVING SORTED-FILE.
 
       * NOTICE THAT THE SORT STATEMENT OPENS AND CLOSES FILES FOR YOU
       * THIS IS USUALLY THE CASE, BUT NOT ALL SYSTEMS DO THIS  
 
            OPEN INPUT SORTED-FILE.
            READ SORTED-FILE AT END MOVE 'Y' TO WS-EOF-SW
            PERFORM UNTIL WS-EOF-SW = 'Y'
               PERFORM 200-PROCESS
               READ SORTED-FILE AT END MOVE 'Y' TO WS-EOF-SW
            END-PERFORM.
            CLOSE SORTED-FILE.
            STOP RUN.

As an alternative to specifying input and output files in the SORT you can instead specify an INPUT PROCEDURE or OUTPUT PROCEDURE, paragraphs to execute before and after the sort takes place.

                SORT SORT-WORK
                  ON ASCENDING KEY SR-REGION
                   ON ASCENDING KEY SR-DEPT
                  ON ASCENDING KEY SR-EMPLOYEE
                     INPUT  PROCEDURE 100-PRE-SORT
                     OUTPUT PROCEDURE 200-POST-SORT.
 
       100-PRE-SORT.
            OPEN INPUT IN-FILE.
 
            PERFORM UNTIL WS-EOF-SW = 'Y'
               READ IN-FILE
                  AT END
                     MOVE 'Y' TO WS-EOF-SW
                  NOT AT END
                     PERFORM 110-PROCESS
               END-READ
            END-PERFORM.
            CLOSE IN-FILE.
 
       110-PROCESS.
            MOVE IN-RECORD TO SORT-RECORD.
      *  ONLY SORT RECORDS WITH NON-ZERO DEPARTMENT NUMBER
            IF SR-DEPT NOT EQUAL ZEROES
               RELEASE SORT-RECORD
            END-IF.
 
       200-POST-SORT.
            OPEN INPUT SORT-FILE.
 
            MOVE 'N' TO WS-EOF-SW.
            PERFORM UNTIL WS-EOF-SW = 'Y'
               RETURN SORT-FILE
                  AT END
                     MOVE 'Y' TO WS-EOF-SW
                  NOT AT END
                     PERFORM 300-PROCESS
               END-RETURN
            END-PERFORM.
            CLOSE SORT-FILE.