View previous topic :: View next topic
Author
Message
Frank Yaeger DFSORT Developer Joined: 15 Feb 2005Posts: 7129 Location: San Jose, CA
Ashutosh,
For your first requirement, you can try a DFSORT job like the following:
Code:
//S1 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=... input file (FB/104)
//SORTOUT DD DSN=... output file (FB/104)
//SYSIN DD *
OPTION COPY
INREC IFOUTLEN=104,
IFTHEN=(WHEN=INIT,
BUILD=(1,10,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',LENGTH=12),
11,30,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',LENGTH=32),
43,20,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',LENGTH=22),
65,30,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',LENGTH=32),
C'"',95,10,C'"')),
IFTHEN=(WHEN=INIT,
BUILD=(1,108,SQZ=(SHIFT=LEFT,PAIR=QUOTE))),
IFTHEN=(WHEN=INIT,FINDREP=(INOUT=(C'""',C'|',C'"',C'')))
/*
Your second requirement is more difficult, because DFSORT doesn't have a built-in function for easily determining the non-padded length of a field.
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
Ashutosh,
Here's an example of the type of thing you could use for the returning file. You've got several fields to do this for, and your fields are longer than my test field of 10 bytes (which needs 11 tests). You'll also have the problem of having to include the HIT=NEXT for the subsequent fields.
What is there that can actually be changed before the file comes back to you? As in which of the fields? One, all, how many? Unless they were all potentially subject to change, I'd prefer a match (with JOINKEYS, for instance) for what is coming back. Lets you do a bit of validation, always good when getting data from "someone else".
I'd also consider having some code to validate the lengths you do have for the fields going out, to check against the PARSEd fields. Not to check that the PARSE is working, but as an opportunity to check that the binary fields are actually correct.
Code:
//STEPTSP EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
INREC IFTHEN=(WHEN=(1,10,CH,EQ,C' '),OVERLAY(11:C'00')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,1,CH),OVERLAY(11:C'01')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,2,CH),OVERLAY(11:C'02')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,3,CH),OVERLAY(11:C'03')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,4,CH),OVERLAY(11:C'04')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,5,CH),OVERLAY(11:C'05')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,6,CH),OVERLAY(11:C'06')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,7,CH),OVERLAY(11:C'07')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,8,CH),OVERLAY(11:C'08')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,9,CH),OVERLAY(11:C'09')),
IFTHEN=(WHEN=(1,10,CH,EQ,1,10,CH),OVERLAY(11:C'10'))
//SORTIN DD *
1010101010
999999999
88888888
7777777
666666
55555
4444
333
22
1
INTENTIONALLY BLANKS
10
9
8
7
6
5
4
3
2
1 OH, RATS!
STILL INTENTIONALLY BLANKS
Output is:
Code:
101010101010
999999999 09
88888888 08
7777777 07
666666 06
55555 05
4444 04
333 03
22 02
1 01
00 INTENTIONALLY BLANKS
1010
9 09
8 08
7 07
6 06
5 05
4 04
3 03
2 02
1 01 OH, RATS!
00 STILL INTENTIONALLY BLANKS
Back to top
apandey New User Joined: 31 Aug 2009Posts: 73 Location: Mumbai
Thank a lot frank. It worked.
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
I've been playing around with the idea of checking the two field lengths from the record against the output.
This is fairly brutal. I've hacked Frank's code, to make it easier to test since TS didn't actually ask for it anyway. The important part is the inclusion of the field lengths (41,2,63,2) and the FTOV,VLTRIM=C' '
The second step then reads in the variable-length-record file, calculates what the record-length should have been if the field-lengths were correct (from the two field-lengths, the length of the field lengths, the number of delimiters (one in this case) and the RDW). Compares calculated to actual length and lists any anomolies.
I'd do this check as a matter of course. The length of those fields is being calculated again for the output record, so it should be verified against the existing field-length data.
Code:
//S1 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=&&OUT,DISP=(OLD,PASS)
//SORTOUT DD DSN=&&VARF,DISP=(,PASS),SPACE=(CYL,1),UNIT=SYSDA
//SYSIN DD *
OPTION COPY
INREC IFOUTLEN=104,
IFTHEN=(WHEN=INIT,
BUILD=(41,2,63,2,
43,20,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',LENGTH=22),
65,30,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',LENGTH=32))),
IFTHEN=(WHEN=INIT,
BUILD=(1,4,5,54,SQZ=(SHIFT=LEFT,PAIR=QUOTE))),
IFTHEN=(WHEN=INIT,FINDREP=(INOUT=(C'""',C'|',C'"',C'')))
OUTFIL FTOV,VLTRIM=C' '
/*
//S2 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=&&VARF,DISP=(OLD,PASS)
//SORTOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
OUTREC IFOUTLEN=72,
IFTHEN=(WHEN=INIT,
BUILD=(1,4,
C'N',
1,2,
5,2,BI,TO=ZD,LENGTH=5,
7,2,BI,TO=ZD,LENGTH=5,
+0,ADD,5,2,BI,ADD,7,2,BI,ADD,+9,
TO=BI,LENGTH=2,SEQNUM,8,ZD)),
IFTHEN=(WHEN=(6,2,BI,NE,18,2,BI),
OVERLAY=(5:C'Y',
30:6,2,BI,TO=ZD,LENGTH=5,
C' WAS ACT ',
18,2,BI,TO=ZD,LENGTH=5,
C' WAS CALC'))
OUTFIL VTOF,OUTREC=(1:5,68),INCLUDE=(5,1,CH,EQ,C'Y')
/*
Back to top
saiprasadh Active User Joined: 20 Sep 2006Posts: 154 Location: US
Hi,
Below mentioned sort card will meet your requirement.
Part 1:
Code:
//STEP01 EXEC PGM=SORT
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SORTIN DD *
100 RAHUL KUMAR ..IT ANALYST ..USA 0000123456
15489 JOHN SMIT ..PROJECT MANAGER ..USA 0000123456
366537 BIMAL ROY SEN ..SOFTWARE DEVELOPER ..USA 0000123456
/*
//SORTOUT DD DSN=<Output Dataset Name>,
// DISP=(NEW,CATLG,DELETE),
// UNIT=(SYSDA,9),SPACE=(CYL,(25,50),RLSE),
// DCB=(RECFM=FB,LRECL=104)
//SYSIN DD *
INREC IFTHEN=(WHEN=INIT,
BUILD=(1:1,10,
11:11,30,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',
LENGTH=32),
43:43,20,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',
LENGTH=22),
65:65,30,JFY=(SHIFT=LEFT,LEAD=C'"',TRAIL=C'"',
LENGTH=32),
97:95,10)),
IFTHEN=(WHEN=INIT,
BUILD=(1,106,
SQZ=(SHIFT=LEFT,PAIR=QUOTE,PREBLANK=C'"',MID=C'|')))
SORT FIELDS=COPY
OUTREC FINDREP=(IN=C'"',OUT=C'')
/*
Output:
Code:
100|RAHUL KUMAR|IT ANALYST|USA|0000123456
15489|JOHN SMIT|PROJECT MANAGER|USA|0000123456
366537|BIMAL ROY SEN|SOFTWARE DEVELOPER|USA|0000123456
Part 2:
Code:
//STEP01 EXEC PGM=SORT
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SORTIN DD *
100|RAHUL KUMAR|IT ANALYST|USA|0000123456
15489|JOHN SMIT|PROJECT MANAGER|USA|0000123456
366537|BIMAL ROY SEN|SOFTWARE DEVELOPER|USA|0000123456
/*
//SORTOUT DD DSN=<Output Dataset Name>,
// DISP=(NEW,CATLG,DELETE),
// UNIT=(SYSDA,9),SPACE=(CYL,(25,50),RLSE),
// DCB=(RECFM=FB,LRECL=104)
//SYSIN DD *
INREC IFTHEN=(WHEN=INIT,
PARSE=(%01=(ENDBEFR=C'|',FIXLEN=10),
%02=(ENDBEFR=C'|',FIXLEN=30),
%03=(ENDBEFR=C'|',FIXLEN=20),
%04=(ENDBEFR=C'|',FIXLEN=30),
%05=(ENDBEFR=C'|',FIXLEN=10)),
BUILD=(1:%01,11:%02,41:%03,
61:%04,91:%05,101:C',',
102:%03,JFY=(SHIFT=RIGHT,LEAD=C',',TRAIL=C',',
LENGTH=22),
124:%04,JFY=(SHIFT=RIGHT,LEAD=C',',TRAIL=C',',
LENGTH=32))),
IFTHEN=(WHEN=INIT,FINDREP=(STARTPOS=101,INOUT=(C' ',C'1'))),
IFTHEN=(WHEN=INIT,
PARSE=(%06=(ENDBEFR=C',',FIXLEN=100),
%07=(ENDBEFR=C',',FIXLEN=20),
%08=(ENDBEFR=C',',FIXLEN=20),
%09=(ENDBEFR=C',',FIXLEN=30),
%10=(ENDBEFR=C',',FIXLEN=30)),
BUILD=(1:%06,101:%07,UFF,TO=ZD,LENGTH=20,
121:%09,UFF,TO=ZD,LENGTH=30)),
IFTHEN=(WHEN=INIT,
BUILD=(1:1,100,
101:+20,SUB,(101,1,ZD,ADD,102,1,ZD,ADD,103,1,ZD,ADD,
104,1,ZD,ADD,105,1,ZD,ADD,106,1,ZD,ADD,107,1,ZD,ADD,
108,1,ZD,ADD,109,1,ZD,ADD,110,1,ZD,ADD,111,1,ZD,ADD,
112,1,ZD,ADD,113,1,ZD,ADD,114,1,ZD,ADD,115,1,ZD,ADD,
116,1,ZD,ADD,117,1,ZD,ADD,118,1,ZD,ADD,119,1,ZD,ADD,
120,1,ZD),EDIT=(TT),
103:+30,SUB,(121,1,ZD,ADD,122,1,ZD,ADD,123,1,ZD,ADD,
124,1,ZD,ADD,125,1,ZD,ADD,126,1,ZD,ADD,127,1,ZD,ADD,
128,1,ZD,ADD,129,1,ZD,ADD,130,1,ZD,ADD,131,1,ZD,ADD,
132,1,ZD,ADD,133,1,ZD,ADD,134,1,ZD,ADD,135,1,ZD,ADD,
136,1,ZD,ADD,137,1,ZD,ADD,138,1,ZD,ADD,139,1,ZD,ADD,
140,1,ZD,ADD,141,1,ZD,ADD,142,1,ZD,ADD,143,1,ZD,ADD,
144,1,ZD,ADD,145,1,ZD,ADD,146,1,ZD,ADD,147,1,ZD,ADD,
148,1,ZD,ADD,149,1,ZD,ADD,150,1,ZD),EDIT=(TT)))
SORT FIELDS=COPY
OUTREC FIELDS=(1:1,40,41:101,2,ZD,TO=BI,LENGTH=2,
43:41,20,63:103,2,ZD,TO=BI,LENGTH=2,
65:61,30,95:91,10)
/*
Output:
Code:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----
--------------------------------------------------------------------------------------------------------
100 RAHUL KUMAR ..IT ANALYST ..USA 0000123456
FFF4444444DCCED4DEDCD444444444444444444400CE4CDCDEEE444444444400EEC444444444444444444444444444FFFFFFFFFF
10000000009184302441900000000000000000000A93015138230000000000034210000000000000000000000000000000123456
--------------------------------------------------------------------------------------------------------
15489 JOHN SMIT ..PROJECT MANAGER ..USA 0000123456
FFFFF44444DDCD4EDCE44444444444444444444400DDDDCCE4DCDCCCD4444400EEC444444444444444444444444444FFFFFFFFFF
15489000001685024930000000000000000000000F79615330415175900000034210000000000000000000000000000000123456
--------------------------------------------------------------------------------------------------------
366537 BIMAL ROY SEN ..SOFTWARE DEVELOPER ..USA 0000123456
FFFFFF4444CCDCD4DDE4ECD4444444444444444401EDCEECDC4CCECDDDCD4400EEC444444444444444444444444444FFFFFFFFFF
36653700002941309680255000000000000000000226636195045553675900034210000000000000000000000000000000123456
Back to top
Bill Woodger Moderator Emeritus Joined: 09 Mar 2011Posts: 7309 Location: Inside the Matrix
So we continue, even though Ashutosh is already happy with half the job done.
Less code, more steps, or, more accurately, more step, or another step. Less code, another step.
There are two fields whose length we are interested in calculating. Put those fields last on records going to two different files and make them variable with trailing blanks removed (FTOV with VLTRIM).
In the second step, a JOINKEYS, process both files, calculating the length of the two fields in question by knowing the length that the maximum record would be. Stick the records together with the JOINKEYS using a sequence number. Make the output fixed (VTOF).
Code:
//S1 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//WDSGN DD DSN=&&WDSGN,UNIT=SYSDA,SPACE=(CYL,1),DISP=(,PASS)
//WADDR DD DSN=&&WADDR,UNIT=SYSDA,SPACE=(CYL,1),DISP=(,PASS)
//SORTIN DD *
AA|BB|C234567890123456789C|D2345678901234567890123456789D|EEEEEEEEEX
F|G|H|I|J
K|L|MMMMMMMZ|NNNNNNNNNNNNNZ|O
//SYSIN DD *
OPTION COPY
OUTREC IFTHEN=(WHEN=INIT,
PARSE=(%00=(ENDBEFR=C'|',FIXLEN=10),
%01=(ENDBEFR=C'|',FIXLEN=30),
%02=(ENDBEFR=C'|',FIXLEN=20),
%03=(ENDBEFR=C'|',FIXLEN=30),
%04=(ENDBEFR=C'|',FIXLEN=10))),
IFTHEN=(WHEN=INIT,
BUILD=(%00,%01,%04,%02,%03))
OUTFIL FNAMES=WDSGN,FTOV,VLTRIM=C' ',
OVERLAY(71:30X)
OUTFIL FNAMES=WADDR,FTOV,VLTRIM=C' ',
BUILD=(71,30)
//HUMPHREY EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTJNF1 DD DSN=&&WDSGN,DISP=(OLD,PASS)
//SORTJNF2 DD DSN=&&WADDR,DISP=(OLD,PASS)
//SORTOUT DD SYSOUT=*
//SYSIN DD *
JOINKEYS FILE=F1,FIELDS=(7,8,A),SORTED,NOSEQCK
JOINKEYS FILE=F2,FIELDS=(7,8,A),SORTED,NOSEQCK
REFORMAT FIELDS=(F1:1,4,5,2,F2:5,2,F1:15,70,F2:15,30)
OPTION COPY
INREC BUILD=(9,40,-54,ADD,5,2,BI,TO=BI,LENGTH=2,
59,20,-4,ADD,7,2,BI,TO=BI,LENGTH=2,
79,30,49,10)
OUTFIL VTOF
//JNF1CNTL DD *
INREC IFTHEN=(WHEN=INIT,
PARSE=(%00=(ABSPOS=55,FIXLEN=20))),
IFTHEN=(WHEN=INIT,
BUILD=(1,4,1,2,SEQNUM,8,ZD,5,50,%00))
//JNF2CNTL DD *
INREC IFTHEN=(WHEN=INIT,
PARSE=(%00=(ABSPOS=5,FIXLEN=30))),
IFTHEN=(WHEN=INIT,
BUILD=(1,4,1,2,SEQNUM,8,ZD,%00))
Back to top
Please enable JavaScript!