View previous topic :: View next topic
Author
Message
Learncoholic New User Joined: 20 Sep 2007Posts: 97 Location: India
Hi I have a query on the following JCL
Code:
//STEP1 EXEC PGM=SYNCTOOL
//DFSMSG DD SYSOUT=*
//TOOLMSG DD SYSOUT=*
//INDD DD *
A.B.CCCCCCC.DDDDDDDD.EEEEEE
A.B.CCCCCCC.DDDDDDDD.FFFFFF
A.B.CCCCCCC.DDDDDDDD.GGGGGG
A.B.CCCCCCC.DDDDDDDD.HHHHHH
A.B.CCCCCCC.DDDDDDDD.IIIIII
/*
//OUTDD DD DSN=&&OUTDD,DISP=(NEW,PASS),SPACE=(CYL,(1,1)),
// UNIT=SYSDA,DCB=(RECFM=FB,LRECL=80)
//TEMP1 DD DSN=&&TEMP1,DISP=(NEW,PASS),SPACE=(CYL,(1,1))
//TOOLIN DD *
SORT FROM(INDD) TO(TEMP1) USING(CNT1)
SORT FROM(TEMP1) TO(OUTDD) USING(CNT2)
/*
//CNT1CNTL DD *
SORT FIELDS=(81,5,PD,D)
INREC OVERLAY(81:SEQNUM,5,PD)
OUTFIL REMOVECC,IFTHEN=(WHEN=(81,5,PD,EQ,1),
BUILD=(C' NAME (',1,27)),
IFTHEN=(WHEN=NONE,BUILD=(C' ',1,27,C','))
/*
//CNT2CNTL DD *
SORT FIELDS=(81,5,PD,D)
INREC OVERLAY(81:SEQNUM,5,PD)
OUTFIL REMOVECC,IFTHEN=(WHEN=(81,5,PD,EQ,1),
OVERLAY(29:C')'))
/*
The JCL Gives an error as:
Code:
SORT FIELDS=(81,5,PD,D) 0024000
INREC OVERLAY(81:SEQNUM,5,PD) 0025000
OUTFIL REMOVECC,IFTHEN=(WHEN=(81,5,PD,EQ,1), 0026000
OVERLAY(29:C')')) 0027000
PARMLIST :
OPTION RESINV=0,ARESINV=0,MSGDDN=DFSMSG,SORTIN=TEMP1,SORTOUT=OUTDD,SORTDD=CNT2,
YNALLOC
WER428I CALLER-PROVIDED IDENTIFIER IS "0002"
WER276B SYSDIAG= 197596, 949450, 949450, 1257165
WER164B 7,976K BYTES OF VIRTUAL STORAGE AVAILABLE, MAX REQUESTED,
WER164B 0 BYTES RESERVE REQUESTED, 500K BYTES USED
WER146B 12K BYTES OF EMERGENCY SPACE ALLOCATED
WER108I TEMP1 : RECFM=FB ; LRECL= 34; BLKSIZE= 27982
WER257I INREC RECORD LENGTH = 85
WER238I POTENTIALLY INEFFICIENT USE OF INREC
WER110I OUTDD : RECFM=FB ; LRECL= 80; BLKSIZE= 27920
WER247A OUTDD HAS INCOMPATIBLE LRECL
WER211B SYNCSMF CALLED BY SYNCSORT; RC=0000
I want the o/p as :
Code:
NAME (A.B.CCCCCCC.DDDDDDDD.EEEEEE
A.B.CCCCCCC.DDDDDDDD.FFFFFF,
A.B.CCCCCCC.DDDDDDDD.GGGGGG,
A.B.CCCCCCC.DDDDDDDD.HHHHHH,
A.B.CCCCCCC.DDDDDDDD.IIIIII)
The LRECL of the o/p file should be 80. Can this be attained using only 1 use of SYNCTOOL and 2 control cards?
Back to top
murmohk1 Senior Member Joined: 29 Jun 2006Posts: 1436 Location: Bangalore,India
Learnholic,
Change the following statement of CNT1CNTL -
Code:
OUTFIL REMOVECC,IFTHEN=(WHEN=(81,5,PD,EQ,1),
BUILD=(C' NAME (',1,27)),
IFTHEN=(WHEN=NONE,BUILD=(C' ',1,27,C','))
to
Code:
OUTFIL REMOVECC,IFTHEN=(WHEN=(81,5,PD,EQ,1),
BUILD=(C' NAME (',1,27,80:X)),
IFTHEN=(WHEN=NONE,BUILD=(C' ',1,27,C',',80:X))
Back to top
Learncoholic New User Joined: 20 Sep 2007Posts: 97 Location: India
Hi murmohk1,
I changed the CNT1 card as you said. But unfortunately it is showing the same error.
Back to top
Aaru Senior Member Joined: 03 Jul 2007Posts: 1287 Location: Chennai, India
Learncoholic,
Use this Sort card
Code:
//STEP1 EXEC PGM=ICETOOL
//DFSMSG DD SYSOUT=*
//TOOLMSG DD SYSOUT=*
//INDD DD *
A.B.CCCCCCC.DDDDDDDD.EEEEEE
A.B.CCCCCCC.DDDDDDDD.FFFFFF
A.B.CCCCCCC.DDDDDDDD.GGGGGG
A.B.CCCCCCC.DDDDDDDD.HHHHHH
A.B.CCCCCCC.DDDDDDDD.IIIIII
/*
//OUTDD DD DSN=HLQ1.NEW.N94R,DISP=(,CATLG,DELETE),
// UNIT=SYSDA,DCB=(RECFM=FB,LRECL=80)
//TEMP1 DD DSN=&&TEM49,DISP=(NEW,PASS),SPACE=(CYL,(1,1))
//TOOLIN DD *
SORT FROM(INDD) TO(TEMP1) USING(CNT1)
SORT FROM(TEMP1) TO(OUTDD) USING(CNT2)
/*
//CNT1CNTL DD *
SORT FIELDS=(80,1,PD,D)
INREC OVERLAY(80:SEQNUM,1,PD)
OUTFIL REMOVECC,IFTHEN=(WHEN=(80,1,PD,EQ,1),
BUILD=(C' NAME (',1,27,80:X)),
IFTHEN=(WHEN=NONE,BUILD=(C' ',1,27,C',',80:X))
/*
//CNT2CNTL DD *
SORT FIELDS=(80,1,PD,D)
INREC OVERLAY(80:SEQNUM,1,PD)
OUTFIL REMOVECC,IFTHEN=(WHEN=(80,1,PD,EQ,1),
BUILD=(1,28,C')',80:X)),
IFTHEN=(WHEN=NONE,BUILD=(1,75,80:X))
/*
Back to top
Learncoholic New User Joined: 20 Sep 2007Posts: 97 Location: India
Hi Aaru
The sort card you have given is working absolutely fine. Thanks Once again for helping me out.
Back to top
Aaru Senior Member Joined: 03 Jul 2007Posts: 1287 Location: Chennai, India
Learncoholic,
Quote:
Thanks Once again for helping me out.
You are welcome . It would be great if you can build on this and learn these concepts.
I found the following from your sort card.
Code:
SORT FIELDS=(81,5,PD,D)
INREC OVERLAY(81:SEQNUM,5,PD)
You are Overlaying the data after sorting. It depends on your requirement but usually we sort after overlaying the data.
Code:
WER257I INREC RECORD LENGTH = 85
WER238I POTENTIALLY INEFFICIENT USE OF INREC
WER110I OUTDD : RECFM=FB ; LRECL= 80; BLKSIZE= 27920
WER247A OUTDD HAS INCOMPATIBLE LRECL
This has been explained already and also self-explanatory.
Back to top
Learncoholic New User Joined: 20 Sep 2007Posts: 97 Location: India
Hi Aaru,
INREC is performed before sort operation & OUTREC after sort operation. Isn't it? Well that's where I am in doubt. How do I change this operation? Shall I use:
Code:
INREC OVERLAY(81:SEQNUM,5,PD)
SORT FIELDS=(81,5,PD,D)
instead?
Back to top
Aaru Senior Member Joined: 03 Jul 2007Posts: 1287 Location: Chennai, India
Learncoholic,
Quote:
INREC is performed before sort operation & OUTREC after sort operation. Isn't it?
Yes, you are right. But i was not mentioning that.
Code:
SORT FIELDS=(81,5,PD,D)
INREC OVERLAY(81:SEQNUM,5,PD)
First you are sorting based on the values in the 5 bytes starting from 81. But only in the OVERLAY you are adding the sequence no. According to me, there is no point in sorting before adding the sequence no.
Do not alter the working JCL
Back to top
Learncoholic New User Joined: 20 Sep 2007Posts: 97 Location: India
Hi Aaru
Then
Code:
INREC OVERLAY(81:SEQNUM,5,PD)
SORT FIELDS=(81,5,PD,D)
this code should be fine I suppose?
Quote:
Do not alter the working JCL
Of course not
Back to top
Aaru Senior Member Joined: 03 Jul 2007Posts: 1287 Location: Chennai, India
Learncoholic,
Quote:
this code should be fine I suppose?
Yes, that would also work fine.
Back to top
shankar.v Active User Joined: 25 Jun 2007Posts: 196 Location: Bangalore
Learncoholic,
You are doing (copy + adding sequence numbers) two times and also sorting two times based on the sequence numbers.
The following sort jcl which may suit your requirement contains two steps, both with copy and adding sequence numbers on the second step only and also no sort is involved. This may give you a better performance while doing a run with large number of records.
And also I think you will need a "," in position 35 in first record. The following jcl includes that also. If you are going to use this code and don't want that "," change the code accordingly.
Code:
//S EXEC PGM=SORT
//SORTIN DD *
A.B.CCCCCCC.DDDDDDDD.EEEEEE
A.B.CCCCCCC.DDDDDDDD.FFFFFF
A.B.CCCCCCC.DDDDDDDD.GGGGGG
A.B.CCCCCCC.DDDDDDDD.HHHHHH
A.B.CCCCCCC.DDDDDDDD.IIIIII
/*
//SORTOUT DD DSN=&&SYMNAMES,DISP=(,PASS),SPACE=(TRK,(1,1))
//SYSOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
OUTFIL REMOVECC,NODETAIL,BUILD=(80X),
TRAILER1=(C'LASTREC,+',COUNT=(M11,LENGTH=8))
/*
// EXEC PGM=SORT
//SORTIN DD *
A.B.CCCCCCC.DDDDDDDD.EEEEEE
A.B.CCCCCCC.DDDDDDDD.FFFFFF
A.B.CCCCCCC.DDDDDDDD.GGGGGG
A.B.CCCCCCC.DDDDDDDD.HHHHHH
A.B.CCCCCCC.DDDDDDDD.IIIIII
/*
//SYMNAMES DD DSN=*.S.SORTOUT,DISP=(OLD,DELETE),VOL=REF=*.S.SORTOUT
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
INREC IFTHEN=(WHEN=INIT,OVERLAY=(81:SEQNUM,8,ZD)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+1),BUILD=(C' NAME (',1,27,C',',80:X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,LASTREC),BUILD=(X,1,27,C')',80:X)),
IFTHEN=(WHEN=(81,8,ZD,GT,+1),BUILD=(X,1,27,C',',80:X))
OUTFIL BUILD=(1,80)
Output:
Code:
NAME (A.B.CCCCCCC.DDDDDDDD.EEEEEE,
A.B.CCCCCCC.DDDDDDDD.FFFFFF,
A.B.CCCCCCC.DDDDDDDD.GGGGGG,
A.B.CCCCCCC.DDDDDDDD.HHHHHH,
A.B.CCCCCCC.DDDDDDDD.IIIIII)
Back to top
Aaru Senior Member Joined: 03 Jul 2007Posts: 1287 Location: Chennai, India
Shankar,
Learncoholic wrote:
Quote:
Can this be attained using only 1 use of SYNCTOOL and 2 control cards?
Yes, the sort card can be used for better performance but OP wanted to do this using SYNCTOOL/2 control cards.
Back to top
shankar.v Active User Joined: 25 Jun 2007Posts: 196 Location: Bangalore
Learncoholic,
Quote:
Can this be attained using only 1 use of SYNCTOOL and 2 control cards?
You are doing (copy + adding sequence numbers) two times and also sorting two times based on the sequence numbers.
The following alternative sort jcl to the one posted before which may suit your requirement contains one step with two I/Os, both with copy and adding sequence numbers on the second I/O only and also no sort is involved. This may give you a better performance while doing a run with large number of records.
And also I think you will need a "," in position 35 in first record. The following jcl includes that also. If you are going to use this code and don't want that "," change the code accordingly.
Code:
// EXEC PGM=SYNCTOOL
//DFSMSG DD SYSOUT=*
//TOOLMSG DD SYSOUT=*
//INFILE DD *
A.B.CCCCCCC.DDDDDDDD.EEEEEE
A.B.CCCCCCC.DDDDDDDD.FFFFFF
A.B.CCCCCCC.DDDDDDDD.GGGGGG
A.B.CCCCCCC.DDDDDDDD.HHHHHH
A.B.CCCCCCC.DDDDDDDD.IIIIII
/*
//T DD DSN=&&T,DISP=(,PASS),SPACE=(CYL,(1,1))
//OUT DD SYSOUT=*
//TOOLIN DD *
COPY FROM(INFILE) TO(T) USING(CTL1)
COPY FROM(INFILE) TO(OUT) USING(CTL2)
/*
//CTL1CNTL DD *
OUTFIL REMOVECC,NODETAIL,BUILD=(80X),
OUTFIL REMOVECC,NODETAIL,BUILD=(80X),
TRAILER1=(C' IFTHEN=(WHEN=(81,8,ZD,EQ,+',COUNT=(M11,LENGTH=8),
C'),BUILD=(X,1,27,C'')'',80:X)),',80:X)
/*
//CTL2CNTL DD *
INREC IFTHEN=(WHEN=INIT,OVERLAY=(81:SEQNUM,8,ZD)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+1),BUILD=(C' NAME (',1,27,C',',80:X)),
/*
// DD DSN=*.T,DISP=(OLD,DELETE),VOL=REF=*.T
// DD *
IFTHEN=(WHEN=(81,8,ZD,GT,+1),BUILD=(X,1,27,C',',80:X))
OUTFIL BUILD=(1,80)
/*
//
Output:
Code:
NAME (A.B.CCCCCCC.DDDDDDDD.EEEEEE,
A.B.CCCCCCC.DDDDDDDD.FFFFFF,
A.B.CCCCCCC.DDDDDDDD.GGGGGG,
A.B.CCCCCCC.DDDDDDDD.HHHHHH,
A.B.CCCCCCC.DDDDDDDD.IIIIII)
Back to top
Learncoholic New User Joined: 20 Sep 2007Posts: 97 Location: India
Hi shankar.v,
It's too hot for me to handle this. Can you please explain it to me in short?
Back to top
shankar.v Active User Joined: 25 Jun 2007Posts: 196 Location: Bangalore
Please take one OUTFIL REMOVECC,NODETAIL,BUILD=(80X) in CTL1 as i wrongly posted because of copy/paste mistake.
Quote:
Hi shankar.v,
It's too hot for me to handle this. Can you please explain it to me in short?
CTL1 will build a part of sort card required for CTL2 and is the following one.
Code:
IFTHEN=(WHEN=(81,8,ZD,EQ,<count of number of records in input file.i.e,last record>),
BUILD=(X,1,27,C')',80:X)),
CTL2CNTL is associated with three DD concatenate and final will looks like
Code:
INREC IFTHEN=(WHEN=INIT,OVERLAY=(81:SEQNUM,8,ZD)),
IFTHEN=(WHEN=(81,8,ZD,EQ,+1),BUILD=(C' NAME (',1,27,C',',80:X)),
IFTHEN=(WHEN=(81,8,ZD,EQ,<count of number of records in input file.i.e,last record>),
BUILD=(X,1,27,C')',80:X)),
IFTHEN=(WHEN=(81,8,ZD,GT,+1),BUILD=(X,1,27,C',',80:X))
OUTFIL BUILD=(1,80)
Back to top
Please enable JavaScript!