MVSFORUMS.com Forum Index MVSFORUMS.com
A Community of and for MVS Professionals
 
 FAQFAQ   SearchSearch   Quick Manuals   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Utility Required

 
Post new topic   Reply to topic   printer-friendly view    MVSFORUMS.com Forum Index -> Utilities
View previous topic :: View next topic  
Author Message
Rahull
Beginner


Joined: 29 Jan 2004
Posts: 62
Topics: 19

PostPosted: Fri Aug 05, 2005 1:45 pm    Post subject: Utility Required Reply with quote

Hi,

Problem : I have an input file with the following format

ACyyMMDDYYMMDD

Where AC - Area code
yyMMDD - Date 1 (Business day)
YYMMDD- Date 2 (Next Business day)

eg.
61050729050801

I need to compare the month part of both the dates and if there is a difference then I need to update Date 1 with the last date of the month.

In above example, the final file I want is like
61050731050801

Can we acheive this through Sort Utility ?
Back to top
View user's profile Send private message
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12375
Topics: 75
Location: San Jose

PostPosted: Fri Aug 05, 2005 1:55 pm    Post subject: Reply with quote

Rahull,

Try this. This job will not take care of the Leap year.

Code:

//STEP0100 EXEC PGM=SORT   
//SYSOUT   DD SYSOUT=*     
//SORTIN   DD *             
61050729050801             
//SORTOUT  DD SYSOUT=*     
//SYSIN    DD *             
  SORT FIELDS=COPY                                 
  INCLUDE COND=(5,2,CH,NE,11,2,CH)                 
  OUTREC FIELDS=(1,6,                             
                 7:5,2,CHANGE=(2,C'01',C'31',     
                                 C'02',C'28',     
                                 C'03',C'31',     
                                 C'04',C'30',     
                                 C'05',C'31',     
                                 C'06',C'30',     
                                 C'07',C'31',     
                                 C'08',C'31',     
                                 C'09',C'30',     
                                 C'10',C'31',     
                                 C'11',C'30',     
                                 C'12',C'31'),     
                       NOMATCH=(7,2),             
                       9,6)                       
/*


Hope this helps...

Cheers

kolusu
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Rahull
Beginner


Joined: 29 Jan 2004
Posts: 62
Topics: 19

PostPosted: Fri Aug 05, 2005 2:41 pm    Post subject: Reply with quote

Thanks Kolusu!! But can't we take care of leap year. We required this file only for 21st centuary.

One more things If their is no month differnce i still want my original input file in sysout.
Back to top
View user's profile Send private message
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12375
Topics: 75
Location: San Jose

PostPosted: Mon Aug 08, 2005 9:33 am    Post subject: Reply with quote

Rahull,

The leap year calculation is already shown here.

http://mvsforums.com/helpboards/viewtopic.php?t=3873&highlight=leap

The following JCL will give you the desired results.

A brief explanation of the job. Your input file has just 2 digit year. But you need a 4 digit year to find out the leap year.

so we add a constant of 2000 to the year portion at 3 and find out if it is a leap year.

we now take that year and divide it by 4,100 and 400 and get the remainder on the inrec fields.

Now using a change command on OUTREC FIELDS we change the remainder to "L" if the remainder is a zero.

Using another change command on the OUTFIL OUTREC, we create a flag "L" if it is leap year and "N" if it is not a leap year.

We also subtract the month fields from one another. So if they are equal then the difference is zero and if they are different the difference is greater or lesser than 0.

Now we use this 2 flags(leap year and difference between months) and use another change command to decide if we need to update the record or not with another flag.

Based on the flag we increment the date field to the last day of the month.

Code:

//STEP0100 EXEC PGM=SORT                                           
//SYSOUT   DD SYSOUT=*                                             
//SORTIN   DD *                                                   
61050729050801                                                     
61040212040301                                                     
61040212040201                                                     
61050729050701                                                     
//SORTOUT  DD DSN=&T1,DISP=(,PASS),DATACLAS=FBSML                 
//SYSIN    DD *                                                   
 SORT FIELDS=COPY                                                 
 INREC FIELDS=(1,14,                                               
               X,                                                 
              (+2000,ADD,3,2,ZD,SUB,                               
               +4,MUL,((+2000,ADD,3,2,ZD),DIV,+4)),EDIT=(T),       
               X,                                                 
              (+2000,ADD,3,2,ZD,SUB,                               
               +100,MUL,((+2000,ADD,3,2,ZD),DIV,+100)),EDIT=(TTT),
               X,                                                 
              (+2000,ADD,3,2,ZD,SUB,                               
               +400,MUL,((+2000,ADD,3,2,ZD),DIV,+400)),EDIT=(TTT))
                                                                   
 OUTREC  FIELDS=(1,15,                                             
                16:16,1,CHANGE=(1,C'0',C'L'),NOMATCH=(C'N'),       
                17:18,3,CHANGE=(1,C'000',C'L'),NOMATCH=(C'N'),     
                18:22,3,CHANGE=(1,C'000',C'L'),NOMATCH=(C'N'))     
 OUTFIL OUTREC=(01,15,                                             
                16,3,CHANGE=(1,C'LLL',C'L',                       
                               C'LNN',C'L'),                       
                             NOMATCH=(C'N'),                       
                5,2,ZD,SUB,11,2,ZD,EDIT=(T),                       
                5,2)                                               
/*                                                               
//STEP0200 EXEC PGM=SORT                         
//SYSOUT   DD SYSOUT=*                           
//SORTIN   DD DSN=&T1,DISP=OLD                   
//SORTOUT  DD SYSOUT=*                           
//SYSIN    DD *   
  SORT FIELDS=COPY                                 
  INREC FIELDS=(1,16,                             
                16,2,CHANGE=(1,C'L0',C'N',         
                               C'N0',C'N'),       
                            NOMATCH=(C'Y'),       
                 18,2)                             
  OUTREC FIELDS=(1,6,                             
                 7:16,4,CHANGE=(2,C'LY01',C'31',   
                                  C'NY01',C'31',   
                                  C'LY02',C'29',   
                                  C'NY02',C'28',   
                                  C'LY03',C'31',   
                                  C'NY03',C'31',   
                                  C'LY04',C'30',   
                                  C'NY04',C'30',   
                                  C'LY05',C'31',   
                                  C'NY05',C'31',   
                                  C'LY06',C'30',   
                                  C'NY06',C'30',   
                                  C'LY07',C'31',   
                                  C'NY07',C'31',   
                                  C'LY08',C'31',   
                                  C'NY08',C'31',   
                                  C'LY09',C'30',   
                                  C'NY09',C'30',   
                                  C'LY10',C'31',   
                                  C'NY10',C'31',   
                                  C'LY11',C'30',   
                                  C'NY11',C'30',   
                                  C'LY12',C'31',   
                                  C'NY12',C'31'), 
                        NOMATCH=(7,2),             
                        9,6)                                             
/*


Hope this helps...

Cheers

kolusu
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12375
Topics: 75
Location: San Jose

PostPosted: Mon Oct 25, 2010 12:34 pm    Post subject: Reply with quote

Rahull,

With PTF UK90025 for z/OS DFSORT V1R10 and PTF UK90026 for z/OS DFSORT V1R12(Oct, 2010), DFSORT now supports last day of week, month, quarter and year functions.


Code:

//STEP0100 EXEC PGM=SORT                       
//SYSOUT   DD SYSOUT=*                         
//SORTIN   DD *                                 
----+----1----+----2----+----3----+----4----+---
AC050729050801                                 
//SORTOUT  DD SYSOUT=*                         
//SYSIN    DD *                                 
  SORT FIELDS=COPY                             
  INREC IFTHEN=(WHEN=(5,2,CH,NE,11,2,CH),       
  OVERLAY=(3:3,6,Y2T,LASTDAYM,TOGREG=Y2T))     
//*


The output from the above job is

Code:

AC050731050801


For complete details of date arithmetic functions and other new functions see "User Guide for DFSORT PTFs UK90025 and UK90026" paper (sortugph.pdf) at:

http://www.ibm.com/support/docview.wss?rs=114&uid=isg3T7000242
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic   printer-friendly view    MVSFORUMS.com Forum Index -> Utilities All times are GMT - 5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


MVSFORUMS
Powered by phpBB © 2001, 2005 phpBB Group