Jcl
Introduction to JCL Jcl coding sheet JOB Statement Exec statement DD Statement Concatenating Datasets Referback in JCL Special DD statements Utility Programs Utility program IEBGENER Utility programs IEBCOPY and IEBCOMPR DFSort DFSort reformat dataset DFSort INCLUDE OMIT COND Procedures generation data group (GDG) JCL quick study JCL Interview questionsWhat is generation data group (GDG)
A generation data group (GDG) is a collection of historically related non-VSAM data sets that are arranged in chronological order. That is, each data set is historically related to the others in the group. Each data set within a GDG is called a generation or generation data set (GDS).
A Generation Data Group (GDG) is used for processing data sets that are created on a periodical basis – monthly or weekly or daily or hourly. In each processing cycle, a new generation of the dataset is generated.
For example, GDG can be used to:
- Invoicing
- Reporting
- Backup
- Statistics
- Audit Trails
As the name suggests, each new data set that is created forms a new "generation" in a series. Generation data groups typically follow this pattern:
- A new generation of the data set is added.
- Some of the previous generations of the data set are retained (depending on condition).
- The oldest generation of the data set is deleted or backed up (depending on condition).
The advantage of using generation data groups (GDG) is that the system keeps track of the generations for you so you don't have to change your JCL each time you run.
To simply put, GDGs are:
- Is a group of datasets related to each other chronologically or functionally.
- It provides way of grouping together related data sets that share similar functional or physical properties.
- Generations of a GDG can reside on DASD or TAPE or both.
- Upto 255 relative generations can exist and must be cataloged.
For example lets consider a monthly report generation when created using normal dataset vs GDG:
With normal data set names | With generation data group names | Dataset Version |
REPORT.DEC.DATA | REPORT.DATA(0) | current report |
REPORT.NOV.DATA | REPORT.DATA(-1) | Previous month report |
REPORT.OCT.DATA | REPORT.DATA(-2) | older report |
To add a new generation to a generation data group, you just create a data set with the same name as before and +1 for the generation:
//STEPCRTE EXEC PGM=IEFBR14
//DD1 DD DSN=REPORT.DATA(+1),
// DISP=(NEW,CATLG),
// SPACE=(TRK,(1,5),
// DCB=PROGPUB.MODL.MODL
The system then changes all the previous generation names so that the old (0) becomes (-1), the old (-1) becomes (-2), etc. Here's an example:
Before job completes: | After job completes: |
REPORT.DATA(+1) | REPORT.DATA(0) |
REPORT.DATA(0) | REPORT.DATA(-1) |
REPORT.DATA(-1) | REPORT.DATA(-2) |
REPORT.DATA(-2) | Deleted--if only 3 generations were to be kept |
To make things consistent within a given job, generation data group numbers are not updated at the end of the job step in which a new generation is created. Instead, they are updated at the end of the job. This is important to as (+1) throughout the job.
In the system catalog, each generation has a name with its ‘absolute generation number’
GDGname.GaaaaVnn where
aaaa – absolute generation number from 0001 to 9999
nn – version number from 00 to 99
Creating and Using Generation Data Group (GDG)
To create a generation data group, you must first do these two things:
- Create an entry for the GDG in the system catalog. This entry is called the GDG Base - PROGPUB.BASE.GDG. This entry names the generation data group and specifies how many generations to keep.
- For non-SMS managed datasets, the second step involves creating a model dataset for supplying the DCB parameters to the new individual dataset belonging to a group. This model dataset must be cataloged. For SMS managed datasets, this step can be bypassed.
- To Create a GDG Dataset we can use both IDCAMS & IEHPROGM
Creating a Generation Data Group Base Entry:
Sets up the catalog entry used to keep track of the generation data group (GDG) generations.
- Names the generation data group.
- Specifies how many generations are to be kept.
- Instructs what to do with old generations.
- As an option, tells how long to keep the entire generation data group.
- You create a generation data group base entry by executing a VSAM utility program called IDCAMS with DEFINE command. Here is an example:
//PROGPUBA JOB NOTIFY=PROGPUB
//STEP010 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE GDG(NAME(PROGPUB.BASE.GDG)-
LIMIT(3)-
EMPTYSCRATCH)
/*
//
The VSAM utility programs have a different syntax from the regular utility programs, which in turn are different from JCL. The dash at the end of a line continues a statement only for the VSAM utilities. Here's an explanation for the DEFINE statement used to create a generation data group base entry:
NAME | A GDG name can contain maximum of 35 characters (Since the GnnnnV00 take up 9 positions we have to keep the name to 35 or less characters) | |
LIMIT | Specifies how many GDS's (generations) are to be maintained in a group. (Maximum 255) | |
EMPTY / NOEMPTY | Specifies what action OS should take when the LIMIT value is reached. EMPTY means that all generations should be removed (uncatalogued) from the group; NOEMPTY means that just the oldest generation should be removed (uncatalogued). | NOEMPTY is the default |
SCRATCH / NOSCRATCH | Specifies whether or not OS should scratch (physical deletion) GDS's as they are removed from the group. | NOSCRATCH is the default |
OWNER | Specifies 1 to 6 character owner-id for the GDG. | |
TO & FOR | Specifies the expiration date TO(yyyyddd) or a retention period FOR(dddd) for the GDG |
Creating the Model:
Use the IEFBR14 utility to create a MODEL. Actually, the system doesn't need an entire data set. It just requires the DCB information contained in the dataset label.
//STEP020 EXEC PGM=IEFBR14
//DD1 DD DSN=PROGPUB.MODL,
// DISP=(NEW,CATLG),
// SPACE=(TRK,0),
// DCB=(LRECL=80,RECFM=FB)
From this JCL the system can use the DCB values given in the model as default values when a new GDS is created. The DCB values can also be overidden while creating the new GDS.
Creating the new generation dataset:
To create a new data set for a generation data group, you provide the generation number for the new generation. Use IEFBR14 utility or a user-written application program.
//STEP020 EXEC PGM=IEFBR14
//DD1 DD DSN=PROGPUB.MODL,
// DISP=(NEW,CATLG),
// SPACE=(TRK,0),
// DCB=(LRECL=80,RECFM=FB)
Points to remember when creating a new data set for a generation data group are:
- DSN should be coded for new generations, along with the generation number in parentheses.
- Disposition should be CATLG for all new generations.
- Generations are referred by the same generation number throughout the various steps in the job as the system updates the generation number only when the job terminates.
- After the job terminates a new generation is added to the GDG and becomes the current generation.
- The former current generation becomes a previous generation.
- Relative generation number is used to uniquely identify every data set in the GDG.
- The current generation is identified as DSN=GDGname(0).
- The earlier generation is identified as DSN=GDGname(-1) and the second oldest generation is identified as DSN=GDGname(-2) and so on.
- +ve numbers refer to generations which are not yet created: Example,
- DSN=GDGname(+1)
- DSN=GDGname(+2),.....).
Absolute and Relative generation numbers:
Lets consider this example with 3 generations in the catalog
GDG | Generation | Absolute generation number | Relative generation number |
PROGPUB.BASE.GDG | Base GDG | ||
PROGPUB.BASE.GDG.G0001V00 | OLDEST GENERATION | G0001V00 | (-2) |
PROGPUB.BASE.GDG.G0002V00 | PREVIOUS GENERATION | G0002V00 | (-1) |
PROGPUB.BASE.GDG.G0003V00 | CURRENT GENERATION | G0003V00 | (0) |
How to retriev a generation dataset:
To retrieve an individual dataset, code the dataset name along with the relative generation number.
If the dataset is coded without the generation number, then all the generations in that group will be concatenated and retrieved.
Deleting a generation dataset:
The system will automatically delete the individual GDS as per the GDG base ‘definition’.
We can also delete a specific generation by coding DISP=(Old,Delete). To delete the GDG Base we have to use IDCAMS command.
GDG Example JCLs:
Base Index GDG JCL example:
File Edit Edit_Settings Menu Utilities Compilers Test Help
-------------------------------------------------------------------------------
EDIT PROGPUB.AA.SOURCE(IDXGDJCL) - 01.03 Columns 00001 00072
****** ***************************** Top of Data ******************************
==MSG> -Warning- The UNDO command is not available until you change
==MSG> your edit profile using the command RECOVERY ON.
000001 //PROGPUBA JOB NOTIFY=PROGPUB
000002 //S1 EXEC PGM=IDCAMS
000003 //SYSPRINT DD SYSOUT=*
000004 //SYSIN DD *
000005 DEFINE GDG(NAME(PROGPUB.AA.GDGRPT)-
000006 LIMIT(5)-
000007 SCRATCH)
000008 /*
000009 //
****** **************************** Bottom of Data ****************************
Create new generation GDG JCL example:
File Edit Edit_Settings Menu Utilities Compilers Test Help
-------------------------------------------------------------------------------
EDIT PROGPUB.AA.SOURCE(CRGDGJCL) - 01.05 Columns 00001 00072
****** ***************************** Top of Data ******************************
==MSG> -Warning- The UNDO command is not available until you change
==MSG> your edit profile using the command RECOVERY ON.
000001 //PROGPUBA JOB NOTIFY=PROGPUB
000002 //S1 EXEC PGM=IEFBR14
000003 //DD1 DD DSN=PROGPUB.AA.GDGRPT(+1),DISP=(NEW,CATLG,DELETE),
000004 // SPACE=(TRK,(8,5),RLSE),
000005 // DCB=PROGPUB.AA.MDL,
000006 // UNIT=SYSDA
000007 //SYSIN DD DUMMY
000008 //
****** **************************** Bottom of Data ****************************
Alter GDG base JCL example:
File Edit Edit_Settings Menu Utilities Compilers Test Help
-------------------------------------------------------------------------------
EDIT PROGPUB.AA.SOURCE(ALGDGJCL) - 01.00 Columns 00001 00072
****** ***************************** Top of Data ******************************
==MSG> -Warning- The UNDO command is not available until you change
==MSG> your edit profile using the command RECOVERY ON.
000001 //PROGPUBA JOB NOTIFY=PROGPUB
000002 //S1 EXEC PGM=IDCAMS
000003 //SYSPRINT DD SYSOUT=*
000004 //SYSIN DD *
000005 ALTER PROGPUB.AA.GDGRPT EMPTY
000006 /*
000007 //
****** **************************** Bottom of Data ****************************
Delete GDG base JCL example:
File Edit Edit_Settings Menu Utilities Compilers Test Help
-------------------------------------------------------------------------------
EDIT PROGPUB.AA.SOURCE(DLGDGJCL) - 01.02 Columns 00001 00072
****** ***************************** Top of Data ******************************
==MSG> -Warning- The UNDO command is not available until you change
==MSG> your edit profile using the command RECOVERY ON.
000001 //PROGPUBA JOB NOTIFY=PROGPUB
000002 //S1 EXEC PGM=IDCAMS
000003 //SYSPRINT DD SYSOUT=*
000004 //SYSIN DD *
000005 DELETE PROGPUB.AA.GDGRPT GDG FORCE
000006 /*
000007 //
****** **************************** Bottom of Data ****************************
Merge GDG JCL example:
File Edit Edit_Settings Menu Utilities Compilers Test Help
-------------------------------------------------------------------------------
EDIT PROGPUB.AA.SOURCE(MGGDGJCL) - 01.02 Columns 00001 00072
****** ***************************** Top of Data ******************************
==MSG> -Warning- The UNDO command is not available until you change
==MSG> your edit profile using the command RECOVERY ON.
000001 //PROGPUBA JOB NOTIFY=PROGPUB
000002 //S1 EXEC PGM=ICETOOL
000003 //TOOLMSG DD SYSOUT=*
000004 //DFSMSG DD SYSOUT=*
000005 //IN1 DD DSN=PROGPUB.AA.GDG1,DISP=SHR
000006 // DD DSN=PROGPUB.AA.GDG2,DISP=SHR
000007 //OUT DD DSN=PROGPUB.AA.GDG3,DISP=SHR
000008 //TOOLIN DD *
000009 SORT FROM(IN1) TO(OUT) USING(CTL1)
000010 /*
000011 //CTL1CNTL DD *
000012 SORT FIELDS=COPY
000013 /*
000014 //
****** **************************** Bottom of Data ****************************