SORT & MERGE

Use procedures to filter or transform records before sorting (RELEASE) and to process sorted records directly (RETURN) without an intermediate file:

23.1 Simple SORT (USING / GIVING)

The sort work file is described with SD (sort description), not FD. Files named in USING/GIVING must not be open — SORT opens and closes them.

WITH DUPLICATES IN ORDER keeps equal keys in input order; COLLATING SEQUENCE IS changes the ordering. SORT-RETURN is 0 on success, 16 on failure.

IDENTIFICATION DIVISION.
       PROGRAM-ID. SORTSALE.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT SALES-IN  ASSIGN TO "sales.txt"
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT SALES-OUT ASSIGN TO "sales-sorted.txt"
               ORGANIZATION IS LINE SEQUENTIAL.
           SELECT SORT-WORK ASSIGN TO "sortwork.tmp".
       DATA DIVISION.
       FILE SECTION.
       FD  SALES-IN.
       01  SALES-IN-REC          PIC X(40).
       FD  SALES-OUT.
       01  SALES-OUT-REC         PIC X(40).
       SD  SORT-WORK.
       01  SORT-REC.
           05  SR-REGION         PIC X(10).
           05  SR-REP            PIC X(20).
           05  SR-AMOUNT         PIC 9(7)V99.
           05  FILLER            PIC X.
       PROCEDURE DIVISION.
           SORT SORT-WORK
               ON ASCENDING  KEY SR-REGION
               ON DESCENDING KEY SR-AMOUNT
               USING  SALES-IN
               GIVING SALES-OUT
           IF SORT-RETURN NOT = 0
               DISPLAY "SORT FAILED, SORT-RETURN = " SORT-RETURN
               MOVE 16 TO RETURN-CODE
           END-IF
           STOP RUN.

23.2 INPUT PROCEDURE and OUTPUT PROCEDURE

Use procedures to filter or transform records before sorting (RELEASE) and to process sorted records directly (RETURN) without an intermediate file:

(WS-IN-EOF and WS-SORT-EOF are PIC X VALUE "N" items in WORKING-STORAGE.) You may mix: USING with an OUTPUT PROCEDURE, or an INPUT PROCEDURE with GIVING.

SORT SORT-WORK
               ON ASCENDING KEY SR-REGION SR-REP
               INPUT PROCEDURE  IS 1000-SELECT-SALES
               OUTPUT PROCEDURE IS 2000-PRINT-SALES
           STOP RUN.

       1000-SELECT-SALES.
           OPEN INPUT SALES-IN
           PERFORM UNTIL WS-IN-EOF = "Y"
               READ SALES-IN
                   AT END MOVE "Y" TO WS-IN-EOF
                   NOT AT END
                       MOVE SALES-IN-REC TO SORT-REC
      *                Keep only sales of 100.00 or more
                       IF SR-AMOUNT >= 100
                           RELEASE SORT-REC
                       END-IF
               END-READ
           END-PERFORM
           CLOSE SALES-IN.

       2000-PRINT-SALES.
           PERFORM UNTIL WS-SORT-EOF = "Y"
               RETURN SORT-WORK
                   AT END MOVE "Y" TO WS-SORT-EOF
                   NOT AT END
                       DISPLAY SR-REGION " " SR-REP " " SR-AMOUNT
               END-RETURN
           END-PERFORM.

23.3 MERGE

MERGE combines two or more files already sorted on the same keys:

MERGE supports OUTPUT PROCEDURE but not INPUT PROCEDURE.

MERGE MERGE-WORK
               ON ASCENDING KEY MW-CUST-ID
               USING  TRANS-EAST TRANS-WEST TRANS-CENTRAL
               GIVING TRANS-ALL

23.4 Sorting on z/OS

The COBOL SORT verb calls the system sort product (DFSORT or Syncsort/Precisely MFX). Provide SORTWK01… DD statements or let dynamic allocation handle work space.

Many shops sort with a standalone JCL step instead of in COBOL — usually faster:

(ZD = zoned decimal; PD = packed; BI = binary; CH = character.)

//SORTSTEP EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=USER01.SALES.DATA,DISP=SHR
//SORTOUT  DD DSN=USER01.SALES.SORTED,DISP=(NEW,CATLG,DELETE),
//            SPACE=(CYL,(5,5),RLSE),DCB=*.SORTIN
//SYSIN    DD *
  SORT FIELDS=(1,10,CH,A,31,9,ZD,D)
  INCLUDE COND=(31,9,ZD,GE,10000)
/*