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

How to get Current Date thru JCL


IBM Mainframe Forums -> Mainframe Interview Questions
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
meenasomu

New User


Joined: 15 Sep 2005
Posts: 17

PostPosted: Wed Nov 16, 2005 5:01 pm
Reply with quote

Hi all,

My requirement is to create a PS file with Date as extension. something like...

A.B.C.D.date

date is the current date. Can i get the system date thru JCL and create the PS file like the one specified above?

This is an urgent requirement. Can anyone answer this asap.

Thanks in Advance.

Regards,
Meena.
Back to top
View user's profile Send private message
meenasomu

New User


Joined: 15 Sep 2005
Posts: 17

PostPosted: Wed Nov 16, 2005 6:06 pm
Reply with quote

The job that is going to create this PS file is going to be a daily job.

So instead of using a SET in JCL , can i automate this in some way.

Can anyone comment on this.

Regards,
Meena.
Back to top
View user's profile Send private message
superk

Global Moderator


Joined: 26 Apr 2004
Posts: 4652
Location: Raleigh, NC, USA

PostPosted: Wed Nov 16, 2005 6:29 pm
Reply with quote

Everytime I see a new way of doing this, I add to this document. This is what I have accumulated so far:

Quote:

Enabling System Date and/or Time Stamps In JCL

Section 1. Using Job Schedulers

CA7 Example:

Say you want your JCL to look like this if todays date was 11/7/03:

//JOBCARD...
//STEP010 EXEC PGM=IEFBR14
//DD1 DD DSN=NODE1.NODE2.D110703,
// DISP=(NEW,CATLG, DELETE),
// etc....

Create a member in your CA7ONL //CARPROC DD, call it "CURRDATE". Copy in this information:

// DPROC MMDDYY
// DSET MMDDYY=MDY(&C_JDATE)
//DD1 DD DSN=NODE1.NODE2.D&MMDDYY,

Create your CA-7 JCL to look like this:
//JOBCARD...
//STEP010 EXEC PGM=IEFBR14
//D EXEC CURRDATE
// DISP=(NEW,CATLG, DELETE),
// etc....

In CA-7, do the "LJCK,LIST=ONLY,JOB=jobname" command to see what will be submitted to JES2


Section 2. Strictly JCL

Example 1. Using a PROCedure with variables.

//JOB123 JOB (accounting),CLASS=X,MSGCLASS=X
//*
//STEP1 EXEC MYPROC,SYSDATE=110703,SYSTIME=080000
//*

//MYPROC PROC SYSDATE=,SYSTIME=
//*
//PROC1 EXEC PGM=IEFBR14
//DD1 DD DSN=NODE1.NODE2.D&SYSDATE.T&SYSTIME,
// DISP=(NEW,CATLG, DELETE),
// etc....

Example 2. Using SET command to set JCL variables. The values for the SET statements must be defined prior to the job submission.

//JOB123 JOB (accounting),CLASS=X,MSGCLASS=X
//*
// SET SYSDATE=110703
// SET SYSTIME=080000
//*
//STEP1 EXEC PGM=IEFBR14
//DD1 DD DSN=NODE1.NODE2.D&SYSDATE.T&SYSTIME,
// DISP=(NEW,CATLG, DELETE),
// etc....

Example 3. Using SET/INCLUDE commands to set JCL variables in an external library.

Step 1. Application creates a member SETDATE in the library 'MYLIB.CNTL' with the following two records:

// SET SYSDATE=110703
// SET SYSTIME=080000

Step 2. Now, job can be submitted with an INCLUDE statement for the associated library.

//JOB123 JOB (accounting),CLASS=X,MSGCLASS=X
//*
// JCLLIB ORDER=(MYLIB.CNTL)
// INCLUDE MEMBER=SETDATE
//*
//STEP1 EXEC PGM=IEFBR14
//DD1 DD DSN=NODE1.NODE2.D&SYSDATE.T&SYSTIME,
// DISP=(NEW,CATLG, DELETE),
// etc....


Section 3. Using a program to create and submit the JCL.

/* REXX to capture the current date and save it in an INCLUDE group */
Drop jcl. /* clear STEM */
jcl.0 = 1 /* plug in record count. */
jcl.1 = "// SET DATE="D20||DATE('J') /* create SET statement */
jcl.1 = LEFT(jcl.1,80) /* Pad to 80 bytes, and */
"EXECIO 1 DISKW DATEDD (FINIS STEM jcl." /* Output to library */
Exit 0 /* quit with COND CODE = 0 */

Sample Job to capture the date

//OPSSTU1T JOB ,'TERRY',CLASS=A,NOTIFY=&SYSUID,MSGCLASS=X
//LIST OUTPUT DEFAULT=YES,CLASS=*,JESDS=ALL
//S0010 EXEC PGM=IKJEFT01,PARM='SETDATE'
//SYSTSIN DD DUMMY
//SYSTSPRT DD SYSOUT=(,)
//SYSPRINT DD SYSOUT=(,)
//CEEDUMP DD SYSOUT=(,)
//SYSEXEC DD DSN=&SYSUID..REXX.EXEC,DISP=SHR
//DATEDD DD DSN=&SYSUID..JCL.CNTL(TODAY),DISP=SHR

Sample Job to include the Date.

//OPSSTU11 JOB ,'T-R-S',CLASS=A,MSGCLASS=X,NOTIFY=OPSSTU1
// JCLLIB ORDER=(&SYSUID..JCL.CNTL)
// INCLUDE MEMBER=TODAY
// EXEC PGM=IEFBR14
//DDA DD DSN=&SYSUID..SEQ.&DATE,DISP=(,DELETE,DELETE),
// SPACE=(80,(100,100)),LRECL=80,RECFM=FB,BLKSIZE=0,
// AVGREC=K,UNIT=SYSDA

Time stamp method
This solution could be used when multiple versions of a data set are to be created through out the day, and both date and time are to form part of the data set name. It requires two steps, the first creates the data set, and the second renames the data set replacing a particular node with the date and time. The issue not dealt with directly here is one of co-ordination to ensure that two jobs do not attempt to create data sets with the same time stamp. If an installation runs with the standard JES2 default of NOT allowing concurrent execution of jobs with duplicate names, it provides some assistance.

Sample REXX Routine to rename the data set

/* REXX to rename a data set to include current date as part of the
data set name. */
Parse Arg odsn onode /* Obtain parameters
odsn = existing dsn
onode = date location */
tod = TIME('N') /* Get Time of Day */
Parse var tod hh ':' mm ':' ss /* Remove the semi-colons */
lnode = LENGTH(onode) /* Get length of node */
lodsn = LENGTH(odsn) /* Get length of dsname */
start = POS(onode,odsn) /* Find onode */
more = POS('.',odsn,start) /* Anything after onode */
ndsn = SUBSTR(odsn,1,start-1)||'D20'||DATE('J')||'.T'||hh||mm||ss
If more > 0 Then ndsn = ndsn||SUBSTR(odsn,more)
x = MSG('OFF') /* Suppress messages */
"RENAME '"odsn"' '"ndsn"' " /* Rename the data set */
If rc ?= 0 Then Do /* Check for success */
Say "Rename Error"
Exit rc
End
Exit 0 /* quit with COND CODE = 0 */

Sample Job using the above REXX routine.

//OPSSTU1T JOB ,'T-R-S',CLASS=A,NOTIFY=&SYSUID,MSGCLASS=X
//LIST OUTPUT DEFAULT=YES,CLASS=*,JESDS=ALL
// SET DATEF='OPSSTU1.TEST.FILE'
//S0010 EXEC PGM=IEFBR14
//DDA DD DSN=&DATEF,DISP=(,CATLG,DELETE),
// SPACE=(80,(100,100)),LRECL=80,RECFM=FB,BLKSIZE=0,
// AVGREC=K,UNIT=SYSDA
//S0020 EXEC PGM=IKJEFT01,
// PARM='SETDATE2 &DATEF TEST'
//SYSTSIN DD DUMMY
//SYSTSPRT DD SYSOUT=(,)
//SYSPRINT DD SYSOUT=(,)
//CEEDUMP DD SYSOUT=(,)
//SYSEXEC DD DSN=&SYSUID..REXX.EXEC,DISP=SHR

//*
/*JOBPARM ROOM=SOP,LINES=9999
//*
//STEP0001 EXEC PGM=IEFBR14
##DD1
// DISP=(,CATLG,DELETE),UNIT=SYSDA,SPACE=(CYL,(1,1)),
// RECFM=FB,LRECL=80
//*
//STEP0002 EXEC PGM=IEBGENER
//SYSUT1 DD DATA
TEST RECORD 01 OF 10
TEST RECORD 02 OF 10
TEST RECORD 03 OF 10
TEST RECORD 04 OF 10
TEST RECORD 05 OF 10
TEST RECORD 06 OF 10
TEST RECORD 07 OF 10
TEST RECORD 08 OF 10
TEST RECORD 09 OF 10
TEST RECORD 10 OF 10
/*
##SYSUT2
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//*

Next, I created the JCL that follows. I am using DFSORT to:

first, generate a sequential number for each record so that they can be kept in order.

then, I separate the JCL into two datasets - one with everything minus the ## records, and one with just the ## records, with the ## replaced by //, the data 'DD DSN=', and a dataset, with the SORT function DATE3 supplying the current Julian date.

lastly, the two sets of JCL are concatenated back together, using the sequence numbers to retain the proper order, with the resulting concatenated file going to the Internal Reader for submission. I'm sure it could use some tweaking here and there, but here goes nothing:

//*
//STEP0001 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IA DD DISP=SHR,DSN=TPPAT07.JCL(JCLDATEX)
//OA DD DSN=&&OA,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1))
//IB DD DSN=*.OA,VOL=REF=*.OA,DISP=(OLD,PASS)
//OB DD DSN=&&OB,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1))
//OC DD DSN=&&OC,DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(1,1))
//IC DD DSN=*.OB,VOL=REF=*.OB,DISP=(OLD,PASS)
// DD DSN=*.OC,VOL=REF=*.OC,DISP=(OLD,PASS)
//OD DD SYSOUT=(*,INTRDR)
//*
//TOOLIN DD DATA
COPY FROM(IA) TO(OA) USING(CTLA)
COPY FROM(IB) TO(OB) USING(CTLB)
COPY FROM(IB) TO(OC) USING(CTLC)
SORT FROM(IC) TO(OD) USING(CTLD)
/*
//*
//CTLACNTL DD DATA
INREC FIELDS=(1,80,SEQNUM,6,ZD)
OUTREC FIELDS=(1:1,86)
/*
//*
//CTLBCNTL DD DATA
INCLUDE COND=(1,2,CH,NE,C'##')
/*
//*
//CTLCCNTL DD DATA
INCLUDE COND=(1,2,CH,EQ,C'##')
OUTREC FIELDS=(1:C'//',3:3,8,12:C'DD DSN=',
C'&SYSUID..DATA.#',DATE3,C',',81:81,6)
/*
//CTLDCNTL DD DATA
SORT FIELDS=(81,6,ZD,A)
OUTREC FIELDS=(1:1,80)
/*

Section 4. Using system variables in the JCL.

//STEP0001 EXEC PGM=EZACFSM1
//SYSIN DD DATA,DLM=@@
//MYJOB JOB (...),CLASS=X,MSGCLASS=X
//*
//STEP0001 EXEC PGM=IEFBR14
//FILE1 DD DSN=&SYSUID..CUST.AF.#&LYR2&LMON&LDAY..#000001.DAT,
// DISP=(MOD,DELETE,DELETE),UNIT=SYSDA,
// SPACE=(CYL,(0,0),RLSE)
//*
//STEP0002 EXEC PGM=ICEGENER
//SYSUT1 DD DUMMY
//SYSUT2 DD DSN=&SYSUID..CUST.AF.#&LYR2&LMON&LDAY..#000001.DAT,
// DISP=(,CATLG,DELETE),UNIT=SYSDA,
// SPACE=(CYL,(100,100),RLSE)
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
@@
//SYSOUT DD SYSOUT=(A,INTRDR)

Back to top
View user's profile Send private message
superk

Global Moderator


Joined: 26 Apr 2004
Posts: 4652
Location: Raleigh, NC, USA

PostPosted: Wed Nov 16, 2005 6:39 pm
Reply with quote

You can also try these other posts:

www.ibmmainframes.com/viewtopic.php?t=1097
www.ibmmainframes.com/viewtopic.php?t=1124
www.ibmmainframes.com/viewtopic.php?t=4990
Back to top
View user's profile Send private message
sharad_shanu

New User


Joined: 03 Oct 2006
Posts: 40

PostPosted: Wed Sep 05, 2007 1:02 pm
Reply with quote

Hi,

I am using the last option.
I am getting MAXCC=0 but output dataset is not created.
I fail to understand the reason.
Can anyone Help me out?

Thanks,
SS
Back to top
View user's profile Send private message
CICS Guy

Senior Member


Joined: 18 Jul 2007
Posts: 2146
Location: At my coffee table

PostPosted: Wed Sep 05, 2007 1:17 pm
Reply with quote

Which is the "last option" and how about posting your sysouts?
Back to top
View user's profile Send private message
sharad_shanu

New User


Joined: 03 Oct 2006
Posts: 40

PostPosted: Wed Sep 05, 2007 1:39 pm
Reply with quote

ok!...this is the jcl...

Code:
                       
//ADDDATE EXEC PGM=EZACFSM1                           
//SYSOUT    DD SYSOUT=(*,INTRDR)                     
//SYSIN     DD DATA,DLM=@@                           
//ADDDT  JOB (M158620,MMMM,5,999),'SHARAD',             
//             CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID       
//NEWDD   EXEC PGM=IEFBR14                             
//NEWFILE DD CDSTN.CR50DX.QTS.DMI.ACCEPT.FINAL.D&YYMMDD
//               DISP=(NEW,CATLG,DELETE),               
//               UNIT=(SYSDA,9),DATACLAS=LARGE,         
//               DCB=(LRECL=1444,RECFM=FB),                       
//             SPACE=(CYL,(500,100),RLSE)                         
@@                                                             
//SYSOUT DD SYSOUT=(*,INTRDR)                                   
//*
//COPYOUT EXEC PGM=GENER                                       
//SYSPRINT DD SYSOUT=*                                         
//SYSUT1   DD DSN=CDSPN.CR50DX.QTS.DMI.MDL.ACCEPT.FINAL,DISP=SHR
//SYSUT2   DD DSN=CDSTN.CR50DX.QTS.DMI.ACCEPT.FINAL.D@YYMMDD,   
//             DISP=(MOD,KEEP,DELETE)                           
//*@@                                                           
//*                                                             
//*SYSOUT DD SYSOUT=(*,INTRDR)                                 
//SYSOUT DD SYSOUT=*                                           
//SYSPRINT DD SYSOUT=*                                         
//
Back to top
View user's profile Send private message
superk

Global Moderator


Joined: 26 Apr 2004
Posts: 4652
Location: Raleigh, NC, USA

PostPosted: Wed Sep 05, 2007 2:08 pm
Reply with quote

That's NOT like the example shown. Your JCL should look like:

Code:
                       
//ADDDATE EXEC PGM=EZACFSM1                           
//SYSOUT  DD   SYSOUT=(*,INTRDR)                     
//SYSIN   DD   DATA,DLM=@@                           
//ADDDT  JOB (M158620,MMMM,5,999),'SHARAD',             
//             CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID       
//COPYOUT EXEC PGM=IEBGENER   
//SYSUT1   DD DSN=CDSPN.CR50DX.QTS.DMI.MDL.ACCEPT.FINAL,DISP=SHR     
//SYSUT2 DD CDSTN.CR50DX.QTS.DMI.ACCEPT.FINAL.D&YYMMDD
//          DISP=(,CATLG,DELETE),               
//          UNIT=(SYSDA,9),DATACLAS=LARGE,                               
//          SPACE=(CYL,(500,100),RLSE)     
//SYSPRINT DD SYSOUT=*
//SYSIN   DD DUMMY                   
@@
//
Back to top
View user's profile Send private message
RamsIBM

New User


Joined: 08 Jan 2007
Posts: 53
Location: Chennai

PostPosted: Wed Sep 05, 2007 2:16 pm
Reply with quote

Hi

//SYSOUT DD SYSOUT=(*,INTRDR)

Can anyone tell me what is INTRDR and How it will work?
Back to top
View user's profile Send private message
superk

Global Moderator


Joined: 26 Apr 2004
Posts: 4652
Location: Raleigh, NC, USA

PostPosted: Wed Sep 05, 2007 2:24 pm
Reply with quote

RamsIBM wrote:
Can anyone tell me what is INTRDR and How it will work?


Search the forums please. It's been discussed many times before.
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 -> Mainframe Interview Questions

 


Similar Topics
Topic Forum Replies
No new posts Help with SORT - I need to validate d... DFSORT/ICETOOL 0
No new posts Date format correction using dfsort DFSORT/ICETOOL 3
No new posts Sorting Date Field DFSORT/ICETOOL 4
No new posts CONVERT a given date from UTC TO BST CICS 0
No new posts Pull data using date difference betwe... DB2 6
Search our Forums:

Back to Top