Generation Control Language Variables

When JCLGEN is processing your definitions, it must have a method of placing the information that you provide into the records being created. This process of substitution is done through symbolic variables similar to normal IBM CLIST and JCL processing. The prototype statements from MICS.PROTOLIB or MICS.PARMS can contain symbolic variables that JCLGEN replaces with the values you defined.
micsrm140cd
When JCLGEN is processing your definitions, it must have a method of placing the information that you provide into the records being created. This process of substitution is done through symbolic variables similar to normal IBM CLIST and JCL processing. The prototype statements from MICS.PROTOLIB or MICS.PARMS can contain symbolic variables that JCLGEN replaces with the values you defined.
Symbolic variables begin with an ampersand (&) and are terminated by any of the common separator characters such as a space, parenthesis, another ampersand, equal sign. If the delimiter is a period, it is taken out of further processing. Two ampersands in a row (&&) are replaced with a single ampersand. Substitutions of symbolics are repeated on a line until no more symbolics are found.
An ampersand is needed in the generated JCL statement, such as for a temporary data set name, a question mark must be used in the prototype statement. Also, when an ampersand is found in a prototype statement followed by a blank, for example, "//@ ", it is resolved as an asterisk.
Besides supporting symbolic variables substitution, the JCLGEN process has several built-in functions: &DATATYPE, &LENGTH, &STR, &SUBSTR, and &DLM.
Examples of symbolic substitutions and functions are shown here. For these examples, assume that the values of the symbolic variables are as follows:
&CICDATA = &prefix..MICS.CIC.DATA &DASDSMSPARMS = STORCLAS=MICSTEMP &DASDUNIT = SYSDA &JOBLINES = 50 &PREFIX = XYZ.CICS &PROG = 'MICS PROGRAMMER' &RIP = CIC &SAVEMEMBER = SMFINITA &TAPEUNIT = 3400-5
Standard substitution works by replacing the name of the symbol with the symbol's value. This process repeats until there are no more symbol names present in the prototype statement.
 
Example 1:
 
Before: //WORK DD UNIT=&DASDUNIT, After: //WORK DD UNIT=SYSDA,
The next example shows the use of the &STR function and multiple substitutions. &STR returns the value within the parenthesis as is.
 
Example 2:
 
Before: //CICDATA DD DISP=SHR,DSN=&&&RIP&STR(DATA) Scan 1: //CICDATA DD DISP=SHR,DSN=&CICDATA Scan 2: //CICDATA DD DISP=SHR,DSN=&PREFIX..MICS.CIC.DATA After: //CICDATA DD DISP=SHR,DSN=XYZ.CICS.MICS.CIC.DATA
In this case, the &STR function was not needed. The statement could have been written as in the next example and would give the same results.
 
Example 3:
 
Before: //CICDATA DD DISP=SHR,DSN=&&&RIP.DATA Scan 1: //CICDATA DD DISP=SHR,DSN=&CICDATA Scan 2: //CICDATA DD DISP=SHR,DSN=&PREFIX..MICS.CIC.DATA After: //CICDATA DD DISP=SHR,DSN=XYZ.CICS.MICS.CIC.DATA
&DATATYPE(expression) returns a value of NUM or CHAR depending whether the expression is numeric or not.
Before: :IF &DATATYPE(&DASDUNIT) EQ CHAR THEN Scan 1: :IF &DATATYPE(SYSDA) EQ CHAR THEN After: :IF CHAR EQ CHAR THEN Before: :IF &DATATYPE(&JOBLINES) NE NUM THEN GOTO ERROR Scan 1: :IF &DATATYPE(50) NE NUM THEN GOTO ERROR After: :IF NUM NE NUM THEN GOTO ERROR
&LENGTH(expression) returns a numeric value equal to the number of characters in the expression up to the last non-blank character. The following example illustrates the use of &LENGTH:
Before: // PGMLEN='&LENGTH(&PROG)', Scan 1: // PGMLEN='&LENGTH(MICS PROGRAMMER)', After: // PGMLEN='15',
The &SUBSTR function is used to return a portion of a string as a value. This function is patterned after the CLIST &SUBSTR function and not the SAS SUBSTR function. The function's syntax is &SUBSTR(start position:end position,character string) where start position and end position are relative to the first character in the string being position 1. If the start position and end position have the same values, a string of length 1 is returned. In this case, end position does not need to be specified. Some examples of the use of &SUBSTR follow:
 
Example 1:
 
Before: :SET NAME = &SUBSTR(6:15,&PROG) Scan 1: :SET NAME = &SUBSTR(6:15,MICS PROGRAMMER) After: :SET NAME = PROGRAMMER
 
Example 2:
 
Before: &SUBSTR(1,&DATATYPE(&&&RIP.DATA)) Scan 1: &SUBSTR(1,&DATATYPE(&CICDATA)) Scan 2: &SUBSTR(1,&DATATYPE(&PREFIX..MICS.CIC.DATA)) Scan 3: &SUBSTR(1,&DATATYPE(XYZ.CICS.MICS.CIC.DATA)) Scan 4: &SUBSTR(1,CHAR) After: C
&DLM(expression) inserts a comma before the expression value IF THE VALUE IS NOT NULL. If the expression resolves to a null value, the comma is omitted. &DLM is used in constructing JCL statements with symbols that can have null values.
 
Example 3:
 
Before: //WORK DD UNIT=&DASDUNIT&DLM(&DASDSMSPARMS), After: //WORK DD UNIT=SYSDA,STORCLAS=MICSTEMP, | +--inserted by &DLM
This example illustrates the situation where &DASDSMSPARMS has a null value.
 
Example 4:
 
Before: //WORK DD UNIT=&DASDUNIT&DLM(&DASDSMSPARMS), After: //WORK DD UNIT=SYSDA,
A complete list of the variables that are available at the start of the JCL generation process is found in the sharedprefix.MICS.SOURCE(JCLPARM). Some of the more commonly used variables are shown here in Generation Control Language Variables (Partial).

Generation Control Language Variables (Partial)

SYMBOL
SYNONYMS
DESCRIPTION
&ACCT
&ACCOUNT, &A
value of JCLDEF "ACCT"
&AMNHGDG
 
value of JCLDEF "HISTMPARM GDG
&AMNHRET
 
value of "HISTMPARM RETPD"
&ARCHAUD
 
value of JCLDEF "ARCHIVE AUDIT"
&ARCHMNH
 
value of JCLDEF "ARCHIVE HISTM"
&ARCHWKH
 
value of JCLDEF "ARCHIVE HISTW"
&AUTOSUBMIT
 
value of JCLDEF "AUTOSUBMIT"
&BFREQ
 
value of JCLDEF "BACKUP FREQ"
&BKUPGDG
 
value of JCLDEF "BKUPPARM GDG"
&BKUPRET
 
value of "BKUPPARM RETPD
&ccc
 
 YES if COMPONENT in unit
&DASDSMSPARMS
 
value of JCLDEF "DASDSMSPARMS"
&DASDUNIT
 
value of JCLDEF "DASDUNIT"
&DAYSMFFILES
 
value of JCLDEF "DAYSMF FILES"
&DATABASE
 
value of JCLDEF "DATABASE"
&DOCSYSOUT
 
value of JCLDEF "DOCUMENT"
&EXPDT
 
value of JCLDEF "EXPDT"
&GROUP
&G
value of JCLDEF "GROUP"
&INCLUDELEVEL
 
internal include nesting level
&ISPxLIBn
 
value of JCLDEF "ISPxLIBn"
&JES
 
value of JCLDEF "JES"
&JOBCLASS
&CLASS, &C
value of JCLDEF "CLASS"
value of JCLINFO "JOBCLASS"
&JOBCOPIES
&COPIES
value of JCLINFO "JOBCOPIES"
&JOBLINES
&LINES
value of JCLINFO "JOBLINES"
&JOBNAME
 
Internal value created from value of JCLDEF "JOBNAME" and value of JCLINFO "UJOBNAME"
&JOBPRTY
&PRTY, &PRT
value of JCLDEF "PRTY"
value of JCLINFO "JOBPRTY"
&JOBTIME
&TIME, &T
value of JCLINFO "JOBTIME"
&JOB7380
 
value of JCLDEF "JOB7380"
&LBL
 
internal file sequence number
&LOGS
 
value of JCLDEF "LOGS"
&MICSLVL
 
internal Maintenance level
&MSGCLASS
&MSC
value of JCLDEF "MSGCLASS"
&MSGLEVEL
&MSGLEV, &MSL
value of JCLDEF "MSGLEVEL"
&NOTIFY
&N
value of JCLDEF "NOTIFY"
&PMICS
 
Internal value of MICS. or null
&PROCLIB
 
value of JCLDEF "PROCLIB"
&PROG
&PRO
value of JCLDEF "PROG"
&REGION
&RE
value of JCLDEF "REGION"
&RENUMBER
 
value of JCLDEF "RENUMBER"
&REPORTS
 
value of JCLDEF "REPORTS"
&RIP
 
internal JCLGEN variable that contains Component for REPEATINCLUDE statement
&SASHELP
 
value of JCLDEF "SASHELP"
&SASLIB
 
value of JCLDEF "SASLIB"
&SHAREDPREFIX
 
value of JCLDEF "SHAREDPREFIX"
&SMICS
 
internalvalue of MICS. or null
&SORTCYL
 
value of JCLDEF "SORTCYL"
&SORTLIB
 
value of JCLDEF "SORTLIB"
&SORTSMSPARMS
 
value of JCLDEF "SORTSMSPARMS"
&SORTUNIT
 
value of JCLDEF "SORTUNIT"
&SYSDATE
 
 internal date, DDMMMYY format
&SYSTIME
 
internal time, HH:MM format
&SYSUID
 
same as &GENLIST
&TAPEPREFIX
 
value of JCLDEF "TAPEPREFIX"
&TAPEUNIT
 
value of JCLDEF "TAPEUNIT"
&TMICS
 
internalvalue of MICS. or null
&UJOBNAME
 
value of JCLINFO "UJOBNAME"
&USER
&U
value of JCLDEF "USER"