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"