6 Ideas – How to use JCL GDG Correctly

1. INTRODUCTION

Generation Data Groups or GDGs are a group of data sets which are related to each other chronologically and functionally. These related Data Sets share a unique Data Set Name. Every GDG data set has a Generation number and Version number assigned to each data set.

EXAMPLE --   'MYLIB.LIB.TEST.G0001V00'
'MYLIB.LIB.TEST.G0002V00'
'MYLIB.LIB.TEST.G0003V00'     <-- Current Version
Generation Number ->  GaaaaVnn
aaaa is between 0000 to 9999
nn   is between 00   to 99

In JCL, we refer current version with 0 

( Ex.  MYLIB.LIB.TEST(0)  )

new version going to create with  +1    

( Ex.  MYLIB.LIB.TEST(+1) )

older versions , refer with -1 -2 -3 etc….

( Ex.  MYLIB.LIB.TEST(-1) )   <- OLDER VERSION

Example for where we can use this GDGs.

Usually, In production environment, for every month we need to run jobs to create reports for that month.

Let us suppose for January, We can code it  MYLIB.LIB.TEST.JAN

for FEB, We can code it  MYLIB.LIB.TEST.FEB

for MAR, We can code it  MYLIB.LIB.TEST.MAR

So , Every month we need change dataset name in JCL, before submitting the job. Whenever we enterred into another year,  We need to delete old years data sets.

We need to do above task carefully, If we use GDG, It will take care following things

  •     It will maintain all generation of data sets
  •     It will delete/uncatalog older generation
  •     Very easily, we can refer current and older versions of data sets
  •     No need of change the JCL every time when we submit

2. CREATION OF GDG

Before using GDG , We need to create GDG index and model. IDCAMS (the ‘AMS’ stands for Access Method Services), utility is used to create GDG index.

Example JCL for creating GDG index

//MYJOB   JOB  (W234),'RAMESH'
//STEP1   EXEC PGM=IDCAMS
//SYSIN   DD   *
 DEFINE GDG(NAME(MYLIB.LIB.TEST)    -
 LIMIT(10)               -
 NOEMPTY                 -
 SCRATCH)
/*
//

In this example, IDCAMS utility is used to create an index  for a GDG called  MYLIB.LIB.TEST. The number of generations that can exist in this GDG is limited to ten. NOEMPTY parameter is used to specify , Once the limit is reached, the system is instructed to uncatalog the oldest generation data set within the GDG.  SCRATCH parameter is used to specify to physically delete the data set which was uncataloged.

3. PARAMETERS WE CAN PASS TO IDCAMS

NAME  –  This parameter is used to specify the name of the data set that is to be created.

LIMIT  –  This parameter is used to specify the the total number of generations that the GDG may contain

EMPTY/NOEMPTY  –  These two parameters are mutually exclusive. EMPTY specifies that all existing generations of the GDG are to be uncataloged whever the generations of GDG reached the maximum limit NOEMPTY specifies that only the oldest generation of the GDG is to be uncataloged if the limit is reached

SCRATCH/NOSCRATCH –  These two parameters are mutually exclusive. SCRATCH parameter specifies that whenever entry of the GDG is removed from the index, it should be deleted physically and uncataloged.  NOSCRATCH  parameter  specifies  that  whenever entry of the GDG is removed from the index, it should be uncataloged, not physically deleted

SCRATCH and NOEMPTY are default parameters

CREATING MODEL

Once the index has  been  created,  a  model data set must be created. This  model data set contains specifications for the DCB subparameters for all data sets that will belong to that GDG. Programmer can override this default values if he want.

EXAMPLE JCL

//MYJOB  JOB   (W983),'KRISHNA'
//STEP1  EXEC   PGM=IDCAMS
//SYSIN  DD     *
 DEFINE GDG(                         -
 NAME(MYLIB.LIB.TEST)    -
 LIMIT(10)               -
 NOEMPTY                 -
 SCRATCH)
//STEP2  EXEC PGM=IEFBR14
//MODEL1 DD   DSN=MYLIB.LIB.TEST,
//            DISP=(NEW,KEEP,DELETE),
//            UNIT=SYSDA,
//            SPACE(TRK,0),
//            DCB=(LRECL=80,RECFM=FB,BLKSIZE=800)
//

Using IEFBR14, we have created the model, Now GDG is ready to use, In next section you will learn how we will  use this created GDG.

4. How to Use GDG

To use created GDG in our JCL, we need to use name (with +1 for new generation) which we used in DEFINE GDG command. (i.e. MYLIB.LIB.TEST)

EXAMPLE JCL

//MYJOB   JOB  (SD345),'KRISHNA REDDY'
//STEP1   EXEC PGM=COBPROG
//INFILE  DD   DSN=MYLIB.LIB.TEST(+1),
//             DISP=(NEW,CATLG,DELETE),
//             UNIT=SYSDA,
//             SPACE=(TRK,(20,10),RLSE),
//             DCB=(MODEL.DCB,RECFM=FB,
//             LRECL=80,
//             BLKSIZE=800)
//

The program COBPROG is executed. A new generation data set is created via the statement

//INFILE  DD  DSN=MYLIB.LIB.TEST(+1)

Since we used (+1) with GDG name, it creates a new generation data set.

The DISP parameter must be set to CATLG for all new generation data sets , DISP=(NEW,CATLG,DELETE)

We used MODEL.DCB in DCB parameter to instruct system to use subparameters specified in model GDG.

The DSN and UNIT parameters must be coded for all new generation data sets

5. ALTERING GDG DEFINITION

Some times there are situtations where we need to change the attributes of GDG. These types of tasks can be performed using  ALTER command. We will use IDCAMS utitlity to alter GDG attributes.

In last section, I have create MYLIB.LIB.TEST GDG with NOEMPTY SCRATCH  subparameters, now I want to change them to EMPTY NOSCRATCH respectively.

Here is the JCL that will do this:

//MYJOB    JOB  (WE345),'KRISHNA'
//STEP1    EXEC PGM=IDCAMS
//SYSPRINT DD   SYSOUT=A
//SYSIN    DD   *
 ALTER MYLIB.LIB.TEST  EMPTY NOSCRATCH
/*
//

In this example, the ALTER statement is used to modify the features of the GDG called MYLIB.LIB.TEST. Any generations that may exist for that GDG will now contain the modified features as well. Any new generations that are created for this GDG will now be created based on these new features.

6. DELETING GDG

We can delete an generation of GDG  with IEFBR14, Here is the JCL to do that

//MYJOB  JOB  (ER456),'RAMESH'
//STEP1  EXEC PGM=IEFBR14
//DEL1   DD   DSN=MYLIB.LIB.TEST(0)    <-- Current Version
//            DISP=(OLD,DELETE,DELETE)
//

In this example JCL, the program IEFBR14 is executed. The current generation of MYLIB.LIB.TEST is deleted.

To delete GDG index/generations , We need to use DELETE command in  IDCAMS utility. There are two sub parameters we can use with DELETE command.

They are PURGE and  FORCE

PURGE sub parameter is used in conjunction with DELETE statement to delete the GDG index, even if its retention period has not expired.

FORCE parameter can be coded on the DELETE statement to delete the GDG index, the model, and all related generation data sets, if they exist.

EXAMPLE JCL for FORCE

/MYJOB  JOB  (W234),'KRISHNA'
//STEP1  EXEC PGM=IDCAMS
//SYSIN  DD   *
 DELETE(MYLIB.LIB.TEST) GDG FORCE
/*

MYLIB.LIB.TEST GDG index, the model  and all related generation data sets will be deleted upon successful execution of this job step.

Maximum of 255 data sets exist within one GDG

IMPORTANT PRACTICAL QUESTIONS

In my JCL, In step1 I will going to create a new generation data set for that i gave gdgname(+1). In step2 I want to use same data set created by previous step? what number i should give to refer that

data set (i.e 0 or +1 or +2 )?   (STEP1 EXECUTED SUCCESSFULLY)

+1

Why?

Even step1 executed successfully, It is not become the current generation of GDG. At the end of the job only it will become the current version of GDG. So within the job we need to refer it as new generation only, even that step   completed successfully.

Related Posts

Author: Srini

Experienced software developer. Skills in Development, Coding, Testing and Debugging. Good Data analytic skills (Data Warehousing and BI). Also skills in Mainframe.