View previous topic :: View next topic
Author
Message
vishalbshah New User Joined: 01 Dec 2006Posts: 61 Location: Pune
Hi,
I am using below SORT step to join records from 2 files.
Code:
//SORT10 EXEC PGM=SORT
//SORTJNF1 DD DSN=TCS.TEST.SORT.VISHAL.LRECL783,DISP=SHR
//SORTJNF2 DD DSN=TCS.TEST.SORT.VISHAL1.LRECL783,DISP=SHR
//SORTOUT DD DSN=TCS.TEST.SORT.VISHAL3.LRECL783,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSIN DD *
JOINKEYS FILES=F1,FIELDS=(1,5,A),SORTED
JOINKEYS FILES=F2,FIELDS=(1,5,A),SORTED
REFORMAT FIELDS=(F1:1,36,F2:66,14,F1:49,733)
OPTION COPY
/*
Currently it is joining records where 1st five characters from both the file are matching.... and only those matched records are getting reformatted in the output file
I want to change the control card such that even if the record from File 1 doesn't match to File 2 it should write File 1 record as it is in the output file.
Back to top
vishalbshah New User Joined: 01 Dec 2006Posts: 61 Location: Pune
I have added below card and it worked.
Now, i don't wan to sort these two files or neither want to match them on any keys just want to merge the fileds record by record ...
File 1 is going to have more records for sure so once file 2 reaches at end all the rest of the records from File 1 should be copied as it is in the output file.
keeping the length of the records i.e. 783 in mind could someone please, suggest what control card should I use?
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
If you make yourself a couple of JNFnCNTL files, and append sequence numbers to the files in each, then use those sequence numbers for the key, you should get what you want.
Back to top
vishalbshah New User Joined: 01 Dec 2006Posts: 61 Location: Pune
Hi Bill,
I tried the same :
Code:
//JNF1CNTL DD *
INREC OVERLAY=(780:SEQNUM,3,ZD)
/*
//JNF2CNTL DD *
INREC OVERLAY=(780:SEQNUM,3,ZD)
/*
//SYSIN DD *
JOINKEYS FILES=F1,FIELDS=(780,3,A),SORTED
JOINKEYS FILES=F2,FIELDS=(780,3,A),SORTED
REFORMAT FIELDS=(F1:1,36,F2:66,14,F1:49,733)
JOIN UNPAIRED,F1
OPTION COPY
/*
File 1
Code:
00001|CPP000562712 |0800000000 |+ |0100 |HAYLEY
00002|CPP000562772 |0800000004 |+ |0055 |PAULIN
00003|CPP000562712 |0800000018 |+ |0041 |HILLAR
00005|CPP000562712 |0800000017 |+ |0041 |MATHEW
00004|CPP000562712 |0800000019 |+ |0041 |HALE
00002|CPP000562752 |0800000020 |+ |0041 |ADRIAN
File 2
Code:
00001|CPP000562712 |0800000000 HAYLEY
I got output as
Code:
00001|CPP000562712 |0800000000 |+ HAYLEY EMMA |0100 |HAYL
00002|CPP000562772 |0800000004 |+ HAYLEY EMMA |0055 |PAUL
00003|CPP000562712 |0800000018 |+ HAYLEY EMMA |0041 |HILL
00005|CPP000562712 |0800000017 |+ HAYLEY EMMA |0041 |MATH
00004|CPP000562712 |0800000019 |+ HAYLEY EMMA |0041 |HALE
00002|CPP000562752 |0800000020 |+ HAYLEY EMMA |0041 |ADRI
As you can see the name (i.e. F2:66,14) is copied in all the File 1 record not just 1st one ,
I want to write control card such that it should just leave File 1 record as it is if file 2 records are complete.
Back to top
vishalbshah New User Joined: 01 Dec 2006Posts: 61 Location: Pune
Basically the desired output in this case where file 2 just have 1 record should look like below:
Code:
0001|CPP000562712 |0800000000 |+ HAYLEY EMMA |0100 |HAYL
0002|CPP000562772 |0800000004 |+ |0055 |PAUL
0003|CPP000562712 |0800000018 |+ |0041 |HILL
0005|CPP000562712 |0800000017 |+ |0041 |MATH
0004|CPP000562712 |0800000019 |+ |0041 |HALE
0002|CPP000562752 |0800000020 |+ |0041 |ADRI
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
OK, this would work with DFSORT but you are using Syncsort.
Your JNFnCNTLs are being ignored, and the join is done just on whaterver is lying around at 780, probably has the same value, so replicates the same data as with a "multiple" match.
Put the sequences numbers on in prior steps, or talk to Syncsort.
Back to top
vishalbshah New User Joined: 01 Dec 2006Posts: 61 Location: Pune
Hi Bill,
Could you please, suggest any other option to do this using SYNCSORT?
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
I've already suggested the other option.
Read file 1, add a sequence, create new file 1+seq.
Read file 2, add a sequence, create new file 2+seq.
Join with the two new files.
Three steps, but there you go.
I don't have Syncsort documentation or access to the product.
You could write a program in Cobol, as I see you know it, if you don't like three steps.
Back to top
daveporcelan Active Member Joined: 01 Dec 2006Posts: 792 Location: Pennsylvania
Bill, Bill, Bill, why can't you provide the code for same?
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
:-)
New step 1
Code:
//SYSIN DD *
SORT FIELDS=COPY
INREC OVERLAY=(780:SEQNUM,3,ZD)
New step 2
Code:
//SYSIN DD *
SORT FIELDS=COPY
INREC OVERLAY=(780:SEQNUM,3,ZD)
To be fair, TS/OP already came up with the code themselves, so just for fun :-)
This is untested.
You want it with SYMNAMES, Dave? :-)
Back to top
daveporcelan Active Member Joined: 01 Dec 2006Posts: 792 Location: Pennsylvania
Quote:
You want it with SYMNAMES, Dave? :-)
Good one, too complicated for me.
Back to top
vishalbshah New User Joined: 01 Dec 2006Posts: 61 Location: Pune
Hi,
I have tried 3 step JCL with below inputs :
File 1 :
Code:
00001|CPP000562712 |0800000000 |+ AAAAAAAAAAAA|0100 |HAYLEY
00002|CPP000562772 |0800000004 |+ CCCCCCCCCCCC|0055 |PAULIN
00003|CPP000562712 |0800000018 |+ AAAAAAAAAAAA|0041 |HILLAR
00005|CPP000562712 |0800000017 |+ CCCCCCCCCCCC|0041 |MATHEW
00004|CPP000562712 |0800000019 |+ AAAAAAAAAAAA|0041 |HALE
00002|CPP000562752 |0800000020 |+ CCCCCCCCCCCC|0041 |ADRIAN
File 2
Code:
00001|CPP000562712 |0800000000 HAYLEY
I want output
Code:
00001|CPP000562712 |0800000000 |+ HAYLEY EMMA |0100 |HAYL
00002|CPP000562772 |0800000004 |+ CCCCCCCCCCCCCC|0055 |PAUL
00003|CPP000562712 |0800000018 |+ AAAAAAAAAAAAAA|0041 |HILL
00005|CPP000562712 |0800000017 |+ CCCCCCCCCCCCCC|0041 |MATH
00004|CPP000562712 |0800000019 |+ AAAAAAAAAAAAAA|0041 |HALE
00002|CPP000562752 |0800000020 |+ CCCCCCCCCCCCCC|0041 |ADRI
as first record having data from File 1 and File 2 but rest should be AS IT IS from File1
I have tried 3 steps jCL as suggested :
but the Out put I got is
Code:
00001|CPP000562712 |0800000000 |+ HAYLEY EMMA |0100 |HAYL
00002|CPP000562772 |0800000004 |+ |0055 |PAUL
00003|CPP000562712 |0800000018 |+ |0041 |HILL
00005|CPP000562712 |0800000017 |+ |0041 |MATH
00004|CPP000562712 |0800000019 |+ |0041 |HALE
00002|CPP000562752 |0800000020 |+ |0041 |ADRI
I have used below JCL with all 3 steps :
Code:
//TCSVBSTS JOB 0000,'SEQNM',CLASS=7,MSGCLASS=U,
// NOTIFY=&SYSUID,MSGLEVEL=(1,1)
//* $ACFJ219 ACF2 ACTIVE I003
//SORT10 EXEC PGM=SORT
//SORTIN DD DSN=TCS.TEST.SORT.VISHAL.LRECL783,DISP=SHR
//SORTOUT DD DSN=&&TEMP1,
// DISP=(NEW,PASS,DELETE),SPACE=(TRK,(5,5))
//SYSOUT DD SYSOUT=*
//SYSOUZ DD SYSOUT=*
//SORTWK01 DD SPACE=(TRK,(1,1))
//SYSIN DD *
SORT FIELDS=COPY
INREC FIELDS=(1,783,SEQNUM,3,ZD,START=1)
/*
//SORT20 EXEC PGM=SORT
//SORTIN DD DSN=TCS.TEST.SORT.VISHAL1.LRECL783,DISP=SHR
//SORTOUT DD DSN=&&TEMP2,
// DISP=(NEW,PASS,DELETE),SPACE=(TRK,(5,5))
//SYSOUT DD SYSOUT=*
//SYSOUZ DD SYSOUT=*
//SORTWK01 DD SPACE=(TRK,(1,1))
/*
//SYSIN DD *
SORT FIELDS=COPY
INREC FIELDS=(1,783,SEQNUM,3,ZD,START=1)
/*
//SORT30 EXEC PGM=SORT
//SORTJNF1 DD DSN=&&TEMP1,DISP=OLD
//SORTJNF2 DD DSN=&&TEMP2,DISP=OLD
//SORTOUT DD DSN=TCS.TEST.SORT.VISHAL3.LRECL783,DISP=SHR
//* DISP=(NEW,CATLG,DELETE),SPACE=(TRK,(5,5))
//SYSOUT DD SYSOUT=*
//SYSOUZ DD SYSOUT=*
//SORTWK01 DD SPACE=(TRK,(1,1))
//SYSIN DD *
JOINKEYS FILES=F1,FIELDS=(784,3,A),SORTED
JOINKEYS FILES=F2,FIELDS=(784,3,A),SORTED
REFORMAT FIELDS=(F1:1,36,F2:66,15,F1:50,732)
JOIN UNPAIRED,F1
OPTION COPY
/*
Is their a way I can tell Syncsort not to touch File 1 records and copy them as it is if there are not matching with File 2 or File2 has reached at end ?
At the moment as you can see I am getting Spaces overwritten in my file 1 data in the output if they are not matching.
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
DFSORT has an indicator telling you about the current JOINKEYS result.
Don't think it exists in Syncsort.
I don't have documentation, but look in yours for any examples, or search here with JOINKEYS and FILL, I think.
Back to top
gcicchet Senior Member Joined: 28 Jul 2006Posts: 1702 Location: Australia
Hi,
I would change your REFORMAT line to
Code:
REFORMAT FIELDS=(F1:1,783,F2:1,783)
Then I would use the
Code:
OUTREC IFTHEN=(WHEN
to format your output
Gerry
Back to top
bodatrinadh Active User Joined: 05 Jan 2007Posts: 101 Location: chennai (India)
Hi vishalbshah,
Try this snippet. Change the fields according to your requirment.
Code:
//STEP1A EXEC PGM=SORT
//SORTJNF1 DD *
00001|CPP000562712 |0800000000 |+ AAAAAAAAAAAA|0100 |HAYLEY
00002|CPP000562772 |0800000004 |+ CCCCCCCCCCCC|0055 |PAULIN
00003|CPP000562712 |0800000018 |+ AAAAAAAAAAAA|0041 |HILLAR
00005|CPP000562712 |0800000017 |+ CCCCCCCCCCCC|0041 |MATHEW
00004|CPP000562712 |0800000019 |+ AAAAAAAAAAAA|0041 |HALE
00002|CPP000562752 |0800000020 |+ CCCCCCCCCCCC|0041 |ADRIAN
//SORTJNF2 DD *
00001|CPP000562712 |0800000000 HAYLEY EMMA
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(1,05,A)
JOINKEYS FILE=F2,FIELDS=(1,05,A)
REFORMAT FIELDS=(F1:1,80,F2:1,80)
JOIN UNPAIRED,F1
OPTION COPY
INREC IFTHEN=(WHEN=(1,1,CH,NE,C' ',AND,81,1,CH,NE,C' '),
BUILD=(1,37,38:147,12,50,29))
And Your Output:-
Code:
00001|CPP000562712 |0800000000 |+ HAYLEY EMMA |0100 |HAYLEY
00002|CPP000562772 |0800000004 |+ CCCCCCCCCCCC|0055 |PAULIN
00002|CPP000562752 |0800000020 |+ CCCCCCCCCCCC|0041 |ADRIAN
00003|CPP000562712 |0800000018 |+ AAAAAAAAAAAA|0041 |HILLAR
00004|CPP000562712 |0800000019 |+ AAAAAAAAAAAA|0041 |HALE
00005|CPP000562712 |0800000017 |+ CCCCCCCCCCCC|0041 |MATHEW
Thanks
-3nadh
Back to top
vishalbshah New User Joined: 01 Dec 2006Posts: 61 Location: Pune
Hi,
Thanks for the suggestion for my record length :
Code:
JOINKEYS FILES=F1,FIELDS=(784,3,A),SORTED
JOINKEYS FILES=F2,FIELDS=(784,3,A),SORTED
REFORMAT FIELDS=(F1:1,786,F2:1,786)
JOIN UNPAIRED,F1
OPTION COPY
INREC IFTHEN=(WHEN=(787,1,CH,NE,C' '),
BUILD=(1,37,38:853,12,50,733)),
IFTHEN=(WHEN=NONE,BUILD=(1,783))
and I have got the desired output :
Code:
00001|CPP000562712 |0800000000 |+ HAYLEY EMMA |0100 |HAYLEY
00002|CPP000562772 |0800000004 |+ CCCCCCCCCCCC|0055 |PAULIN
00003|CPP000562712 |0800000018 |+ AAAAAAAAAAAA|0041 |HILLAR
00005|CPP000562712 |0800000017 |+ CCCCCCCCCCCC|0041 |MATHEW
00004|CPP000562712 |0800000019 |+ AAAAAAAAAAAA|0041 |HALE
00002|CPP000562752 |0800000020 |+ CCCCCCCCCCCC|0041 |ADRIAN
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
Without DFSORT's matching indicator, you always have to be careful that the "fill" character cannot exist as data in that particular position. You are probably OK in this case, so just a warning for now.
Back to top
Please enable JavaScript!