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" |
®ION | &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" |