Return
Return Example
Scenario - Let us assume we have a file with the employee information and need to sort the file based on the employee number (1-5 bytes). But, we need to skip the DIR (having employee number E0001) record after the sort and before writing it to output file.
EMPREC -
----+----1----+----2----+----3----+----4----+-- 05 EMP-NUM PIC 9(05). 05 FILLER PIC X(05). 05 EMP-NAME PIC X(10). 05 EMP-DESG PIC X(09). 05 FILLER PIC X(01). 05 EMP-SALARY PIC 9(05). 05 FILLER PIC X(12).
Input -
MATEPK.EMPFILE.NSINPUT1
----+----1----+----2----+----3----+----4----+-- E0004EMPLOYEE4 TL DEPT1LOC1 0000050000 E0002EMPLOYEE2 MGR DEPT1LOC1 0000080000 E0006EMPLOYEE6 SE DEPT1LOC1 0000034000 E0001EMPLOYEE1 DIR LOC1 0000100000
MATEPK.EMPFILE.INPUT2
Code -
----+----1----+----2----+----3----+----4----+----5----+
IDENTIFICATION DIVISION.
PROGRAM-ID. RETURNSR.
AUTHOR. MTH.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPFILE1 ASSIGN TO INPUT1.
SELECT EMPFILEO ASSIGN TO OUTPUT1.
SELECT WORKFILE ASSIGN TO WORK1.
DATA DIVISION.
FILE SECTION.
FD EMPFILE1
RECORD CONTAINS 47 CHARACTERS
DATA RECORD EMP-REC1
RECORDING MODE F.
01 EMP-REC1.
COPY EMPREC.
FD EMPFILEO
RECORD CONTAINS 47 CHARACTERS
DATA RECORD EMP-RECO
RECORDING MODE F.
01 EMP-RECO.
COPY EMPREC.
SD WORKFILE
RECORD CONTAINS 47 CHARACTERS
DATA RECORD WORK-REC
RECORDING MODE F.
01 WORK-REC.
05 WORK-EMP-NUM PIC 9(05).
05 WORK-REM-REC PIC X(42).
WORKING-STORAGE SECTION.
01 WS-SORTEOF-SW PIC X(01) VALUE 'N'.
88 SORT-EOF VALUE 'Y'.
PROCEDURE DIVISION
* SORT using OUTPUT PROCEDURE
SORT WORKFILE
ON ASCENDING KEY WORK-EMP-NUM
USING EMPFILE1
OUTPUT PROCEDURE IS 1000-WRITE-RECORDS.
STOP RUN.
1000-WRITE-RECORDS.
OPEN OUTPUT EMPFILEO.
* RETURN statement with LOOP to process all records
PERFORM UNTIL SORT-EOF
RETURN WORKFILE
AT END SET SORT-EOF TO TRUE
NOT AT END PERFORM 2000-WRITE-OUTPUT
END-RETURN
END-PERFORM.
CLOSE EMPFILEO.
2000-WRITE-OUTPUT.
* Skipping E0001 record while writing
IF WORK-EMP-NUM EQUAL 'E0001'
CONTINUE
ELSE
MOVE WORK-REC TO EMP-RECO
WRITE EMP-RECO
END-IF.
JCL -
//MATEPKRJ JOB MSGLEVEL=(1,1),NOTIFY=&SYSUID //* //STEP01 EXEC PGM=RETURNSR //STEPLIB DD DSN=MATEPK.COBOL.LOADLIB,DISP=SHR //INPUT1 DD DSN=MATEPK.EMPFILE.NSINPUT1,DISP=SHR //OUTPUT1 DD DSN=MATEPK.EMPFILE.RETURNOP, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(3,2),RLSE), // UNIT=SYSDA, // DCB=(DSORG=PS,RECFM=FB,LRECL=47,BLKSIZE=470) //WORK1 DD DSN=&&TEMP, // DISP=(NEW,DELETE,DELETE), // SPACE=(CYL,(10,5),RLSE), // UNIT=SYSDA, // DCB=(DSORG=PS,RECFM=FB,LRECL=47,BLKSIZE=470) //SYSOUT DD SYSOUT=*
Output (MATEPK.EMPFILE.RETURNOP) -
----+----1----+----2----+----3----+----4----+-- E0002EMPLOYEE2 MGR DEPT1LOC1 0000080000 E0004EMPLOYEE4 TL DEPT1LOC1 0000050000 E0006EMPLOYEE6 SE DEPT1LOC1 0000034000
Explaining Example -
In the above example:
- SORT uses 1000-WRITE-RECORDS as a output procedure which returns every record.
- RETURN...AT END phase is used to write the records to the output file. The director record (E0001) is successfully skipped during the File WRITE.