- Other names that can be used to invoke SORT are ICEMAN,IERRCO00,IGHRCOOO and SYNCSORT.
- Sorting can be done from ISPF prompt also. For this open the file to be sorted in edit mode. Then use the command 'SORT 1 22' to sort the file from 1st to 22nd characters.
- DFSORT is invoked using JCL.
-
//JOBNAME JOB -->Signals the initiation of a job. JOB statement contains all normal parameters as in normal JCL.
-
//STEPNAME EXEC -->Signals the initiation of a step. Tells OS which program is to be executed. For DFSORT the program to be executed is SORT.
- //STEPNAME EXEC PGM=SORT
-
//SYSOUT DD -->Defines the output dataset for messages.
-
//SORTIN -->Defines the input dataset that needs to be sorted. Input Could be sequential, extended sequential, PDSE member, PDS member or a VSAM dataset. Files can be concatenated if the RECFM is the same for all files. For variable length files the file with largest record length must be first.
-
//SORTINxx -->Used for merge request input files . Up to 100 SORTINnn DD's may be specified. The 'nn' suffix can be any number in the range 00 thru 99; they may be skipped or used out of order. The files must already be sorted in the proper sequence for the MERGE.
-
//SORTWknn -->From 1 to 100 sort work files can be allocated using the SORTWKnn DD statement. The 'nn' suffix can be any number in the range 00 thru 99.SORTWKnn DD's are not used for a MERGE or a copy operation, or if the DYNALLOC parmis used. Each SORTWKnn MUST be on one unit & one volume.
-
//SORTOUT -->Defines the output dataset. It can be sequential, extended sequential data set ,a PDS member or a PDSE member.
-
//SORTOFnn -->Output file for a SORT, MERGE, or copy function. Up to 100 SORTOFnn DD's may be specified. The 'nn' suffix can be any number in the range 00 through 99. They may be skipped or used out of order. The FNAMES/FILES parameter on the OUTFILE control statement specifies the DD names of the output files and the output records that are written to each SORTOFnn data set.
-
//SORTXSUM -->Output file for a SORT or MERGE function. The records eliminated by SUM processing are written to the SORTXSUM DD.
-
//SYSIN DD * -->Defines the sort cards.
- Sorting data:
- EBCDIC character: CH
- ASCII character: AC
- BINARY : BI (COMP fields)
- ZONED Decimal: ZD (numeric fields with USAGE as display)
- Packed Decimal : PD (COMP-3)
- Alternate Sequence: AQ
- Merging datasets:
- Datasets should have same LRECL and RECFM
- Datasets should be sorted prior to Merge.
- Processing Order of control statements:
- INCLUDE /OMIT
- INREC Statement
- SORT/MERGE
- OUTREC Statement
- Copying datasets:
- INCLUDE Statement:
- COND=ALL means all input records are to be included.
- COND=NONE means none of the input records are to be included.
- AND may be specified as &. OR may be specified as ¦.
- OMIT statement:
- SUMming fields:
- Eliminating duplicates on a field:
- Reformatting output:
- Delete fields
- Reorder fields
- Insert strings or blanks
- Convert data to hexadecimal representation.
- Convert case.
- Edit numeric values
- Convert numeric values to another format.
- Perform arithmetic operations.
- Insert sequence number.
- Change record Length.
- The first field begins in byte 1 of the input record and is 20 bytes long.
- The second field begins in byte 40 of the input record and is a 15-byte ZD field.
- The third field begins in byte 60 of the input record and is 5 bytes long.
- Delete or repeat segments of the input records.
- Insert character strings between data fields.
- Insert binary zeros.
- Create a sequence number field.
- Convert numeric data to printable format or to another numeric data format.
- Perform arithmetic operations (multiply, divide, add, subtract) and minimum and maximum functions with numeric fields and constants.
- Convert data to printable hexadecimal format.Select, realign, and reorder data fields.
- Convert a variable length record input file to a fixed length record output file.
- Create multiple output files:
- Use the Sort Writer facility:
- Reformatting records: This task uses these parameters: OUTREC.
- Deleting a field:
- Reordering the fields:
- Insert a new field with zeros:
- Inserting Blanks:
- Creating multiple copies of same dataset:
- Selecting records to different files with STARTREC and ENDREC options
- Separating records to different files based upon record contents:
- BUILD command:
- SPLIT
- Editing Numeric values:
Sample
JCL:
//STEPSORT
EXEC PGM=SORT,PARM=sort-parms
//SORTIN
DD DSN=G1SG00AT.SORTIN1,DISP=SHR Input for sort
//SORTINnn
DD DSN=G1SG00AT.SORTIN2,DISP=SHR Input for merge
//SORTOUT DD
DSN=G1SG00AT.SORTOUT,
//
DISP=(NEW,CATLG,DELETE),
//
UNIT=SYSDA,
//
SPACE=(CYL,(2,2),RLSE),
//
DCB=(LRECL=80,BLKSIZE=0,RECFM=FB,DSORG=PS)
//SORTOFnn
DD DSN=G1SG00AT.SORTOUT, Output data sets
//
DISP=OLD
//SORTXSUM
DD DSN=G1SG00AT.SORTOUT, Records eliminated by SUM
//
DISP=OLD
//SORTWK01
DD SPACE=(CYL,(20,15),RLSE),UNIT=SYSDA
//SORTWK02
DD SPACE=(CYL,(20,15),RLSE),UNIT=SYSDA
//SYSOUT
DD SYSOUT=*
//SYSIN
DD *<control statements>
Following
DDNAMES are required to code a DFSORT job.
//SYSOUT DD SYSOUT=*
Sorting means Rearranging data in either ascending or
descending order.
SORT FIELDS=(Starting
position of field, Length of the field, datatype, Ascending or Descending
order)
SORT
FIELDS=(pos1,len1,type1,opt1,pos2,len2,type2,opt2,...)
{,SIZE=n | En}
{,FILSZ=n |
eN}
{,DYNALLOC=(OFF) | (d,n){,RETRY=(OFF | (nn,mm)}}
{,SKIPREC=n} --> skip
these many records and then start the sort operation
{,STOPAFT=n} --> Stop
after these records
{,EQUALS |
NOEQUALS}
{,CKPT |
CHKPT}{,CENTWIN={0 | s | f}
EQUALS ¦ NOEQUALS -
Determines whether or not the sort will preserve the
order of records with identical sort fields.
NOEQUALS is the default, and causes equal-keyed records
to bewritten in a random order, not in the order they were encountered.
Example:
SORT FIELDS=(16,15,CH,A)
--> Sorting on single field(in ascending order)
SORT FIELDS=(16,15,CH,A,31,15,CH,A) --> Sorting on
multiple Fields.
We can also write the above statement as
SORT FIELDS=(16,15,A,31,15,A),FORMAT=CH --> Use FORMAT
if the format of all fields being sorted is same.
Following are the available data formats:
Merge two or more datasets to form a single dataset.
Requirements of merging two datasets is:
Remember that merging is different from concatenating.
Concatenating means data is just appended back to back. With merging sort order
is maintained.
Merge Syntax is :
MERGE FIELDS=...{,FILES=n}{,EQUALS | NOEQUALS}{,CKPT |
CHKPT}{,CENTWIN={0 | s | f}}
Example;
MERGE FIELDS=(16,15,A,31,15,A),FORMAT=CH
The sort order 'A' indicates the order in which the data
is already sorted in the input files.
When using Merge do not use SORTWKnn DD statement.
Instead of SORTIN DD we use SORTINnn DD. One SORTINnn
statement for each of the input file. Nn stands for 01 to 16.
The SORT/MERGE control statement with FIELDS=COPY defines
the application as a COPY application.
SORT FIELDS=COPY
MERGE FIELDS=COPY
Note that with sort, merge we should always use FIELDS=
(even of we are just requesting a copy application)
Following is the format:
SORT FIELDS=COPY{,SKIPREC=n}{,STOPAFT=n}{,CKPT | CHKPT}
or
MERGE FIELDS=COPY{,SKIPREC=n}{,STOPAFT=n}{,CKPT | CHKPT}
SKIPREC indicates
the number of records to be skipped.(With OUTFIL equivalent is STARTREC. Note
that STARTREC can be used only with OUTFIL)
STOPAFT indicates
the number of records to process. (With OUTFIL equivalent is ENDREC. Note that
ENDREC can be used only with OUTFIL)
CKPT/CHKPT
indicates a checkpoint is desired at the end of volume of a SORTOUT data set
when OUTFIL is not used.
Note that we could also code OPTION COPY to perform the copy application
Used to establish selection criteria for records to be
included in the output dataset.
We can compare the contents of its fields to a constant
or another field in the record.
Include Statement cannot appear with OMIT statement on
the same SORT operation.
Format Of
include:
INCLUDE COND={({c1,{AND | OR},c2},...){,FORMAT=x} }
{ALL}
{NONE}
The AND and OR relational operators are used to link
together as many repetitions of the 'expression' field as desired.
Example:
SORT FIELDS=(16,15,CH,A)
INCLUDE COND=(16,15,CH,EQ,31,15,CH) --> comparing with
other field in the record
SORT FIELDS=COPY
INCLUDE COND=(46,10,BI,GT,2000,OR,46,10,BI,LT,10000)
--> Comparing Against constants
INCLUDE COND=((10,3,CH,EQ,C'REV'),AND,(67,2,CH,NE,C'GA'))
--> Using logical operator AND
INCLUDE
COND=((10,3,EQ,C'REV'),AND,(67,2,NE,C'GA')),FORMAT=CH
The INCLUDE above will only pass through records with the
character string 'REV' inposition 10 and the state abbreviation 'GA' in
position 67.
INCLUDE
COND=((21,1,BI,EQ,X'22'),OR,(21,1,BI,EQ,X'47'),OR,(21,1,BI,EQ,X'F3')) -->
Using logical operator OR.
Used to set up selection criteria for records to be
omitted from the output dataset.
We can omit a record by comparing contents of its fields
to a constant or another field in the record.
Omit Statement cannot appear with INCLUDE on the same
SORT execution.
Format of OMIT:
OMIT COND={({c1,{AND | OR},c2},...){,FORMAT=x} }
{ALL}
{NONE}
Example:
SORT FIELDS=COPY
OMIT COND=(16,15,CH,EQ,31,15,CH)
OMIT COND=((10,3,CH,EQ,C'REV'),AND,(67,2,CH,NE,C'GA')) OR
OMIT
COND=((10,3,EQ,C'REV'),AND,(67,2,NE,C'GA')),FORMAT=CH
Comparison Operators that can be used with INCLUDE and
OMIT are EQ,NE,GT,GE,LE,LT
The SUM control statement deletes records with equal
control fields and optionally summarizes specified numeric fields on those
records. If numeric fields are to be summarized, the data in the summary fields
is added, the sum is placed in one of the records, and the other record is
deleted.
The format of the SUM statement is:
{FIELDS={NONE}
}
SUM {FIELDS=(p1,l1,f1 {,p2,l2,f2) ... ) }
{FIELDS=(p1,l1
{,p2,l2) ... ),FORMAT=f } {,XSUM}
Where XSUM means the dropped records are written in the
dataset specified by SORTXSUM data set.
INCLUDE COND=(31,4,CH,EQ,C'MIKE')
SORT FIELDS=(31,15,,CH,A)
SUM FIELDS=(46,10,BI)
The result will contain a Single row which is top mostrow
of the Sorted fields including the condition mentioned in INCLUDE Statement,
and the Price Fields will contain the Sum of prices of all books whose Author
is MIKE.
SORT FIELDS=COPY
SUM FIELDS=NONE
We could use XSUM if we want to save off the remaining
records.
SUM FIELDS=NONE,XSUM
In this case we must have a additional DD called
SORTXSUM. This is where the discards will go.
We can perform reformatting using INREC,OUTREC and
OUTFIL.
We can use INREC,OUTREC,OUTFIL to
INREC: Formatting will be done before sorting ,
merging or copying of the records is done. Hence we will refer the original
file layout when using INREC. In short operation will be performed on the input
file.
Use of INREC improves the sort performance by reducing
the number of bytes that must be processed.
The format of the INREC statement is INREC FIELDS=(...).
The FIELDS parameter simply identifies the fields that
should be processed.
A sample INREC statement is as follows:
INREC FIELDS=(1:1,20,21:40,15,ZD,PD,29:60,5)
In this statement, 3 data fields are specified as
follows:
It will be in position 1 of the output record.
The field will be converted to PD. It will be in position
21 of the output record.
It will be in position 29 of the output record.
IN the above example we used absolute positioning using
":". We can also just specify the position in input file and it will
create fields back to back.
OUTREC: Formatting will be done after sorting
or merging is done. In short Operation will be performed on the output file.
OUTFIL: The OUTFIL control statement describes
the output file or files.
OUTFIL
is used for following purposes:
This task uses these parameters: FILES,
FNAMES,INCLUDE/OMIT, STARTREC, ENDREC, SAVE, OUTREC, CONVERT, SPLIT2.
This task uses these parameters: HEADER1, HEADER2,LINES,
NODETAIL, SECTIONS, TRAILER1, TRAILER2.
The
format of the OUTFIL statement is:
OUTFIL
{FILES={fileid}{(fileid1 {fileid2}...} --> Specifies fileid's . This is
used when the output DDNAMES are of type SORTOFnn. The number nn will be used
as fileid.
{,FNAMES={ddname}{(ddname1 {ddname2} ...
)} --> Here we specify the
actual ddname. This will be used if we don't use the names of output files as
SORTOFnn.
{ALL}{NONE}{ {,AND,} }
{,INCLUDE={(c1,{,&, } C2... } --> specifies the include criteria to
select records to be copied to a file specified by FILES or FNAMEs
{,OMIT= { {,OR, } }{ {,¦, } } --> Specified the omit criteria to skip the records from being
copied to a file specified by FILES or FNAMES
{,STARTREC=n} --> Indicates the record number of start
working for output file specified by FNAMES or FILES
{,ENDREC=n} --> Indicates the record number of stop working for
output file specified by FNAMES or FILES
{,SAVE}
{,SPLIT}
--> Split data from
input equally among output files
{,OUTREC=(field1, {,field2} ... )} --> similar to ourrec processing.
Note that on OUTFIL we use OUTREC and not INREC.
{,CONVERT}
{,HEADER1=(field1, {,field2} ... )} --> used for reporting purpose.
{,HEADER2=(field1, {,field2} ... )}
{,TRAILER1=(field1, {,field2} ... )}
{,TRAILER2=(field1, {,field2} ... )}
{,SECTIONS=(field1, {,field2} ... )}
{,LINES={n | ANSI |
(ANSI,n)}}{,NODETAIL}
Examples:
SORT FIELDS=COPY
OUTREC FIELDS=(16,15,31,15)
This will Create a output file without the 1st
field(1-15characters)
SORT FIELDS=COPY
OUTREC FIELDS=(31,15,16,15)
Thus the fields will be reordered.
SORT FIELDS=COPY
OUTREC FIELDS=(31,15,16,15,4,4Z)
SORT FIELDS=COPY
OUTREC FIELDS=(20X,31,15,16X,31,15)
This will put 20 blank fields before 1st field and 16
blank spaces before 2nd field.
OPTION COPY
OUTFIL FNAMES=(OUTPUT1,OUTPUT2,OUTPUT3)
OUTPUT1,OUTPUT2,OUTPUT3 are the 3 ddnames in the JCL.
SORT FIELDS=COPY
OUTFIL FNAMES=OUT1,ENDREC=5
OUTFIL FNAMES=OUT2,STARTREC=6,ENDREC=10
OUTFIL FNAMES=OUT3,STARTREC=11
STARTREC,ENDREC are used only with OUTFIL processing.
When not using OUTFIL we can use STOPAFT.
SORT FIELDS=COPY
OUTFIL FNAMES=OUT1,INCLUDE=(31,15,CH,EQ,C'MIKE')
OUTFIL FNAMES=OUT2,INCLUDE=(31,15,CH,EQ,C'REVN')
OUTFIL FNAMES=OUT3,INCLUDE=(31,15,CH,EQ,C'GAND')
Note that we don’t write COND when using INCLUDE on the
OUTFIL.
Build command can us be used with OUTREC and INREC to
recreate the record layout. OVERLAY can be used to keep the existing layout
same and add/replace some data column.
SORT FIELDS=COPY
OUTFIL FNAMES=OUT1,BUILD=(16,15,X,SEQNUM,4,ZD)
SEQNUM can be used to add sequence numbers to rows.
Suppose we have a file and we don’t know the number of
records and we want to divide them equally among 3 files then we could use the
SPLIT option as shown below:
OPTION COPY
OUTFILE FNAMES=(OUTPUT1,OUTPUT2,OUTPUT30,SPLIT
Above example will create 3 files each of 1/3rd size of the
original file.
There
are Around 27 Predefined Edit masks named M0 to M26, which can be used to
convert non Edited data in to the Edited form.
We
can also manually create edited forms:
Example:
SORT
FIELDS=(16,15,CH,A)
OUTREC
FIELDS=(5X,16,15,5X,46,8,BI,EDIT=(SIII,III,TT.TT),SIGNS=(,-))
T:- if there is no value or it is a zero then
Zero will be printed Else if there is Some value that value will be printed.
e.g
if EDIT=(TTTT) is give and value is 4 then it will be printed as 0004 in the
report.
I:-If there is no value Zero will not be
inserted
e.g if EDIT=(IIII) is given and if the value in
input file Is 0004 then it will be printed as 4.
S:-indicated the Sign.
SIGNS=(,-) Will Print ±if the input value is negative
and does space when it is Positive.