Portal | Manuals | References | Downloads | Info | Programs | JCLs | Master the Mainframes
IBM Mainframe Computers Forums Index
 
Register
 
IBM Mainframe Computers Forums Index Mainframe: Search IBM Mainframe Forum: FAQ Memberlist Usergroups Profile Log in to check your private messages Log in
 

 

Excluding group of records

 
Post new topic   Reply to topic    IBMMAINFRAMES.com Support Forums -> DFSORT/ICETOOL
View previous topic :: :: View next topic  
Author Message
zh_lad

New User


Joined: 06 Jun 2009
Posts: 80
Location: UK

PostPosted: Wed Aug 18, 2010 5:02 pm    Post subject: Excluding group of records
Reply with quote

Hi,

FB file
LRECL = 500
Account number, P=1, L=36

It has got group of records per account (Header followed by detail records, however, no trailer)
Record type P=43, L=3 (Header has value CU, Detail records have different values: TX, MX, DR, EX, IA etc). Header is always the first record in a set.

I want to get rid to those set of records where P=60, L=3 has following values:340, 341, 350, 351, 360, or 361 on Header record (CU type)

Example
Input:

700940520050000000996338342500031014 CU100000000001500399001 0
700940520050000000996338342500031014 DR110000000002UKCAPITAL HOUSE
700940520050000000996338342500031014 EX200000000000001GBP 030000000
700940520050000000996338342500031014 TX300000000008001GBPPU04000000
700940520050000000996338342500031014 PF900000000001A094503201008132

700940520050000001006338342500031022 CU100000000001500350001 0
700940520050000001006338342500031022 CL11000000000104008482701CHILL
700940520050000001006338342500031022 DR110000000002UKCAPITAL HOUSE
700940520050000001006338342500031022 LC8000000000000001CASH LIMIT 2

700940520050000001016338342500031212 CU100000000001500398001 0
700940520050000001016338342500031212 CL11000000000104008484603BASIM
700940520050000001016338342500031212 DR110000000002UKCAPITAL HOUSE
700940520050000001016338342500031212 MX800000000010001GBP0000001030
700940520050000001016338342500031212 PF900000000001A094505201008132


Output:
700940520050000000996338342500031014 CU100000000001500399001 0
700940520050000000996338342500031014 DR110000000002UKCAPITAL HOUSE
700940520050000000996338342500031014 EX200000000000001GBP 030000000
700940520050000000996338342500031014 TX300000000008001GBPPU04000000
700940520050000000996338342500031014 PF900000000001A094503201008132

700940520050000001016338342500031212 CU100000000001500398001 0
700940520050000001016338342500031212 CL11000000000104008484603BASIM
700940520050000001016338342500031212 DR110000000002UKCAPITAL HOUSE
700940520050000001016338342500031212 MX800000000010001GBP0000001030
700940520050000001016338342500031212 PF900000000001A094505201008132

Reject records:
700940520050000001006338342500031022 CU100000000001500350001 0
700940520050000001006338342500031022 CL11000000000104008482701CHILL
700940520050000001006338342500031022 DR110000000002UKCAPITAL HOUSE
700940520050000001006338342500031022 LC8000000000000001CASH LIMIT 2

Second set of records have go to Rejected files as P=60, L=3 has got value 350.

Thanks,
Zh_Lad
Back to top
View user's profile Send private message

sqlcode1

Active Member


Joined: 08 Apr 2010
Posts: 578
Location: USA

PostPosted: Wed Aug 18, 2010 6:57 pm    Post subject:
Reply with quote

zh_lad,
Your input data doesn't match your description of input position.

Quote:
It has got group of records per account (Header followed by detail records, however, no trailer). Record type P=43, L=3 (Header has value CU, Detail records have different values: TX, MX, DR, EX, IA etc).
In your shown input record, CU is at position 38 and is of length 2.


Quote:
I want to get rid to those set of records where P=60, L=3 has following values:340, 341, 350, 351, 360, or 361 on Header record (CU type)

340,341,350,351,360,361 in your shown input record is at position 55.

I am assuming your input data is correct and below job will give you what you asked for.

Code:
//STEP01 EXEC PGM=SORT                                                 
//SYSOUT   DD SYSOUT=*                                                 
//SORTIN   DD DISP=SHR,DSN=YOUR.FB500.INPUT.FILE                                               
//REJECT   DD SYSOUT=*                                                 
//SELECT   DD SYSOUT=*                                                 
//SYSIN    DD *                                                         
  INREC IFTHEN=(WHEN=GROUP,BEGIN=(38,2,CH,EQ,C'CU'),PUSH=(501:55,3))   
  SORT FIELDS=COPY                                                     
  OUTFIL FNAMES=REJECT,INCLUDE=(501,3,CH,EQ,C'340',OR,                 
                                501,3,CH,EQ,C'341',OR,                 
                                501,3,CH,EQ,C'350',OR,                 
                                501,3,CH,EQ,C'351',OR,                 
                                501,3,CH,EQ,C'360',OR,                 
                                501,3,CH,EQ,C'361'),                   
                       BUILD=(1,500)                                   
  OUTFIL FNAMES=SELECT,BUILD=(1,500),SAVE                               
/*                                                                     


If your description is correct then use below job.


Code:
//STEP01 EXEC PGM=SORT                                                 
//SYSOUT   DD SYSOUT=*                                                 
//SORTIN   DD DISP=SHR,DSN=YOUR.FB500.INPUT.FILE
//REJECT   DD SYSOUT=*                                                 
//SELECT   DD SYSOUT=*                                                 
//SYSIN    DD *                                                         
  INREC IFTHEN=(WHEN=GROUP,BEGIN=(43,3,CH,EQ,C'CU '),PUSH=(501:60,3))   
  SORT FIELDS=COPY                                                     
  OUTFIL FNAMES=REJECT,INCLUDE=(501,3,CH,EQ,C'340',OR,                 
                                501,3,CH,EQ,C'341',OR,                 
                                501,3,CH,EQ,C'350',OR,                 
                                501,3,CH,EQ,C'351',OR,                 
                                501,3,CH,EQ,C'360',OR,                 
                                501,3,CH,EQ,C'361'),                   
                       BUILD=(1,500)                                           
  OUTFIL FNAMES=SELECT,BUILD=(1,500),SAVE                                             
/*                                                                     


Thanks,
Back to top
View user's profile Send private message
zh_lad

New User


Joined: 06 Jun 2009
Posts: 80
Location: UK

PostPosted: Wed Aug 18, 2010 6:57 pm    Post subject:
Reply with quote

Minor correction:

Record type P=43, L=2 (Header has value CU, Detail records have different values: TX, MX, DR, EX, IA etc). Header is always the first record in a set.

Thanks.
Back to top
View user's profile Send private message
sqlcode1

Active Member


Joined: 08 Apr 2010
Posts: 578
Location: USA

PostPosted: Wed Aug 18, 2010 6:59 pm    Post subject:
Reply with quote

zh_lad,
Please change first Inrec condition in the 2nd solution as below

Code:
INREC IFTHEN=(WHEN=GROUP,BEGIN=(43,2,CH,EQ,C'CU'),PUSH=(501:60,3))   


Thanks,
Back to top
View user's profile Send private message
zh_lad

New User


Joined: 06 Jun 2009
Posts: 80
Location: UK

PostPosted: Wed Aug 18, 2010 8:49 pm    Post subject:
Reply with quote

Thanks sqlcode1. I have customized your code to cater my requirement. It worked well.

Thanks alot for your help.
Back to top
View user's profile Send private message
zh_lad

New User


Joined: 06 Jun 2009
Posts: 80
Location: UK

PostPosted: Wed Aug 18, 2010 10:07 pm    Post subject:
Reply with quote

It was pleasant surprise when I realized records are group solely based on header record.
I realized no where account number is mentioned to identify groups of records.
I will look for these keyword: begin, group and push on SORT manual to familiarize myself to use them in future requirements.

Many thanks.
Back to top
View user's profile Send private message
Skolusu

Senior Member


Joined: 07 Dec 2007
Posts: 2205
Location: San Jose

PostPosted: Wed Aug 18, 2010 10:18 pm    Post subject:
Reply with quote

ZH_LAD,

Here is a simplified version of the job.

Code:

//STEP0100 EXEC PGM=SORT       
//SYSOUT   DD SYSOUT=*         
//SORTIN   DD DSN=your input fb 500 byte file,DISP=SHR
//SORTOUT  DD SYSOUT=*                                               
//REJECT   DD SYSOUT=*                                               
//SYSIN    DD *                                                     
  SORT FIELDS=COPY                                                   
  INREC IFTHEN=(WHEN=GROUP,BEGIN=(43,2,CH,EQ,C'CU'),PUSH=(501:60,3))
  OUTFIL BUILD=(1,500),OMIT=(501,3,SS,EQ,C'340,341,350,351,360,361')
  OUTFIL FNAMES=REJECT,SAVE,BUILD=(1,500)                           
//*


If you're not familiar with DFSORT and DFSORT's ICETOOL, I'd suggest reading through "z/OS DFSORT: Getting Started". It's an excellent tutorial, with lots of examples, that will show you how to use DFSORT, DFSORT's ICETOOL and DFSORT Symbols. You can access it online, along with all of the other DFSORT books, from:

www.ibm.com/servers/storage/support/software/sort/mvs/srtmpub.html
Back to top
View user's profile Send private message
zh_lad

New User


Joined: 06 Jun 2009
Posts: 80
Location: UK

PostPosted: Thu Sep 02, 2010 12:55 pm    Post subject:
Reply with quote

Thanks for your help so far. I am continuing this thread as I would like to omit different group of records.
Above, PUSH is applied on Header record (CU type). How do I apply Push on a detail record e.g. Record type is PF.
I would like to omit group of records based on one of the detail record.

Many thanks.
Back to top
View user's profile Send private message
sqlcode1

Active Member


Joined: 08 Apr 2010
Posts: 578
Location: USA

PostPosted: Thu Sep 02, 2010 5:56 pm    Post subject:
Reply with quote

What about other conditions from the original requirement? Please show sample input and output again.

Thanks,
Back to top
View user's profile Send private message
zh_lad

New User


Joined: 06 Jun 2009
Posts: 80
Location: UK

PostPosted: Fri Sep 03, 2010 12:14 am    Post subject:
Reply with quote

Thanks sqlcode1 for replying.


LRECL = 500
Account number, P=1, L=36

It has got group of records per account. Header followed by detail records, however, no trailer. Header is always the first record.

Header record P=43, L=2, Value = CU
Details records have got values TX, MX, DR, EX, IA, PF etc on P=43, L=2
Header is always the first record in a set.


I want to get rid to such groups where PF record has got value A0 (length 2) on column 57.


Input:
700940520050000000996338342500031014 CU100000000001500399001 0
700940520050000000996338342500031014 DR110000000002UKCAPITAL HOUSE
700940520050000000996338342500031014 EX200000000000001GBP 030000000
700940520050000000996338342500031014 TX300000000008001GBPPU04000000
700940520050000000996338342500031014 PF900000000001A194503201008132

700940520050000001006338342500031022 CU100000000001500350001 0
700940520050000001006338342500031022 CL11000000000104008482701CHILL
700940520050000001006338342500031022 DR110000000002UKCAPITAL HOUSE
700940520050000001006338342500031022 PF900000000001A094505201008132

700940520050000001016338342500031212 CU100000000001500398001 0
700940520050000001016338342500031212 CL11000000000104008484603BASIM
700940520050000001016338342500031212 DR110000000002UKCAPITAL HOUSE
700940520050000001016338342500031212 MX800000000010001GBP0000001030
700940520050000001016338342500031212 PF900000000001A194505201008132


Output:
700940520050000000996338342500031014 CU100000000001500399001 0
700940520050000000996338342500031014 DR110000000002UKCAPITAL HOUSE
700940520050000000996338342500031014 EX200000000000001GBP 030000000
700940520050000000996338342500031014 TX300000000008001GBPPU04000000
700940520050000000996338342500031014 PF900000000001A194503201008132

700940520050000001016338342500031212 CU100000000001500398001 0
700940520050000001016338342500031212 CL11000000000104008484603BASIM
700940520050000001016338342500031212 DR110000000002UKCAPITAL HOUSE
700940520050000001016338342500031212 MX800000000010001GBP0000001030
700940520050000001016338342500031212 PF900000000001A194505201008132

Reject records:
700940520050000001006338342500031022 CU100000000001500350001 0
700940520050000001006338342500031022 CL11000000000104008482701CHILL
700940520050000001006338342500031022 DR110000000002UKCAPITAL HOUSE
700940520050000001006338342500031022 PF900000000001A094505201008132


Thanks.
Back to top
View user's profile Send private message
sqlcode1

Active Member


Joined: 08 Apr 2010
Posts: 578
Location: USA

PostPosted: Sat Sep 04, 2010 1:33 am    Post subject:
Reply with quote

zh_lad,

Is your Account Number (bytes 1 through 36) unique for each set of records? If it is unique and provided that you have latest DFSort PTF,below mentioned job should give you desired result.

Let me know if works. I am still trying to see if a solution without JOINKEY is possible.

Code:
//S1 EXEC PGM=SORT                                       
//SYSOUT DD SYSOUT=*                                     
//SORTJNF1 DD DISP=SHR,DSN=YOUR FB500 FILE               
//SORTJNF2 DD DISP=SHR,DSN=YOUR FB500 FILE               
//SORTOUT DD SYSOUT=*                                     
//SYSIN DD *                                             
  JOINKEYS FILE=F1,FIELDS=(01,36,A)                       
  JOINKEYS FILE=F2,FIELDS=(01,36,A)                       
  JOIN UNPAIRED,F2,ONLY                                   
  REFORMAT FIELDS=(F2:1,500)                             
  OPTION COPY                                             
/*                                                       
//JNF1CNTL DD *                                           
 INCLUDE COND=(38,2,CH,EQ,C'PF',AND,52,2,CH,EQ,C'A0')     
/*                                                       


OUTPUT
Code:
700940520050000000996338342500031014 CU100000000001500399001 0     
700940520050000000996338342500031014 DR110000000002UKCAPITAL HOUSE
700940520050000000996338342500031014 EX200000000000001GBP 030000000
700940520050000000996338342500031014 TX300000000008001GBPPU04000000
700940520050000000996338342500031014 PF900000000001A194503201008132
700940520050000001016338342500031212 CU100000000001500398001 0     
700940520050000001016338342500031212 CL11000000000104008484603BASIM
700940520050000001016338342500031212 DR110000000002UKCAPITAL HOUSE
700940520050000001016338342500031212 MX800000000010001GBP0000001030
700940520050000001016338342500031212 PF900000000001A194505201008132


Thanks,
Back to top
View user's profile Send private message
zh_lad

New User


Joined: 06 Jun 2009
Posts: 80
Location: UK

PostPosted: Sat Sep 04, 2010 2:04 am    Post subject:
Reply with quote

Hi sqlcode1,

Thanks for replying. Yes! account number is unique for each set of record.

I will run your JCL on Monday as its weekend now. If you get a different solution then please do let me know.

many thanks.
Back to top
View user's profile Send private message
View previous topic :: :: View next topic  
Post new topic   Reply to topic    IBMMAINFRAMES.com Support Forums -> DFSORT/ICETOOL All times are GMT + 6 Hours
Page 1 of 1

 

Search our Forum:

Similar Topics
Topic Author Forum Replies Posted
No new posts Limit duplicate records in the SORT pshongal SYNCSORT 6 Mon Nov 21, 2016 12:54 pm
No new posts How to split the records using the am... vnktrrd DFSORT/ICETOOL 24 Fri Oct 28, 2016 7:33 pm
No new posts Sort records based on numeric field. Alks SYNCSORT 2 Wed Oct 19, 2016 10:14 pm
No new posts abend sort based on count records in ... anatol DFSORT/ICETOOL 5 Mon Oct 17, 2016 10:10 pm
No new posts how to split records based on specifi... Venkata Ramayya DFSORT/ICETOOL 6 Wed Sep 28, 2016 3:20 am


Facebook
Back to Top
 
Mainframe Wiki | Forum Rules | Bookmarks | Subscriptions | FAQ | Tutorials | Contact Us