View previous topic :: View next topic
|
Author |
Message |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
Hi All,
The requirement is below.
Input:(LRECL=80,RECFM=FB)
Code: |
01 HEADER
02 DETAIL
02 DETAIL
02 DETAIL
99 0000003 |
Expected Output:(LRECL=80,RECFM=FB)
Code: |
RECORDS RECEIVED
MM/DD/YY COUNT RECEIVED 0000003
|
In words, the requirement is check if there are any 'D' records in the input. If any, then produce the output like shown above and put the count from the trailer record.
If there are no 'D' records, set return code to 4
Can this be done using syncsort?
I built this card, but it doesn't return 4 when there are no '02'. Also, I know why it doesn't, it is because of the INCLUDE. Here H1,H2 are the symbols I used to put the text
Code: |
OPTION COPY,NULLOUT=RC4
INCLUDE COND=(1,2,ZD,EQ,02,OR,1,2,ZD,EQ,99)
OUTFIL IFTHEN=(WHEN=(1,2,ZD,EQ,99),
BUILD=(H1,80:X,/,&DATE,X,H2,X,4,7,80:X)),
OMIT=(1,2,ZD,EQ,02)
|
Please let me know if there are any ideas. |
|
Back to top |
|
 |
RahulG31
Active User
Joined: 20 Dec 2014 Posts: 446 Location: USA
|
|
|
|
Why are you even looking for a '02' record? If there is No '02' record then the trailer count must be 0000000 (Or there may not be a trailer at all). If trailer count is greater than 0 (Or if there is a trailer) then that means there must be a detail record. So, you can only look at trailer count to tell whether you have a detail record (and their count). Isn't it?
. |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
Thanks for the reply Rahul.
That is the ideal case, but we don't want to trust the input since it was manually prepared. So, we want to check what was 'actually' sent in the input. |
|
Back to top |
|
 |
RahulG31
Active User
Joined: 20 Dec 2014 Posts: 446 Location: USA
|
|
|
|
This should give you the desired result but you'll get the output with count 0 if no '02' found. There may be better solutions available
Code: |
//STEPSORT EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SORTIN DD *
01 HEADER
03 DETAIL
03 DETAIL
03 DETAIL
99 0000003
//OUT1 DD SYSOUT=*
//OUT2 DD SYSOUT=*
//SYSIN DD *
OPTION COPY
INCLUDE COND=(1,2,ZD,EQ,02)
OUTFIL FNAMES=OUT1,
TRAILER1=(C'TEXT1',/,C'TEXT2',COUNT),NODETAIL
OUTFIL FNAMES=OUT2,
TRAILER1=(C'TEXT1',/,C'TEXT2',COUNT),NULLOFL=RC4
/* |
|
|
Back to top |
|
 |
Rohit Umarjikar
Global Moderator

Joined: 21 Sep 2010 Posts: 3087 Location: NYC,USA
|
|
|
|
Quote: |
That is the ideal case, but we don't want to trust the input since it was manually prepared. So, we want to check what was 'actually' sent in the input. |
RahulG31 is right.
You can not pretend the mistakes and code for the whole world.
This link will help you to do what you want in a prior step.
ibmmainframes.com/about57751.html
or think how to twist more if you would like to merge in one step. |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
Quote: |
You can not pretend the mistakes and code for the whole world. |
Agreed, but the fundamentals needed for the functionality to work in the first place need to be verified before such functionality is triggered. So, for any file with header, details and trailer, we tend to verify if the detail records exist or count is as same as the trailer. These validations run day in and day out in all the shops I worked.
So, that is why I was posting this requirement.
Anyways thank you all for your help. |
|
Back to top |
|
 |
RahulG31
Active User
Joined: 20 Dec 2014 Posts: 446 Location: USA
|
|
|
|
Quote: |
These validations run day in and day out in all the shops I worked. |
And still you don't know how to do it?
Btw, a slight modification in above sort card, making Out2 as Dummy and No need for Trailer1 for Out2 (tested with DFSORT as I don't have SyncSort):
Code: |
//OUT2 DD DUMMY
//SYSIN DD *
OPTION COPY
INCLUDE COND=(1,2,ZD,EQ,02)
OUTFIL FNAMES=OUT1,
TRAILER1=(C'TEXT1',/,C'TEXT2',COUNT),NODETAIL
OUTFIL FNAMES=OUT2,INCLUDE=(1,2,ZD,EQ,02),NULLOFL=RC4
/* |
. |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
Quote: |
And still you don't know how to do it? |
Wow, this is inspiring.
I do know how to do it, but this one is different, I only asked for a suggestion. If you look at my piece of code, I did achieve what I could for the first part. I was not asking how to count the records from the input file(like your piece of code does), I said to pull the count from the trailer.
Thanks for your effort spent on my ask. I will look for other options.
Thanks again. |
|
Back to top |
|
 |
RahulG31
Active User
Joined: 20 Dec 2014 Posts: 446 Location: USA
|
|
|
|
Quote: |
I said to pull the count from the trailer. |
This is even simpler if you make a slight modification in my sort card. I don't know what other options are you looking for.
. |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
Code: |
INCLUDE COND=(1,2,ZD,EQ,02) |
1. This one includes only detail records, how would you bring the count if you don't even include the trailer?
Code: |
OUTFIL FNAMES=OUT2,INCLUDE=(1,2,ZD,EQ,02),NULLOFL=RC4 |
2. This one copies all the details into other output file. I don't want to create a copy of my input file again.
3. why am I creating 2 output files when there is a need for only one output file? |
|
Back to top |
|
 |
RahulG31
Active User
Joined: 20 Dec 2014 Posts: 446 Location: USA
|
|
|
|
So, ultimately you want me to do the job for you which I nearly did in the previous post but you are Not even able to think on how to make a simple change.
Code: |
//OUT2 DD DUMMY
//SYSIN DD *
OPTION COPY
INCLUDE COND=(1,2,ZD,EQ,02,OR,1,2,ZD,EQ,99)
OUTFIL FNAMES=OUT1,INCLUDE=(1,2,ZD,EQ,99),
BUILD=(C'TEXT1',/,C'TEXT2',X,4,7)
OUTFIL FNAMES=OUT2,INCLUDE=(1,2,ZD,EQ,02),NULLOFL=RC4
/* |
Since you don't even know how to read a JCL/Sort card, I would like to tell that you are Not creating 2 files, and that is what I said in my previous post to have OUT2 as Dummy. Out2 is only used to give you RC4 when needed.
Mods, Please Lock the topic. Enough of the crap already.
. |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
I didn't say you do the whole job for me, I was missing something in my original card.
If you just see my control card, I have the same INCLUDE condition like yours now and we both have the same build statements too, except I used symbols since they are long in size.
so, like I said I did the majority part. I even coded NULLOUT I was only missing to join both in one step.
The only piece missing was the last one OUT2. I noticed you put DUMMY, but the thing is it will try to copy ALL the records even though it is Dummy. Dummy essentially means a temp file for JES, there would I/O involved. Dummy doesn't mean that it doesn't create any file. you can just run the card and see the sysout, so I was trying to reduce the I/O.
So, I am really thankful for your efforts. I am not sure why you are getting upset at the lines, those are only questions. |
|
Back to top |
|
 |
Rohit Umarjikar
Global Moderator

Joined: 21 Sep 2010 Posts: 3087 Location: NYC,USA
|
|
|
|
Did you even look at the link shared to you? What is missing there that you don't understand? |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
I would look again Rohit, let me read thru. Thank you |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
I've leveraged the missing piece Rahul provided with OUT2 and hooked it into my card and added ACCEPT parm to just copy one record. So, I think the piece works now. It looks like this now.
Code: |
OPTION COPY
INCLUDE COND=(1,2,ZD,EQ,02,OR,1,2,ZD,EQ,99)
OUTFIL BUILD=(H1,80:X,/,&DATE,X,H2,X,48,7,80:X),FNAMES=OUT1,
OMIT=(1,2,ZD,EQ,02)
OUTFIL FNAMES=OUT2,NULLOFL=RC4,SAVE,ACCEPT=1
|
Thank you Rohit and Rahul. |
|
Back to top |
|
 |
RahulG31
Active User
Joined: 20 Dec 2014 Posts: 446 Location: USA
|
|
|
|
V S Amarendra Reddy,
Quote: |
but the thing is it will try to copy ALL the records |
If you don't want to copy all the records then just use STARTREC and ENDREC (=1) in OUTFIL and that will give you only a single record in OUT2. That way you are Not copying all the records. BUT you say that you'll look for other options.
I am trying to be more polite.
Code: |
OUTFIL FNAMES=OUT2,INCLUDE=(1,2,ZD,EQ,02),STARTREC=1,ENDREC=1,
NULLOFL=RC4 |
. |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
Rahul,
Yeah, I think we did pretty much same thing with your idea with just change in ACCEPT or START REC/END REC. I just posted one min before that's all .
Thanks man. Have a nice evening. |
|
Back to top |
|
 |
Arun Raj
Moderator
Joined: 17 Oct 2006 Posts: 2482 Location: @my desk
|
|
|
|
Amar,
If you are just trying to validate the trailer count AND to check if you have '02' records in it, you could do something like this and then forget worrying about the two outputs.
I don't have Syncsort, but this should get you going.
You might want to modify the BUILD below as in your original card to format the SORTOUT, the way you wanted to. Good luck.
Code: |
//STEP01 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD *
01 HEADER
02 DETAIL
02 DETAIL
02 DETAIL
99 0000003
//SORTOUT DD SYSOUT=*
//SYSIN DD *
INCLUDE COND=(1,2,SS,EQ,C'02,99')
SORT FIELDS=COPY
OUTREC OVERLAY=(81:SEQNUM,7,ZD,START=0)
OUTFIL INCLUDE=(1,2,CH,EQ,C'99',AND,4,7,ZD,EQ,81,7,ZD),NULLOFL=RC4,
BUILD=(1,80) |
SORTOUT had:
You get an RC=4 AND an empty SORTOUT if there are no '02' records OR if the trailer count is incorrect. |
|
Back to top |
|
 |
V S Amarendra Reddy
Active User

Joined: 13 Sep 2006 Posts: 221 Location: USA
|
|
|
|
Beautiful, Arun . Yeah that is another way look at the requirement. Always, the count must be the same as the Trailer and that condition check can be leveraged for returning the code 4. I think I just need to hook my Build card and use it.
Thanks a ton  |
|
Back to top |
|
 |
Arun Raj
Moderator
Joined: 17 Oct 2006 Posts: 2482 Location: @my desk
|
|
|
|
You're welcome. Glad it helped.  |
|
Back to top |
|
 |
|
|