IBM Mainframe Forum Index
 
Log In
 
IBM Mainframe Forum Index Mainframe: Search IBM Mainframe Forum: FAQ Register
 

Selecting extreme range values using DFSORT


IBM Mainframe Forums -> DFSORT/ICETOOL
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
Gabriel Araujo Alves

New User


Joined: 20 Jul 2010
Posts: 38
Location: Brazil

PostPosted: Sat Aug 14, 2010 4:23 am
Reply with quote

I have this input,

Code:

000000009
000000010
000000011
000000015
000000016
000000017
000000019
000000020



and i want this output

Code:

000000009 -> 000000011
000000015 -> 000000017
000000019 -> 000000020


the first and the last values from a range.
if someone can help.
Back to top
View user's profile Send private message
sqlcode1

Active Member


Joined: 08 Apr 2010
Posts: 577
Location: USA

PostPosted: Sat Aug 14, 2010 5:59 am
Reply with quote

Gabriel Araujo Alves,
How do you define range? Any set of consecutive numbers?

RECFM and LRECL of the input file?

Thanks,
Back to top
View user's profile Send private message
Gabriel Araujo Alves

New User


Joined: 20 Jul 2010
Posts: 38
Location: Brazil

PostPosted: Sat Aug 14, 2010 8:20 pm
Reply with quote

recfm=fb,lrecl=080

the range is up a break in the numerical sequence.
Back to top
View user's profile Send private message
sqlcode1

Active Member


Joined: 08 Apr 2010
Posts: 577
Location: USA

PostPosted: Sun Aug 15, 2010 1:53 am
Reply with quote

Gabriel Araujo Alves,

Thanks for asking this question, just learnt something new about OVERLAY.

Please find below jcl which creates 21 byte output file. If you need output file of different length adjust OUTFIL accordingly.

Out of curiosity, is this requirement an entire picture or just a pixel of it?


Code:
//STEP01   EXEC PGM=SORT                                       
//SYSOUT   DD SYSOUT=*                                         
//SORTIN   DD *                                                 
000000009                                                       
000000010                                                       
000000011                                                       
000000015                                                       
000000016                                                       
000000017                                                       
000000019                                                       
000000020                                                       
/*                                                             
//SORTOUT  DD SYSOUT=*                                         
//SYSIN    DD *                                                 
 INREC IFTHEN=(WHEN=INIT,OVERLAY=(21:SEQNUM,9,ZD,               
                         31:1,9,ZD,SUB,21,9,ZD,TO=ZD,LENGTH=9, 
                         41:SEQNUM,9,ZD,RESTART=(31,9))),       
       IFTHEN=(WHEN=GROUP,BEGIN=(41,9,ZD,EQ,1),PUSH=(51:1,9))   
 SORT FIELDS=COPY                                               
 OUTFIL BUILD=(1,21),                                           
 REMOVECC,NODETAIL,                                             
                 SECTIONS=(31,9,                               
                           TRAILER3=(51,9,C'-->',1,9))         
//*                                                             


OUTPUT

Code:
000000009-->000000011
000000015-->000000017
000000019-->000000020

Thanks,
Back to top
View user's profile Send private message
Gabriel Araujo Alves

New User


Joined: 20 Jul 2010
Posts: 38
Location: Brazil

PostPosted: Sun Aug 15, 2010 8:44 pm
Reply with quote

thank`s a lot sqlcode1,
i only can test it in monday...

I did not know you can refer to some fields that you just created.

i only did this in 3 steps... an elegant solution, thanks man.



ah, its just a pixel of it, regards...
Back to top
View user's profile Send private message
Gabriel Araujo Alves

New User


Joined: 20 Jul 2010
Posts: 38
Location: Brazil

PostPosted: Mon Aug 16, 2010 7:58 pm
Reply with quote

Hi,
sqlcode1, how SECTION works?

i did not understand. if you can explain to me, i1m thankful.
Back to top
View user's profile Send private message
sqlcode1

Active Member


Joined: 08 Apr 2010
Posts: 577
Location: USA

PostPosted: Mon Aug 16, 2010 8:19 pm
Reply with quote

Gabriel Araujo Alves,

Its not something I can explain here in the forum. Read about Sections here

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

Active Member


Joined: 08 Apr 2010
Posts: 577
Location: USA

PostPosted: Mon Aug 16, 2010 8:29 pm
Reply with quote

Gabriel Araujo Alves,
Looking back at your posts,I just realized I missed your post in which you mentioned your file is FB 80 lrecl.

Please find below corrected jcl which creates 80 byte output file.

Code:
//STEP01   EXEC PGM=SORT                                               
//SYSOUT   DD SYSOUT=*                                                 
//SORTIN   DD *                                                         
000000009                                                               
000000010                                                               
000000011                                                               
000000015                                                               
000000016                                                               
000000017                                                               
000000019                                                               
000000020                                                               
/*                                                                     
//SORTOUT  DD SYSOUT=*                                                 
//SYSIN    DD *                                                         
 INREC IFTHEN=(WHEN=INIT,OVERLAY=(81:SEQNUM,9,ZD,                       
                        091:1,9,ZD,SUB,81,9,ZD,TO=ZD,LENGTH=9,         
                        101:SEQNUM,9,ZD,RESTART=(91,9))),               
       IFTHEN=(WHEN=GROUP,BEGIN=(101,9,ZD,EQ,1),PUSH=(111:1,9))         
 SORT FIELDS=COPY                                                       
 OUTFIL BUILD=(1,80),                                                   
 REMOVECC,NODETAIL,                                                     
                 SECTIONS=(91,9,                                       
                           TRAILER3=(111,9,C'-->',1,9))                 
//*                                                                     


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

Senior Member


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

PostPosted: Mon Aug 16, 2010 9:06 pm
Reply with quote

Good Trick Sqlcode1. You can simplify it

Gabriel Araujo Alves,

The following DFSORT JCL will give you the desired results.

Code:

//STEP0100 EXEC PGM=SORT                                           
//SYSOUT   DD SYSOUT=*                                             
//SORTIN   DD *                                                     
000000009                                                           
000000010                                                           
000000011                                                           
000000015                                                           
000000016                                                           
000000017                                                           
000000019                                                           
000000020                                                           
//SORTOUT  DD SYSOUT=*                                             
//SYSIN    DD *                                                     
  SORT FIELDS=COPY                                                 
  INREC OVERLAY=(11:SEQNUM,9,ZD,21:1,9,ZD,SUB,11,9,ZD,M11,LENGTH=9)
                                                                   
  OUTFIL REMOVECC,NODETAIL,BUILD=(80X),                             
  SECTIONS=(21,9,                                                   
  TRAILER3=(MIN=(1,9,ZD,M11,LENGTH=9),'-->',                       
            MAX=(1,9,ZD,M11,LENGTH=9)))                             
//*


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:

Use [URL] BBCode for External Links
Back to top
View user's profile Send private message
manuwankenobi

New User


Joined: 02 Mar 2006
Posts: 32
Location: FRANCE

PostPosted: Mon Dec 06, 2010 11:47 am
Reply with quote

Hello experts,
Very nice trick.

I wonder what would be the trick for hexadecimal strings :
Code:

//SORTIN   DD *                                                     
00000200A                                                           
00000200B                                                           
000002009                                                           
000002008                                                           
000001009                                                           
00000100A                                                           
00000100B                                                           
00000100C                                     

And a result needed :
Code:

000001009-->00000100C
000002008-->00000200A


Any ideas ?
Thanks.
Back to top
View user's profile Send private message
Skolusu

Senior Member


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

PostPosted: Tue Dec 07, 2010 6:07 am
Reply with quote

manuwankenobi,

With z/OS DFSORT V1R10 PTF UK90025 or z/OS DFSORT V1R12 PTF UK90026 (Oct,2010), you can now use DFSORT's new TRAN=UNHEX function to get the numeric and then get the range.

The following DFSORT JCL will give you the desired results.

Code:

//STEP0100 EXEC PGM=SORT                                           
//SYSOUT   DD SYSOUT=*                                             
//SORTIN   DD *                                                   
00000200A                                                         
00000200B                                                         
000002009                                                         
000002008                                                         
000001009                                                         
00000100A                                                         
00000100B                                                         
00000100C                                                         
//SORTOUT  DD SYSOUT=*                                             
//SYSIN    DD *                                                   
  INREC IFTHEN=(WHEN=INIT,BUILD=(C'0',1,9)),                       
  IFTHEN=(WHEN=INIT,OVERLAY=(11:1,10,TRAN=UNHEX))                 
  SORT FIELDS=(11,5,BI,A),EQUALS                                         
                                                                   
  OUTREC IFTHEN=(WHEN=INIT,OVERLAY=(16:SEQNUM,5,BI)),             
  IFTHEN=(WHEN=INIT,OVERLAY=(21:11,5,BI,SUB,16,5,BI,M11,LENGTH=8)),
  IFTHEN=(WHEN=GROUP,KEYBEGIN=(21,8),PUSH=(29:2,9))               
                                                                   
  OUTFIL REMOVECC,NODETAIL,BUILD=(80X),                           
  SECTIONS=(21,8,TRAILER3=(29,9,'-->',2,9))                       
//*


The output from this job is
Code:

000001009-->00000100C
000002008-->00000200B

For complete details on the new functions for DFSORT and DFSORT's ICETOOL available with the Oct, 2010 PTF, see:

www.ibm.com/support/docview.wss?rs=114&uid=isg3T7000242
Back to top
View user's profile Send private message
manuwankenobi

New User


Joined: 02 Mar 2006
Posts: 32
Location: FRANCE

PostPosted: Sat Dec 11, 2010 11:40 am
Reply with quote

Thank you very much Skolusu,

I do not have the PTF (will have it in January...).
So with the help of this thread and the help of this other thread :
http://www.ibmmainframeforum.com/viewtopic.php?f=61&t=3068 ,
I tried something that seems to be working :
Code:

//STEP1 EXEC PGM=SORT                                             
//SYSOUT  DD SYSOUT=*                                             
//SORTIN  DD *                                                   
300A                                                             
200A                                                             
200B                                                             
2009                                                             
2008                                                             
1009                                                             
100A                                                             
100B                                                             
100C                                                             
//SORTOUT DD SYSOUT=*                                             
//SYSIN   DD *                                                   
  ALTSEQ CODE=(F000,F101,F202,F303,F404,F505,F606,F707,F808,F909,
               C10A,C20B,C30C,C40D,C50E,C60F)                     
  INREC IFTHEN=(WHEN=INIT,OVERLAY=(5:1,4,TRAN=ALTSEQ)),           
        IFTHEN=(WHEN=INIT,                                       
        OVERLAY=(9:(8,1,BI,ADD,                                   
                   (7,1,BI,MUL,+16),ADD,                         
                   (6,1,BI,MUL,+256),ADD,                           
                   (5,1,BI,MUL,+4096)),LENGTH=6,ZD))                 
  SORT FIELDS=(9,6,CH,A)                                             
                                                                     
  OUTREC IFTHEN=(WHEN=INIT,OVERLAY=(15:SEQNUM,6,ZD)),               
  IFTHEN=(WHEN=INIT,OVERLAY=(21:9,6,ZD,SUB,15,6,ZD,LENGTH=6,ZD)),   
  IFTHEN=(WHEN=INIT,OVERLAY=(27:SEQNUM,6,ZD,RESTART=(21,6))),       
  IFTHEN=(WHEN=GROUP,BEGIN=(27,6,ZD,EQ,1),PUSH=(33:1,4))             
                                                                     
  OUTFIL REMOVECC,NODETAIL,BUILD=(80X),                             
  SECTIONS=(21,6,TRAILER3=(33,4,'-->',1,4))                         
/*                                                                   

The result is :
Code:
1009-->100C 
2008-->200B 
300A-->300A 


icon_cool.gif
Back to top
View user's profile Send private message
View previous topic :: :: View next topic  
Post new topic   Reply to topic View Bookmarks
All times are GMT + 6 Hours
Forum Index -> DFSORT/ICETOOL

 


Similar Topics
Topic Forum Replies
No new posts INCLUDE OMIT COND for Multiple values... DFSORT/ICETOOL 5
No new posts To get the count of rows for every 1 ... DB2 3
No new posts Modifying Date Format Using DFSORT DFSORT/ICETOOL 9
No new posts Replace Multiple Field values to Othe... DFSORT/ICETOOL 12
No new posts Calling DFSORT from Cobol, using OUTF... DFSORT/ICETOOL 5
Search our Forums:

Back to Top