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

Help on SORT Logic.


IBM Mainframe Forums -> DFSORT/ICETOOL
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
Frank Yaeger

DFSORT Developer


Joined: 15 Feb 2005
Posts: 7129
Location: San Jose, CA

PostPosted: Thu Mar 22, 2012 3:37 am
Reply with quote

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
View user's profile Send private message
Bill Woodger

Moderator Emeritus


Joined: 09 Mar 2011
Posts: 7309
Location: Inside the Matrix

PostPosted: Thu Mar 22, 2012 5:04 am
Reply with quote

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
View user's profile Send private message
apandey

New User


Joined: 31 Aug 2009
Posts: 73
Location: Mumbai

PostPosted: Thu Mar 22, 2012 11:57 am
Reply with quote

Thank a lot frank. It worked. icon_smile.gif
Back to top
View user's profile Send private message
Bill Woodger

Moderator Emeritus


Joined: 09 Mar 2011
Posts: 7309
Location: Inside the Matrix

PostPosted: Tue Mar 27, 2012 12:53 am
Reply with quote

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
View user's profile Send private message
saiprasadh

Active User


Joined: 20 Sep 2006
Posts: 154
Location: US

PostPosted: Tue Mar 27, 2012 9:39 am
Reply with quote

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
View user's profile Send private message
Bill Woodger

Moderator Emeritus


Joined: 09 Mar 2011
Posts: 7309
Location: Inside the Matrix

PostPosted: Tue Mar 27, 2012 2:37 pm
Reply with quote

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
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 Goto page 1, 2  Next

 


Similar Topics
Topic Forum Replies
No new posts How to split large record length file... DFSORT/ICETOOL 8
No new posts JCL sort card - get first day and las... JCL & VSAM 9
No new posts Sort First/last record of a subset th... DFSORT/ICETOOL 7
No new posts how to calculate SUM value for VB fil... DFSORT/ICETOOL 1
No new posts how to calculate SUM for VB file usin... JCL & VSAM 1
Search our Forums:

Back to Top