MXG New User Installation Documentation

Chapter 1. So You Get to Be the New MXG Administrator

Whether you got to this point by way of applications programming or systems programming, you have arrived in the MXG zone. The good news is that you are about to embark on a journey into new areas where you will acquire new skills and knowledge. The bad news is that you are about to embark on a journey into new areas where you will acquire new skills and knowledge.

What is MXG? Why are you going through this process? How do you install it? What can you do with it? The intent of this manual is to provide you the answers to these questions and some general guidelines in the care and feeding of MXG at your installation.

MXG (Merrill’s Expanded Guide) is a collection of SAS programs designed to decode and manipulate CPE (computer performance evaluation) data. It is an extension of the original Merrill’s Guide originally published by the SAS institute in a long ago time and place.

Originally, the software was written and designed specifically for the IBM 370 MVS/XA operating system and the SMF (System Management Facility) data generated by that operating system. Over time, the software has evolved to encompass not only nearly every conceivable IBM and user generated SMF record but data from other operating systems and platforms as well.

At the time the original MXG software was developed, the PC was still in its infancy and thus the primary platform for running MXG was (and probably still is) the mainframe. However, it should be noted that MXG will run and process SMF data on any platform supported by current versions of SAS. In theory, the SMF data from a mainframe system could be processed on a PC. In practice, the volume of data to be moved will usually make that an impractical solution (some OS 390 SYSPLEXes can generate 40+GB of data on a daily basis!)

The original MXG consisted of a single unloaded PDS containing 289 members with 22,000 lines of SAS source code and used 1,760,000 bytes of tape to ship. Today, version 16 ships with 4,290 members and over 1.2 million lines of SAS source code. As this growth has taken place, both the need for and the complexity of tailoring of the product has increased.

The purpose of this text is not to make you an expert at CPE, an expert SAS programmer, or even an expert user of MXG. The purpose is to help you learn to install and maintain MXG and produce some simple and hopefully meaningful reports for management. You do not need to be an expert SAS programmer. It is not even absolutely necessary that at this level you need to be able to spell SAS.

If we succeed, you will be able to relate the pieces of SAS that you do need to know to other high-level languages you already know and understand.

That is not to say that an introductory course in SAS would not be helpful and a good thing to have. It is an acceptance of the reality that you may have had MXG thrown your way on a tight deadline with no opportunity to get the training that you may later be able to obtain.

Over time, your SAS skills will mature and you may find a need for more training and the need to use other SAS components such as SAS/GRAPH. MXG provides examples in the use of SAS/GRAPH and some other SAS components and procedures.

For an expert, it is possible to install SAS on the mainframe (no IPL is required), install MXG, install SAS/PC if required, process SMF data and have reports coming out in a single day. The first time around, it may take a while longer but not significantly so. Be of good cheer, this is not nearly as complicated as it may sound or as you may have been led to believe.

Depending on the amount of historical data your management wishes to have available for reporting (and on how much of the data you may have available), it could take as long as a week or as little as a few days to have a fully functional MXG system with loaded performance and trend databases.

 

 

 

Chapter 2.Before You Get Started - Things You Need to Know

Before you get excited and start unloading tapes and building JCL, there are some manual tasks you need to perform. They may not be exciting but you need to get some answers before you can successfully complete the installation process. It is easier to get the answers before you start than to get into the installation and find out you need some information in the middle of the process.

What operating system(s) are you going to need to monitor with a PDB (Performance Data Base)? Certainly, you could install MXG on each platform/OS but it may be easier on your sanity to have the data reside in a single set of databases on a single platform than to have may disparate databases and systems to maintain.

You may find that the only thing you need to be concerned with is MVS but you might also find a UNIX system or three, some NT systems, an LPAR with VM or DOS/VSE etc. Each of these presents their own challenges and data but the data can all be rolled into a single set of PDBs on a single system. Using a single system also limits the number of SAS licenses required (MXG is a site license and is not sensitive to the number of systems being monitored) and thus the cost for SAS which is the most expensive part of the entire mix. For our purposes, we are going to assume that there is only a single OS being monitored (MVS) and that most of the work will be performed on the MVS SAS platform.

How much SMF data is being recorded and where is it stored? What is the frequency of consolidation of the SMF datasets? When do the datasets become available for processing? What is the availability of tape drives during the batch cycle at night? When are reports due on management desks each morning?

These are important questions that control when and how you must run MXG. If the volume of data is such that some or all of the data must be on tape, then tape drives may be a bottleneck to processing. If reports are due to managers at 8AM but the data is not available until 6AM, there may be a timing problem to be overcome. If the data is only collected on a weekly basis (unlikely) then running MXG daily would be pointless. Chapter 3 is entirely devoted to the process of managing SMF data.

How are workloads defined on your system? You may have systems in compatibility mode or in goal mode or some of each. If you are not responsible for the performance characteristics of the systems being measured in your MXG databases, then you need to find out who is and become their best friend. When changes are made to the ICS/IPS (compatibility mode) or the service definitions (goal mode) you need to know since that can affect the data being measured by MXG.

 

You may have a large number of CICS applications or database management systems that need to be measured as discrete workloads for capacity planning purposes.

What reports/information are expected by management?

SAS

 

Chapter 3. Managing SMF Data

How much data do you actually write?

To synch or not to synch - that is a question.

SMF interval recording

How large should the SYS1.MANx datasets be?

Dumping SMF data

IEFU29

Gaining efficiencies

Daily/weekly/monthly processing

 

Chapter 4. Installing MXG

Where should MXG run?

Installing the software

SOURCLIBs

FORMATs

Sizing the PDB

PDB

CICS Transaction data

DB2 Accounting data

CICS Statistics data

USERID.SOURCLIB

IMACSHFT - Shift Definitions

IMACACCT - Accounting Information

IMACWORK - Workloads

Compatibility Mode

Goal Mode

IMACUCB - Devices

IMACKEEP -

User SMF Records

SPINCNT

TIMEDIF

Dealing with CICS transaction data

UTILUOW

ASUMUOW

Chapter 5. Advanced MXG Topics

%LET logic in BUILDPDB

Using MACFILE

Using MACKEEP

Adding data sources to the PDB

Why?

How?

Removing data sources from the PDB

Why?

How?

Suppressing sections of code

Chapter 6. Weekly Processing

Weekly

Week-to-date

 

Chapter 7. Monthly Processing

Monthly

Month-to-date

 

Chapter 8. TREND Processing

Weekly

Daily

 

Chapter 9. Using VMXGSUM

One of the most common SAS programs is a data step followed by a sort, a PROC MEANS (or SUMMARY), and then another data step. Much of the data in the performance databases is stored in the form of rates or averages and the data must be normalized before it can be processed or the results will be invalid and misleading.

Consider the following scenario. You have 5 RMF intervals during which the data for TSO period 1 is as follows:

Interval

Transactions

Average Response

1

100

0.5

2

75

0.5

3

60

0.5

4

50

0.5

5

10

3.0

Obviously, the typical response time is around .5 seconds and equally obviously this may be a period when the number of transactions is declining and where there may have been a response problem during one of the periods. So what is the average response time for TSO period 1?

The quick answer is:

(4*.5+3)/5=1

but the correct answer is actually:

(100*.5+75*.5+60*.5+50*.5+10*3)/(100+75+60+50+10)=.58

Not exactly a trivial difference in the answer. The difference is that the first value is an average of the average values and the second is the average of the actual response times on a per transaction basis. We normalized the data in the second case.

To get this answer, the SAS program could be:

DATA TRIVTSO (KEEP=SYSTEM TRIVTRAN TRIVRESP);

SET PDB.RMFINTRV;

TRIVRESP=TRIVRESP*TRIVTRAN;

PROC SORT;

BY SYSTEM;

PROC MEANS NOPRINT;

BY SYSTEM;

VAR TRIVTRAN TRIVRESP;

OUTPUT OUT=TRIVSUM

SUM(TRIVTRAN TRIVRESP)=TRIVTRAN TRIVRESP;

DATA FINAL;

SET TRIVSUM;

TRIVRESP=TRIVRESP/TRIVTRAN;

The multiplication of TRIVRESP by TRIVTRAN in the first data step converts the average response time per transaction into the total response time for all transactions. In the second data step, the division of TRIVRESP by TRIVTRAN converts it back into the average per transaction response time.

Or if we use VMXGSUM we can get the same answer using:

%VMXGSUM(

INDATA=PDB.RMFINTRV,

OUTDATA=FINAL,

SUMBY=SYSTEM,

SUM=TRIVRESP TRIVTRAN,

NORM1=TRIVRESP/TRIVTRAN

);

In effect, VMXGSUM is a shorthand method of building the SAS program above. VMXGSUM is the heart and soul of the MXG TREND database and can be very useful in creating summary datasets from your PDBs for reporting purposes. So what exactly is VMXGSUM, how does it work, and how can it be used?

VMXGSUM is a large and complex SAS MACRO (there are actually four macros imbedded in the VMXGSUM member of the SOURCLIB but three are used only by VMXGSUM for parsing) that is driven by parameters to generate SAS code to do generalized summarization of SAS datasets. Like most MACROs, VMXGSUM is a program that writes programs based on what the user tells it. This particular MACRO is specifically designed to generate the program noted here. A data step, followed by a PROC SORT, a PROC MEANS, and a final data step. Along the way, variables that are stored as rates (things per second) or averages can be normalized so that the summarized data will correctly reflect the rates and averages.

This process is highly optimized and the minimal number of variables is kept in the smallest amount of space so that the process is highly efficient. In addition, if any phase of the process is not needed to accomplish the objective set, that step is bypassed. If there are no variables to be normalized, the first data step is bypassed. If no sort is needed it is bypassed. When running under version 7 of SAS, if no normalization is required the final data step can also be bypassed. This is a simplistic view since there are other actions that can cause these steps to be executed, but VMXGSUM can and will bypass unneeded processing.

VMXGSUM uses a series of PROC CONTENTS and small data steps to determine what variables exist in input datasets and which are required for further processing and builds KEEP= lists on these input datasets to minimize the WORK space and memory required. If OPEN=DEFER is specified (version 7 of SAS or higher) or the first input dataset is on tape, this process is bypassed for the first data step but subsequent datasets will have keep lists containing only the variables required.

The following table contains all of the parameters that can be used in VMXGSUM with their default values and purpose.

 

Parameter

Default

Value

Function

INDATA=

 

One or more input SAS datasets separated by spaces. This is just like the SET statement in the DATA step and the same operators are valid. You can use END= and OPEN=DEFER (V7 only) as well as KEEP/DROP lists and other dataset options.

OUTDATA=

 

The SAS dataset that will be the result of the summarization.

SUMBY=

 

A list of variables by which the data will be sorted and summarized

CLASS=

 

Normally, SUMBY= is used to control summarization but if you want to create a dataset with multiple levels of output summarization, you can use the CLASS= operand rather than the SUMBY and then test the state of the _TYPE_ variable in the OUTCODE= to control which observations are output to the final dataset.

DATETIME=

 

The variable which contains the SAS datetime variable that will be used to adjust the duration of the intervals as indicated by the INTERVAL= parameter.

INTERVAL=

NONE

This tells VMXGDUR what duration is expected. Valid values are:

QTRHOUR

HALFHOUR

HOUR

SHIFT

DATE

WEEK

MONTH

MYTIME

DROPDT=

NO

If DROPDT=YES is specified, the DATETIME variable that is created for building the duration is dropped in the final data step.

DURATM=

 

If DURATM=INTERVAL is specified AND the INTERVAL is QTRHOUR, HALFHOUR, or HOUR, a variable DURATM is created that will be equal to the duration. EG if INTERVAL=QTRHOUR and DURATM=INTERVAL is specified, the output dataset will contain a variable DURATM with a value of 900 (15 minutes.)

 

NEWSHIFT=

 

Create (or recreate) the SHIFT variable based on the contents of the variable specified by the DATETIME= operand before any duration calculations are made.

MXGWEEK=

MON

The day of the week on which you want your ‘WEEK’ to start.

TIMERNGE=

 

A variable (datetime) that can be used to calculate the time range of the input datasets. Four macro variables are created that will be available after the first data step is complete that contain the time period covered by the input data.

MAXINDT = Maximum value in the input data set

MININDT = Minimum value in the input data set

MAXSLDT = Maximum value output in the first data step

MINSLDT = Minimum value output in the first data step

MYTIME=

 

Lines of SAS code that can be used to adjust the time period when you specify INTERVAL=MYTIME.

INVOKEBY=

 

An optional string that gets printed on the SASLOG to tell you when and why you invoked VMXGSUM. MXG will always tell you what member caused the invocation of VMXGSUM using this operand.

KEEPALL=

NO

By default, VMXGSUM figures out what variables should be kept in the input dataset(s). This minimizes the amount of storage required for processing. If you know that the minimum variables are all that is in the input dataset or the input datasets are small, you may be able to save a small amount of overhead by bypassing the logic that performs this function by specifying KEEPALL=YES.

KEEPIN=

 

A list of variables that need to be kept even if VMXGSUM doesn’t think they should. An example would be a case where you need to do selection on a variable in the INCODE= processing that is not in any of the other lists of variables. Say you wanted to summarize all of the data for system SYS1 by STARTIME. Your invocation might look like:

%VMXGSUM(INDATA=PDB.RMFINTRV,

OUTDATA=SYS1SUM,

SUMBY=STARTIME,

KEEPIN=SYSTEM,

INCODE=IF SYSTEM=:’SYS1’;, ...

The KEEPIN holds the SYSTEM variable so that it is available for the INCODE processing to limit the data.

DSNLABEL=

 

A dataset label that will be attached to the output dataset.

NOSORT=

NO

NOSORT=YES will bypass the SORT step. If you used a SUMBY=, it is up to you to be sure that the data is sorted before charging ahead.

ERASEOUT=

NO

Sometimes the output dataset is being written out to a SAS data library where that dataset already exists and (in this instance) there must be enough space in the data library to contain two full copies of the dataset. In general, the TRNDxxxx members of MXG function this way. If the dataset is large, space may be a problem so this option exists to cause the erasure of the original dataset before writing the new one thus allowing the new dataset to use the space vacated by the old version. There are three possibilities:

NO - Don’t delete the dataset.

YES - Nuke it until it twinkles

XXXXXXXX - Back the dataset up to DDNAME XXXXXXXX and then delete the target dataset just prior to creating the target.

If you must use this operand, option 3 is strongly recommended.

TEMP01=

 

VMXGSUM can create up to three intermediate datasets. MXGSUM1 from the first data step, MXGSUM2 from the SORT, and MXGSUM3 from the PROC MEANS. This option controls the destination of MXGSUM1 and TEMP02 and TEMP03 control the destinations of MXGSUM2 and MXGSUM3 respectively. If space is a problem, this provides a way to have up to three different WORK files! VMXGSUM deletes MXGSUM1 MXGSUM2 and MXGSUM3 when they are no longer needed.

TEMP02=

 

See TEMP01

TEMP03=

 

See TEMP01

MEANOPT=

 

PROC MEANS options

ORDER=

 

This exit allows you to reorder the variables in the output dataset. You may want to have the variables in alphabetic order rather than in the order of creation or you might have some other sequence in mind. In either case, while this would normally be done with a LENGTH statement, that could cause corruption of data values since VMXGSUM is already manipulating lengths. A LABEL statement is a much safer choice if you need to use this option.

NODUP=

 

We assume that duplicate data has already been purged from the incoming datasets but if you are not sure, you can force the NODUP option on the sort by specifying NODUP=NODUP. Because you may create dupes by removing the variables that created uniqueness, NODUP is not enabled as the default.

 

INCODE=

 

A piece of SAS code that allows manipulation of the input datasets before sorting and summarization. Along with INCODE2= and INCODE3=, this can be used to perform selection and calculations against variables. A typical use is to create new variables to contain the maximum values of other variables. INCODE= is located ahead of the normalization of variables.

INCODE1=

 

A continuation of INCODE=. You may sometimes hit limits on the size of a MACRO argument and this is a circumvention to allow INCODE= to be larger.

INCODE2=

 

SAS code executed AFTER the variables in the NORMx lists have been normalized.

OUTCODE=

 

You may also need to be able to manipulate data on the output side before the final code is created. Just like INCODE= allows you to do that on the INPUT side, OUTPUT= allows it on the OUTPUT side. This exit is located just after the unnormalization of variables.

OUTCODE1=

 

A continuation of OUTCODE=.

OUTCODE2=

 

More output code but located before the unnormalization of variables.

MEAN=

 

A list of variables for which the MEAN should be calculated

MIN=

 

A list of variables for which the MINIMUM should be calculated

MAX=

 

A list of variables for which the MAXIMUM should be calculated

MINTIME=

 

Same as MIN= but 8 byte variables (MIN variables will be 4 bytes)

MAXTIME=

 

Same as MAX= but 8 byte variables

SUM=

 

A list of variables for which the SUM should be calculated

SUMLONG=

 

Same as SUM= but 8 byte variables

FREQ=

 

A variable that will contain the number of observations in the input data that made up the BY group.

NORM1=

NORM2=

...

NORM99=

 

Normalization of data. From 0 to 99 sets of variables where the list is composed of variables that need to be normalized followed by a / and then the variable by which they should be normalized. For example, if the variable TRIVRESP is the average response time for the TSO transactions represented by TRIVTRAN, then the normalization would be:

NORM1=TRIVRESP/TRIVTRAN,

In the first data step, the statement TRIVRESP = TRIVRESP * TRIVTRAN is generated and in the last data step, this is reversed after the summarization with TRIVRESP = TRIVRESP / TRIVTRAN.

The variables involved must ALSO appear in the SUM= list or the results will be unpredictable.

 

ID=

 

A list of variables for which the ID value is carried forward into the final dataset. In general, this will be the value of the variable in the first observation of the BY group.

AUTONAME=

NO

Prior to version 7 of SAS, all variables referenced in any of the statistical operands (SUM= MIN= MEAN= etc.) had to be created in the INCODE= if they did not already exist. With version 7, the option was added to PROC MEANS to automatically create new variables where the name is the same as the original variable name suffixed with _stat. So if you specified SUM=CPUTM, MEAN=CPUTM with AUTONAME=YES specified, you would have variables CPUTM_SUM and CPUTM_MEAN in the output dataset. MXG will not use long variable names in the foreseeable future but the options is provided for your convenience.

P1=

 

A list of variables for which percentile 1 should be calculated

P5=

 

A list of variables for which percentile 5 should be calculated

P10=

 

A list of variables for which percentile 10 should be calculated

P25=

 

A list of variables for which percentile 25 (quartile 1) should be calculated

P50=

 

A list of variables for which percentile 50 (quartile 2 or median) should be calculated

P75=

 

A list of variables for which percentile 75 (quartile 3) should be calculated

P90=

 

A list of variables for which percentile 90 should be calculated

P95=

 

A list of variables for which percentile 95 should be calculated

P99=

 

A list of variables for which percentile 99 should be calculated

STD=

 

A list of variables for which the standard deviation should be calculated

VAR=

 

A list of variables for which the variance should be calculated

CV=

 

A list of variables for which the coefficient of variation should be calculated

STDERR=

 

A list of variables for which the standard error should be calculated

KURTOSIS=

 

A list of variables for which Kurtosis should be calculated

T=

 

A list of variables for which Student’s t should be calculated

Some general rules for use:

Parameters are delimited by commas (except the last parameter in the list) and surrounded by parentheses. SAS statements in the INCODE OUTCODE or MYTIME must be valid and bounded with appropriate semi-colons.

For SAS versions earlier than version 7 and for version 7 unless the AUTONAME=YES option is used, a variable name can appear in only one list except for the NORM lists.

If multiple statistics are desired for the same variable, you must create a new variable for each statistic desired using the INCODE parameter (except when the AUTONAME=YES options is used with SAS version 7 and higher) and the new variable must be set equal to the old variable. For example, if you wanted the MIN, MAX, SUM, and MEAN of the variable CPUTM you would code:

...

INCODE=

MINCPU=CPUTM;

MAXCPU=CPUTM;

MEANCPU=CPUTM;

LABEL MINCPU=’MINIMUM*CPU*TIME’

MAXCPU=’MAXIMUM*CPU*TIME’

MEANCPU=’AVERAGE*CPU*TIME’;,

MIN=MINCPU,

MAX=MAXCPU,

MEAN=MEANCPU,

SUM=CPUTM, ...

Examples of VMXGSUM Usage:

Example 1 - Summarize with Interval Processing and Normalization

Create a report of average and maximum percent busy by system and hour of day.

%VMXGSUM(

INDATA=PDB.RMFINTRV,

OUTDATA=CPUBUSY,

SUMBY=SYSTEM DATETIME,

DATETIME=STARTIME,

INTERVAL=HOUR,

INCODE=MAXCPU=PCTCPUBY;

LABEL MAXCPU=’Max %*CPU*Busy’;,

SUM=PCTCPUBY DURATM,

MAX=MAXCPU,

NORM1=PCTCPUBY/DURATM

);

PROC PRINT DATA=CPUBUSY SPLIT=’*’;

BY SYSTEM;

ID SYSTEM;

VAR STARTIME PCTCPUBY MAXCPU;

TITLE1 ‘MAXIMUM and AVERAGE PERCENT CPU BUSY’;

In this example, PCTCPUBY is a function of the duration of the RMF interval so PCTCPUBY must be normalized by DURATM to get the correct answer. The variable MAXCPU is created in the INCODE and then the maximum value is found. To take the summarization to the hourly level, we have to tell VMXGSUM that the beginning of each RMF interval is the variable STARTIME with the DATETIME= operand and then tell it to turn this value into an HOUR rather than the smaller intervals present in RMFINTRV. Note that in the SUMBY= we specify the variable DATETIME rather than the variable STARTIME. DATETIME is created by VMXGSUM to contain intermediate datetime values. In the final data step, STARTIME will be set back to the value in the DATETIME variable for that observation. In this instance, the DATETIME variable will still exist in the output dataset as well but it could be dropped by specifying DROPDT=YES.


Example 2 - Summarize with Selection

Summarize the JOBS dataset by JOBCLASS. Calculate input queue time and find the mean of the input queue time and the total elapsed time and provide a count of the number of jobs executed in each class. Summarize only jobs that have completed execution. Sum the CPUTM, EXCPTOTL, and IOTMTOTL variables.

%VMXGSUM(

INDATA=PDB.JOBS,

OUTDATA=JOBCLASS,

SUMBY=JOBCLASS,

KEEPIN=INBITS READTIME JINITIME,

INCODE=

IF SUBSTR(INBITS,2,2)=:’SJ’; /* Completed jobs */

QUEUE=JINITIME-READTIME; /*input queue time */

FORMAT QUEUE TIME12.2;,

MEAN=QUEUE SELAPSTM, /* Average values */

SUM=CPUTM EXCPTOTL IOTMTOTL, /* SUMs */

FREQ=NUMJOBS, /* Count the number of jobs */

OUTCODE=

LABEL NUMJOBS=’Number*of*jobs’

QUEUE=’Input*Queue*Time’;

);

PROC PRINT DATA=JOBCLASS SPLIT=’*’;

BY JOBCLASS;

ID JOBCLASS:

VAR NUMJOBS QUEUE SELAPSTM CPUTM EXCPTOTL IOTMTOTL;

In this example, the variables INBITS, READTIME, and JINITIME appear only in the INCODE= and are therefore invisible to the KEEP logic in VMXGSUM so must be named in a KEEPIN= statement. In the INCODE=, we calculate the QUEUE time and keep only those observations with an SJ in positions 2 and 3 of the INBITS string. The average values of QUEUE and SELAPSTM are derived using the MEAN= operand, the sum of CPUTM, EXCPTOTL, and IOTMTOTL using the SUM=, and the number of jobs is counted using the FREQ= operand. In the OUTCODE=, a LABEL is assigned to the variables NUMJOBS and QUEUE.

Example 3 - Summarize with Interval Processing

Summarize the ASUMUOW dataset for transaction MXG* only finding the MIN, MAX, average, Standard Deviation, and the 95th percentile or the response time as well as the number of transactions by hour.

Pre-V7 version: (Note that the 95th percentile cannot be calculated prior to V7 of SAS)

%VMXGSUM(INDATA=PDB.ASUMUOW,

OUTDATA=MXGSUM,

SUMBY=DATETIME,

INTERVAL=HOUR,

DATETIME=STRTTIME,

ID=STRTTIME,

DROPDT=YES,

KEEPIN=TRANNAME,

INCODE=MAXRESP=IRESPTM;

MINRESP=IRESPTM;

STDDEV=IRESPTM;

IF TRANNAME=:’MXG’;,

FREQ=NUMTRANS,

MAX=MAXRESP,

MIN=MINRESP,

STD=STDDEV,

MEAN=IRESPTM,

OUTCODE=

LABEL MAXRESP =’Maximum*Response*Time’

MINRESP =’Minimum*Response*Time’

STDDEV =’Standard*Deviation*Response’

NUMTRANS =’Number*of*Transactions’

IRESPTM =’Average*Response*Time’;

);

PROC PRINT DATA=MXGSUM SPLIT=’*’;

BY STRTTIME;

ID STRTTIME;

VAR NUMTRANS IRESPTM MINRESP MAXRESP STDDEV;

 

V7 version:

%VMXGSUM(INDATA=PDB.ASUMUOW,

OUTDATA=MXGSUM,

SUMBY=DATETIME,

INTERVAL=HOUR,

ID=STRTTIME,

DATETIME=STRTTIME,

DROPDT=YES,

KEEPIN=TRANNAME,

INCODE=

IF TRANNAME=:’MXG’;,

FREQ=NUMTRANS,

MAX=IRESPTM,

MIN=IRESPTM,

STD=IRESPTM,

P95=IRESPTM,

MEAN=IRESPTM,

AUTONAME=YES

);

PROC PRINT DATA=MXGSUM SPLIT=’*’;

BY STRTTIME;

ID STRTTIME;

VAR NUMTRANS IRESPTM_MEAN IRESPTM_MIN IRESPTM_MAX IRESPTM_STD IRESPTM_P95;

LABEL IRESPTM_MAX =’Maximum*Response*Time’

IRESPTM_MIN =’Minimum*Response*Time’

IRESPTM_STD =’Standard*Deviation*Response’

IRESPTM_P95 =’Percentile 95*Response*Time’

NUMTRANS =’Number*of*Transactions’

IRESPTM_MEAN =’Average*Response*Time’;

In this example, we are able to exploit several features of VMXGSUM. The INTERVAL, DATETIME, and DROPDT parameters are all used to manipulate the datetime value of STRTTIME (the time the transaction started) and convert it to the HOUR in which the transaction started. The INCODE is used to exclude all transactions except those starting with the string MXG and the OUTCODE (in the pre-V7 version) is used to assign labels and formats to the variables created in the INCODE to hold the MIN, MAX, and standard deviation of the IRESPTM variable.

Using version 7 of SAS, we are able to avoid the need in the INCODE to create new variables by using AUTONAME=YES and we are also able to avoid executing the final data step by moving the LABEL statement from the OUTCODE to the PROC PRINT that follows the execution of VMXGSUM. Note the long variable names created by this execution of VMXGSUM. Each is the original variable name suffixed by _statistic where statistic is the keyword for the generated statistic. Also note that there is no FORMAT statement used for these generated variables. The INHERIT option in PROC MEANS causes the attributes of the orginal variable to be carried forward to the newly generated variables.

Example 4. Trending

Build a TREND dataset from the SMFINTRV dataset on the weekly PDB. Set the interval to WEEK and summarize by SYSTEM JOB SHIFT and INTBTIME. Recalculate the SHIFT if the unTRENDed data is being read. Sum the CPUTM, IOTMTOTL, and EXCPTOTL and build a variable containing the total tape mounts for each task.

%VMXGSUM(

INDATA=WEEK.SMFINTRV (IN=INWEEK) TREND.TRNDSMFI,

OUTDATA=TREND.TRNDSMFI,

DATETIME=INTBTIME,

INTERVAL=WEEK,

ID=INTBTIME,

DROPDT=YES,

SUMBY=SYSTEM JOB SHIFT INTBTIME,

INCODE=

IF INWEEK THEN DO;

DATETIME=INTBTIME;

%INCLUDE SOURCLIB(IMACSHFT);

TAPEMNTS=SUM(TAPNMNTS,TAPSMNTS,0);

END;,

KEEPIN=TAPNMNTS TAPSMNTS,

SUM=CPUTM IOTMTOTL EXCPTOTL TAPEMNTS,

OUTCODE=

LABEL TAPEMNTS=’Total*Tape*Mounts’;

);

This example is typical of the MXG TRND members. Both the INDATA and the OUTDATA point to the same TREND.TRNDxxxx member and the INDATA also points to the weekly dataset that is to be summarized into the TREND database. This demonstrates the use of multiple input datasets to VMXGSUM as well as demonstrating the use of dataset options on the input datasets (IN=INWEEK).

In the INCODE, we detect that the input observation is from the WEEK.SMFINTRV dataset and build the SHIFT variable from the INTBTIME variable as well as calculating the total number of tape mounts by summing the TAPSMNTS and TAPNMNTS. TAPSMNTS and TAPNMNTS must also be specified in the KEEPIN statement since they appear in not other lists in the VMXGSUM invocation and would otherwise be dropped from the input datasets.

 

Example 5 - Summarizing a summarized dataset

Using the dataset created in example 4, re-summarize to the weekly level and print a report.

%VMXGSUM(

INDATA=TREND.TRNDSMFI,

OUTDATA=TRNDSMFI,

SUMBY=SYSTEM JOB INTBTIME,

KEEPALL=YES,

SUM=CPUTM IOTMTOTL EXCPTOTL TAPEMNTS

);

PROC PRINT DATA=TRNDSMFI SPLIT=’*’;

BY SYSTEM JOB;

ID SYSTEM JOB;

FORMAT INTBTIME DATETIME7.;

VAR INTBTIME CPUTM IOTMTOTL EXCPTOTL TAPEMNTS;

In this example we exploit knowledge of the input dataset to optimize processing. Because the data has already been passed through VMXGSUM, we know that the number of variables has already been cut to the minimum required for the summarization level. In this instance, a single variable (SHIFT) is not required for this execution and the KEEP logic would save only the space for this 1 byte variable per observation. Specifying KEEPALL=YES bypasses the logic in VMXGSUM that builds the KEEP lists on input datasets. Further optimization is obtained since the lack of INCODE and OUTCODE processing eliminates the need for the first and last data steps (version 7 of SAS only for the final data step).

Because the data is summarized at the WEEK level, the FORMAT of DATETIME7 for the INTBTIME variable prints this DATETIME variable as only the DATE value.

 

 

 

Chapter 10. Using ANALCNCR

How many tape drives are in use at one time? How many batch jobs are running in each job class? Common questions for the CPE analyst but how do you answer them?

In early releases of MXG,

 

Chapter 11. PC Topics

SAS on the PC offers the availability of high resolution graphics devices and the ability to move pictures of data from SAS into other software for reporting and presentation purposes. In addition to the flexibility in formatting reports and graphs, the components of SAS for the PC are in general considerably less expensive on the PC than on the mainframe.

So, if the PC is a less expensive alternative but processing the raw data is impractical on the PC, how do you get from here to there? One answer that many sites are using is to license only base SAS on the mainframe (or base SAS and SAS/CONNECT) and to license the other desired parts of SAS on the PC. This leaves only the issue of moving the decoded data from the mainframe to the PC.

There are two methods of accomplishing this task. SAS data can be moved between platforms using the EXPORT engine or by using SAS/CONNECT. While it is fairly safe to say that a SAS dataset created with Windows 95 or 98 is usable by SAS on an NT or OS2 platform, the same is not necessarily true of other platforms and especially with the mainframe, it is absolutely necessary to go through some intermediate steps.

SAS/CONNECT is the preferred means of moving data from the mainframe to the PC. Using SAS/CONNECT, for all practical intents and purposes, a mainframe SAS data library can become an extension of the hard drive on your PC. SAS/CONNECT uses TCP/IP and TN3270 to establish a line mode TSO session and then a SAS session on the mainframe and ties the SAS session on the mainframe to a SAS session on the PC.

The use of SAS CONNECT requires some changes in the way MXG and SAS are used. On the mainframe side, you will want a separate CLIST that points to different CONFIG and VMXGINIT members and on the PC side you will want different AUTOEXEC.SAS and CONFIG members as well. In addition, on the PC side a script is needed to invoke the SAS/CONNECT software and to establish the SAS session on the mainframe. This script goes through the TSO logon process, drops out of ISPF if needed, and starts the SAS CLIST on the host. Samples of all of these members are contained in the appendices.

To use a SAS data library on the mainframe, it is simply a matter of issuing the appropriate LIBNAME commands. Assume that the name of the TN3270 server is TN3270 and that your PDB is MXG.PDB. To allocate the PDB to your PC SAS session (after the SAS/CONNECT session is established) you simply need to issue the command:

LIBNAME PDB REMOTE ‘MXG.PDB’ SERVER=TN3270;

Issuing this LIBNAME command to a PC SAS session where a SAS CONNECT session has been established causes the MVS dataset MXG.PDB to be allocated to the PC SAS session as the LIBNAME PDB. So, it can be referenced as if it were on the hard drive of the PC in a data

step. For example, to read the JOBS dataset in the PDB, the set statement would be:

SET PDB.JOBS;

Just as it would be if the dataset were local to the PC.

The drawback to this method is that the allocation is with an implied disposition of OLD meaning other people cannot be concurrently accessing the PDB and that may be an unacceptable situation. While the LIBNAME command for MVS is aware of and allows the use of DISP=SHR, the PC version of the command is not aware of this option. To circumvent this problem, there is a relatively simple option. Issue the LIBNAME command on the MVS side with the DISP=SHR specified and then use a slightly different format of the LIBNAME command on the PC side of the connection.

To utilize this convention, you can either imbed the LIBNAME statements for the libraries you wish to have allocated in the VMXGINIT member or you can issue the LIBNAME command using the RSUB (remote submission) command of SAS/CONNECT. In either case, the format of the command is:

LIBNAME PDB ‘MXG.PDB’ DISP=SHR;

Alternatively, the allocation could be done in the CLIST that invokes SAS if you know that for every invocation of SAS/CONNECT there are a fixed set of SAS data libraries you wish to have allocate.

Regardless of the technique used to allocate the dataset on the MVS side of the connection, the syntax on the PC side of the connection then becomes:

LIBNAME PDB SLIBREF=PDB SERVER=TN3270;

A major drawback to using SAS/CONNECT on an MVS system is that the nature of the beast is that the CLIST is treated as a single TSO transaction and can quickly drop through the periods defined for TSO performance into the lowest possible priority for a TSO session. In the case where a system is fully utilized, the performance of the mainframe side of the SAS/CONNECT session may be less than wonderful.

What? Your management doesn’t want to shell out the thousands of dollars needed for a SAS/CONNECT license on the mainframe? You are not alone and all is not lost! There is still a way to get from point A (the mainframe) to point B (the PC).

The EXPORT engine of SAS can be used to create a SAS dataset in EXPORT form that can then be read by SAS on any other supported platform. This of course rests on the assumption that a method of moving the data between platforms does exist. This could be FTP or just IND$FILE. Mounting a 3490 tape on your PC is not a practical solution for most of us.

There are two ways to use the EXPORT engine. Via the ENGINE command on the LIBNAME or by using PROC CPORT/CIMPORT. It is a toss-up as to which is easiest but the PROC CPORT may be less obscure. In either case, the download of the data must be binary. An ASCII to EBCDIC conversion will cause erroneous results.

To copy the PDB data library to the EXPORT DDNAME using the LIBNAME convention the following statements are used:

LIBNAME EXPORT XPORT; /* XPORT TELLS SAS TO USE THE XPORT ENGINE */

PROC COPY IN=PDB OUT=EXPORT;

To accomplish the same task using PROC CPORT, code the following:

PROC CPORT LIB=PDB FILE=EXPORT;

In either case the resulting file must be downloaded to the PC. Assume that the file is downloaded as C:\PDB.XPT. The command to put the file back into native SAS format with the LIBNAME syntax would be:

LIBNAME PDB ‘C:\MXG\PDB’;

LIBNAME EXPORT ‘C:\PDB.XPT’ XPORT;

PROC COPY IN=EXPORT OUT=PDB;

Using the CPORT/CIMPORT method, the equivalent method is:

LIBNAME PDB ‘C:\MXG\PDB’;

FILENAME EXPORT ‘C:\PDB.XPT’;

PROC CIMPORT FILE=EXPORT LIB=PDB;

Once the data has been converted back to tIn either case the resulting file must be downloaded to the PC. Assume that the file is downloaded as C:\PDB.XPT, then the command to put the dataset back into a nativeSAS format

 

 

 

Chapter 12. Reporting to Management

Appendices:

Pre-installation Checklist

Item

Answer

Date

Is SAS Installed?

Version

MVS

PC

Dataset Names

PROC Name

CLIST Name

What SAS products on MVS?

What SAS products on PC?

 

 

What

   

Where is SAS

datasets)

   

Where is SAS (CLIST)

   
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

 

IMACSHFT Worksheet

Shift

Value

Description

Begin

Time

End

Time

Days of

Week

Specific

Date

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       
 

 

 

 

       

 

 

IMACWORK Worksheet

MXG

Workload

Name

Workload

Description

Compatibility

Mode

Performance

Groups

Goal

Mode

Service

Classes

BATCH

 

 

 

   

TSO

 

 

 

   

CICS

 

 

 

   

IMS

 

 

 

   

OTH0

 

 

 

   

OTH1

 

 

 

   

OTH2

 

 

 

   

OTH3

 

 

 

   

OTH4

 

 

 

   

 

 

OTH5

 

 

 

   

OTH6

 

 

 

 

   

OTH7

 

 

 

   

OTH8

 

 

 

   

OTH9

 

 

 

   

OTHR

 

 

 

   

 

 

IMACACCT Worksheet

Accounting

Field

Purpose

Length

Keep in

Jobs

Keep in

Steps

ACCOUNT1

 

     

ACCOUNT2

 

     

ACCOUNT3

 

     

ACCOUNT4

 

     

ACCOUNT5

 

     

ACCOUNT6

 

     

ACCOUNT7

 

     

ACCOUNT8

 

     

ACCOUNT9

 

     

 

 

IMACUCB Worksheet

Beginning

Address

Ending

Address

Type of Device

Device Name

to Use

 

 

   
 

 

 

   
   

 

 

 
 

 

 

   
 

 

 

   

 

 

     

 

 

     

 

 

     

 

 

     

 

 

     
 

 

 

   
 

 

 

   
 

 

 

   
 

 

 

   
 

 

 

   

 

 

User SMF Record Worksheet

User

SMF
Record

ID

 

 

Type/Vendor

MXG

Code

Include in PDB?

 

 

   
 

 

 

   

 

 

     
 

 

 

   
 

 

 

   
 

 

 

   
 

 

 

   
 

 

 

   
 

 

 

   

 

 

Sample SMFPRMxx member

ACTIVE /* ACTIVE SMF RECORDING */

DSNAME(SYS1.MAN1,SYS1.MAN2,SYS1.MAN3) /* THREE DATA SETS */

LISTDSN /* LIST DSN AT IPL */

SID(xxxx) /* YOUR SYSTEM ID */

REC(PERM) /* TYPE 17 PERM RECORDS */

MAXDORM(0500) /* WRITE IDLE AFTER 05M */

STATUS(SMF,SYNC) /* WRITE STATS EVERY 15M */

JWT(0014) /* 522 AFTER 14 MINUTES */

SYNCVAL(00) /* SYNC TO HOUR */

INTVAL(15) /* 15 MINUTE INTERVALS */

DDCONS(NO) /* DON'T CONSOL T30 EXCP */

NOPROMPT /* DONT PROMPT OPERATOR */

DUMPABND(NORETRY) /* DEFAULT RETRY */

NOBUFFS(MSG) /* DEFAULT TO MESSAGE */

LASTDS(MSG) /* DEFAULT TO MESSAGE */

SYS(NOTYPE(4,5,16,19,34,35,40,69),

EXITS(IEFU83,IEFU84,IEFACTRT,IEFUJV,IEFUSI,IEFUJI,IEFUTL,

IEFU29,IEFUJP),

NOINTERVAL,NODETAIL)

SUBSYS(STC,EXITS(IEFU29,IEFU83,IEFU84,IEFACTRT,IEFUJP,IEFUSO),

INTERVAL(SMF,SYNC))

SUBSYS(OMVS,EXITS(IEFU29,IEFU83,IEFU84,IEFACTRT,IEFUJP,IEFUSO),

INTERVAL(SMF,SYNC))

 

Sample ERBRMF00 member

/*********************************************************************/

/* PART 1: MEASUREMENTS */

/*********************************************************************/

CHAN /* CHANNEL STATISTICS */

CACHE /* CACHE RMF REPORTER */

CPU /* CPU STATISTICS */

DEVICE(DASD) /* DIRECT ACCESS DEVICES MEASURED */

DEVICE(TAPE) /* MEASURE TAPE DEVICES */

DEVICE(NOCHRDR) /* NO CHARACTER READER DEVICES MEASURED */

DEVICE(NOUNITR) /* NO UNIT RECORD DEVICES MEASURED */

DEVICE(NOCOMM) /* NO COMMUNICATION DEVICES MEASURED */

DEVICE(NOGRAPH) /* NO GRAPHICS DEVICES MEASURED */

DEVICE(NMBR(40A0,40A1,50A0,50A1)) /* CF measurements */

DEVICE(NOSG) /* NO SELECTION BY STORAGE GROUPS */

ENQ(DETAIL) /* DETAILED ENQUEUE REPORT */

IOQ(DASD) /* DASD I/O QUEUEING MEASURED */

IOQ(TAPE) /* TAPE I/O QUEUEING MEASURED */

IOQ(NOCHRDR) /* NO CHARACTER READER I/O QUEUEING */

IOQ(NOUNITR) /* NO UNIT RECORD DEVICE I/O QUEUEING */

IOQ(NOCOMM) /* NO COMMUNICATION I/O QUEUEING */

IOQ(NOGRAPH) /* NO GRAPHICS DEVICE I/O QUEUEING */

IOQ(NMBR(40A0,40A1,50A0,50A1)) /* CF Measurements */

PAGESP /* PAGE/SWAP DATASET STATISTICS */

PAGING /* PAGING DATA */

TRACE(RCVAFQA,ALL) /* AVERAGE AVAILABLE FRAME COUNT */

TRACE(RCVUICA,ALL) /* AVERAGE UNREF. INTERVAL COUNT */

TRACE(RMCARSSC,ALL) /* CENTRAL STORAGE SHORTAGE SWAPS */

VSTOR(S) /* VIRTUAL STORAGE SUMMARY DATA */

WKLD(PERIOD,SYSTEM) /* WORKLOAD MANAGER DATA BY PERIOD */

/*****************************************************************/

/* PART 2: TIMING */

/*****************************************************************/

CYCLE(0500) /* SAMPLE TWICE PER SECOND */

NOSTOP /* ACTIVE UNTIL OPERATOR ISSUES STOP*/

SYNC(SMF) /* SYNC INTERVAL */

/*********************************************************************/

/* PART 3: REPORTING / RECORDING OF DATA */

/*********************************************************************/

NOOPTIONS /* OPTIONS NOT DISPLAYED, NO REPLY */

RECORD /* WRITE SMF RECORDS EVERY INTERVAL */

NOREPORT /* NO WRITTEN REPORTS TO SYSOUT */

SYSOUT(U) /* REPORTS TO CLASS U, IF REPORT */

/*****************************************************************/

/* PART 4: USER EXITS (ALSO USED BY CACHE REPORTER OFFERING) */

/**************************************************************/

NOEXITS /* DO NOT TAKE USER EXITS */

 

Sample ERBRMF04 (Monitor 3) Member

CYCLE(1000) /* SAMPLE EVERY SECOND (1000 MSEC) */

DATASET(ADD(SYS1.&SYSNAME..RMFMON3A)) /* DATASET 1 */

DATASET(ADD(SYS1.&SYSNAME..RMFMON3B)) /* DATASET 2 */

DATASET(ADD(SYS1.&SYSNAME..RMFMON3C),SWITCH) /* DATASET 3 */

DATASET(START) /* NO DATASET SUPPORT */

DATASET(WHOLD(7)) /* CONTROLS BUFFER PAGES IN STORAGE */

MINTIME(60) /* LENGTH OF MINTIME */

NOOPTIONS /* DO NOT DISPLAY OPTIONS */

RESOURCE(*JES2,JES2) /* SPECIFIES JES STARTED TASK NAME */

NOSTOP /* RUN UNTIL OPERATOR ISSUES STOP */

SYNC(00) /* MINTIME SYNCHRONIZATION */

SYSOUT(7) /* MESSAGES TO SYSOUT CLASS A */

WSTOR(32) /* SIZE OF INSTORAGE BUFFER (IN MB) */

IOSUB /* I/O SUBSYSTEM GATHERING ACTIVE */

 

Sample SMFDUMP JCL and Parameters

//STEP1 EXEC PGM=IFASMFDP

//DUMPIN DD DSN=SYS1.MANx,DISP=SHR,AMP=(‘BUFND=46’)

//DUMPOUT DD DSN=SMF.DUMP,DISP=(,CATLG,DELETE),

// SPACE=(CYL,(100,50)),DSORG=PS,LRECL=X,BLKSIZE=0,

// RECFM=VBS,DATACLAS=STRIPED

//DB2 DD DSN=SMF.DB2.DUMP,DISP=(,CATLG,DELETE),

// SPACE=(CYL,(100,50)),DSORG=PS,LRECL=X,BLKSIZE=0,

// RECFM=VBS,DATACLAS=STRIPED

//STATRECS DD DSN=SMF.CICSSTAT.DUMP,DISP=(,CATLG,DELETE),

// SPACE=(CYL,(100,50)),DSORG=PS,LRECL=X,BLKSIZE=0,

// RECFM=VBS,DATACLAS=STRIPED

//CICSTRAN DD DSN=SMF.CICSTRAN.DUMP,DISP=(,CATLG,DELETE),

// DSORG=PS,LRECL=X,BLKSIZE=0,UNIT=3490,

// RECFM=VBS,DATACLAS=STRIPED

//SYSPRINT DD SYSOUT=*

//SYSIN DD *

INDD(DUMPIN,OPTIONS(ALL))

OUTDD(DUMPOUT,NOTYPE(100:102,110))

OUTDD(DB2,TYPE(100:102))

OUTDD(STATRECS,TYPE(110(2)))

OUTDD(CICSTRAN,TYPE(110(1)))

SAS/CONNECT CLIST for MXG

PROC 0 +

ENTRY (SASHOST) /* Entry point name */ +

CONFIG () /* User CONFIG file DSN */ +

SASUSER () /* SASUSER file DSN */ +

AUTOEXEC () /* User AUTOEXEC DSN */ +

SASAUTOS () /* User SASAUTOS DSN */ +

LOAD () /* User load library DSN */ +

/* --------ALLOW ALTERNATE DDNAMES ---------------------- */ +

DDCONFIG () DFCONFIG(CONFIG) /* CONFIG= file DDname */ +

DDSASUSR () DFSASUSR(SASUSER) /* SASUSER= data lib DDname */ +

DDAUTOEX () DFAUTOEX(SASEXEC) /* AUTOEXEC= file DDname */ +

DDSASAUT () DFSASAUT(SASAUTOS)/* SASAUTOS= library DDname */ +

DDPARMCD () DFPARMCD(SASPARM) /* PARMCARDS= file DDname */ +

DDWORK () DFWORK (WORK) /* WORK= data lib DDname */ +

DDSYSIN () DFSYSIN (SYSIN) /* SYSIN= file DDname */ +

DDLOG () DFLOG (SASLOG) /* LOG= file DDname */ +

DDPRINT () DFPRINT (SASLIST) /* PRINT= file DDname */ +

DDSASMSG () DFSASMSG(SASMSG) /* SASMSG= library DDname */ +

DDSASHLP () DFSASHLP(SASHELP) /* SASHELP= data lib DDname */ +

OPTIONS () /* SAS options */ +

PARMCARD(1) /* parmcard file size */ +

UNITS (CYL) /* alloc unit for LOG, PARMS */ +

WORK ('500,200') /* WORK data lib size in blks*/ +

INPUT (*) /* SAS source i/p DSN */ +

LOG (*) /* SAS log DSN/size */ +

PRINT (*) /* SAS list DSN */ +

BLOCK (264) /* PRINT BLOCKSIZE */ +

LRECL (260) /* PRINT LRECL */ +

SASLOAD (''SAS.LIBRARY''') /* SAS load library DSN */ +

SASMSG ('''SAS.SASMSG''') /* SAS message library DSN */ +

SASHELP ('''SAS.SASHELP''') /* SAS catalog library DSN */ +

MAUTS ('''SAS.AUTOLIB''') /* SAS macro source DSN */ +

SORTLINK(*) /* put system sort lib in */ +

/* STEPLIB? * => No */ +

SORTLDSN('''SYS1.SORT.LINKLIB''') /* system sort library DSN*/ +

GO /* Continue previous session?*/ +

FLUSH NOFLUSH /* Flush stack if error? */ +

STAE NOSTAE /* Trap main task abends? */ +

STAI NOSTAI /* Trap subtask abends? */ +

STAX NOSTAX /* Trap attentions? */ +

STACK NOSTACK /* Create new i/p stack? */ +

SHARE NOSHARE /* Share subpool 78 */ +

TRACE /* CLIST debugging */

/*

/*--------------------------------------------------------------

/* Enable clist debugging options

/*--------------------------------------------------------------

/*

IF &TRACE NE THEN +

CONTROL LIST CONLIST SYMLIST

CONTROL ASIS

/*

/* -----------------------------------------------------------

/* set DDnames and corresponding options appropriately

/* -----------------------------------------------------------

/*

IF &DDCONFIG NE THEN +

SET OPTIONS=&STR(&OPTIONS CONFIG=&DDCONFIG)

ELSE +

SET DDCONFIG=&DFCONFIG

IF &DDSASUSR NE THEN +

SET OPTIONS=&STR(&OPTIONS SASUSER=&DDSASUSR)

ELSE +

SET DDSASUSR=&DFSASUSR

IF &DDAUTOEX NE THEN +

SET OPTIONS=&STR(&OPTIONS AUTOEXEC=&DDAUTOEX)

ELSE +

SET DDAUTOEX=&DFAUTOEX

IF &DDSASAUT NE THEN +

SET OPTIONS=&STR(&OPTIONS SASAUTOS=&DDSASAUT)

ELSE +

SET DDSASAUT=&DFSASAUT

IF &DDPARMCD NE THEN +

SET OPTIONS=&STR(&OPTIONS PARMCARDS=&DDPARMCD)

ELSE +

SET DDPARMCD=&DFPARMCD

IF &DDWORK NE THEN +

SET OPTIONS=&STR(&OPTIONS WORK=&DDWORK)

ELSE +

SET DDWORK=&DFWORK

IF &DDSYSIN NE THEN +

SET OPTIONS=&STR(&OPTIONS SYSIN=&DDSYSIN)

ELSE +

SET DDSYSIN=&DFSYSIN

IF &DDLOG NE THEN +

SET OPTIONS=&STR(&OPTIONS LOG=&DDLOG)

ELSE +

SET DDLOG=&DFLOG

IF &DDPRINT NE THEN +

SET OPTIONS=&STR(&OPTIONS PRINT=&DDPRINT)

ELSE +

SET DDPRINT=&DFPRINT

IF &DDSASMSG NE THEN +

SET OPTIONS=&STR(&OPTIONS SASMSG=&DDSASMSG)

ELSE +

SET DDSASMSG=&DFSASMSG

IF &DDSASHLP NE THEN +

SET OPTIONS=&STR(&OPTIONS SASHELP=&DDSASHLP)

ELSE +

SET DDSASHLP=&DFSASHLP

/*

/*--------------------------------------------------------------

/* if SU11 installed then set SU11 to REUSE, else set it to null

/*--------------------------------------------------------------

/*

SET SU11=REUSE

/*

/*--------------------------------------------------------------

/* free files and attribute lists for reuse

/*--------------------------------------------------------------

/*

CONTROL NOMSG

FREE ATTR(SASDCB)

IF &SU11 EQ THEN DO

IF &GO EQ THEN DO

FREE FILE(&DDSYSIN &DDLOG &DDPRINT &DDWORK &DDSASHLP &DDCONFIG +

&DDSASUSR &DDPARMCD &DDSASAUT &DDSASMSG SAMPSIO MAPS)

END

ELSE +

FREE FILE(&DDSYSIN &DDLOG)

END

CONTROL MSG

/*

/*--------------------------------------------------------------

/* Allocate SOURCE data set

/*--------------------------------------------------------------

/*

IF &STR(&INPUT) NE &STR(*) THEN DO

SET OPTIONS=&STR(&OPTIONS SYSIN=&DDSYSIN)

ALLOC F(&DDSYSIN) DA(&INPUT) SHR &SU11

END

/*

/*--------------------------------------------------------------

/* Allocate LOG file data set

/*--------------------------------------------------------------

/*

IF &STR(&LOG) NE THEN DO

IF &DATATYPE(&STR(&SUBSTR(1:1,&STR(&LOG)))) EQ CHAR THEN +

ALLOC FILE(&DDLOG) DA(&LOG) &SU11

ELSE +

ALLOC FILE(&DDLOG) &UNITS SP(&LOG) &SU11

END

/*

/*--------------------------------------------------------------

/* Allocate SASEXEC data set

/*--------------------------------------------------------------

/*

IF &STR(&AUTOEXEC) NE THEN +

ALLOC F(&DDAUTOEX) DA(&AUTOEXEC) SHR &SU11

/*

/*--------------------------------------------------------------

/* If GO, set NOWORKINIT so WORK not initialized

/* Allocate other data sets if no GO option

/*--------------------------------------------------------------

/*

IF &GO NE THEN DO

SET &OPTIONS = &STR(&OPTIONS NOWORKINIT)

END

ELSE DO

/*

/* Allocate config file User config concatenated after, since

/* later options supersede prior

/*

SET &CONFIGL = &STR( +

'MXG.SOURCLIB(CONFGTCP)' +

&CONFIG)

ALLOC F(&DDCONFIG) DA(&CONFIGL) SHR &SU11

/*

/*

/* Allocate WORK file data set

/*

/*

ALLOC F(&DDWORK) SP(&WORK) DSORG(PS) UNIT(SYSDA) ROUND +

RECFM(F S) LRECL(6144) BLKSIZE(6144) &SU11

/*

/*

/* Allocate MSG file data set

/*

/*

ALLOC F(&DDSASMSG) DA(&SASMSG) SHR &SU11

/*

/*

/* Allocate PRINT file data set

/*

/*

IF &STR(&PRINT) NE THEN DO

ATTRIB SASDCB RECFM(V B A) LRECL(&LRECL) BLKSIZE(&BLOCK) DSORG(PS)

IF &DATATYPE(&STR(&SUBSTR(1:1,&STR(&PRINT)))) EQ CHAR THEN +

ALLOC FILE(&DDPRINT) DA(&PRINT) USING(SASDCB) MOD &SU11

ELSE +

ALLOC FILE(&DDPRINT) &UNITS SP(&PRINT) USING(SASDCB) &SU11

FREE ATTR(SASDCB)

END

/*

/*

/* Allocate HELP library

/*

/*

ALLOC F(&DDSASHLP) DA(&SASHELP) SHR &SU11

/*

/*

/* Allocate SASPARM for parms

/*

/*

IF &STR(&PARMCARD) NE THEN +

ALLOC FILE(&DDPARMCD) &UNITS SP(&PARMCARD) UNIT(SYSDA) &SU11

/*

/*

/* Allocate SASUSER library If SASUSER option specifies user file

/* dsn, allocate it. Otherwise check for

/* SASUSER by standard name. If it does

/* not exist, create it. If it does, use

/* it.

/* NOTE: To use the &SYSDSN CLIST function as shown,

/* you need to have TSO/E Version 1, Release 3, or a

/* subsequent release, installed.

/*

IF &SYSPREF EQ THEN +

SET &USRPREF = &SYSUID

ELSE +

SET &USRPREF = &SYSPREF

IF &STR(&SASUSER) EQ THEN +

SET &SASUSER = &STR('&USRPREF..SAS609.SASUSER')

SET STATE = &SYSDSN(&SASUSER)

IF &STATE = OK THEN +

ALLOC F(&DDSASUSR) DA(&SASUSER) OLD &SU11

ELSE +

IF &STATE = DATASET NOT FOUND THEN DO

WRITE Warning: SASUSER file does not exist, will be created.

ALLOC F(&DDSASUSR) DA(&SASUSER) NEW CATALOG SP(30 5) ROUND +

DSORG(PS) RECFM(F S) BLKSIZE(6144) &SU11

END

ELSE DO

WRITE Warning: SASUSER file: &STATE

WRITE SASUSER file not allocated to this session

END

/*

/*

/* Allocate SASAUTOS autocall macro libraries

/*

/*

SET SASAUTOS = &STR(&SASAUTOS &MAUTS)

ALLOC F(&DDSASAUT) DA(&SASAUTOS) SHR &SU11

/*

/*

/* Allocate SAMPSIO sample SAS data library

/*

/*

ALLOC F(SAMPSIO) DA('SYS7.SAS.v6r09e.SAMPSIO') +

SHR &SU11

/*

/* Allocate SAS C Transient library

/*

ALLOC F(CTRANS) DA('SAS.SASC.TRANSLIB') SHR &SU11

END

/*

/* put system sort link library in STEPLIB if needed

/*

IF &STR(&SORTLINK) NE THEN +

SET SORTLDSN=&STR()

/*

/*

/* Invoke SAS

/*

/*

ALLOC F(SASCTCPV) DA('SAS.SASCTCPV') SHR &SU11

ALLOC F(LIBRARY) DA('MXG.FORMATS') SHR &SU11

ALLOC F(SOURCLIB) DA('MXG.USERID.SOURCLIB' +

'MXG.CHANGES.SOURCLIB' +

'MXG.SOURCLIB') SHR &SU11

SET TASKLIB = &STR(&LOAD &SASLOAD &SORTLDSN)

SET PARM=&STR(T(&TASKLIB) E(&ENTRY) O('&OPTIONS') &FLUSH &NOFLUSH +

&STAE &NOSTAE &STAI &NOSTAI &STAX &NOSTAX +

&STACK &NOSTACK &SHARE &NOSHARE)

SASCP &PARM

SET RC=&LASTCC

CONTROL NOMSG

IF &AUTOEXEC NE THEN +

FREE F(&DDAUTOEX)

EXIT CODE(&RC)

SAS/CONNECT CONFIG Member (mainframe side)

* MISC OPTIONS YOU ARE LIKELY TO CHANGE

NEWS='SAS.NEWS(NEWS)'

SITEINFO='SAS.NEWS(SITEINFO)'

SORTDEV=3380

* OPTIONS FOR TUNING

BUFNO=3

DMR

COMAMID=TCP

NOTERMINAL

NO$SYNTAXCHECK

MEMSIZE=60M

INITSTMT='%INCLUDE SOURCLIB(TCPINIT);%VMXGINIT;'

SASAUTOS=SOURCLIB

MAUTOSOURCE

NOIMPLMAC

PSUPISA=170K

PSUPOSA=20K

VMPAISA=256K

VMPAOSA=128K

VMPBISA=256K

VMPBOSA=128K

* OTHER HOST OPTIONS

VECTOR

MSGLEVEL=N

BLKSIZE(DASD)=HALF

SAS/CONNECT VMXGINIT (MAINFRAME SIDE)

/* ADD ANY MAINFRAME DATASETS YOU WANT TO ACCESS VIA CONNECT TO THE */

/* END OF VMXGINIT AS SHOWN. WHILE YOU CAN DO THE ALLOCATION FROM */

/* WITHIN SAS/CONNECT, YOU CANNOT SPECIFY DISP=SHR AND THAT MAY */

/* BE IMPORTANT TO OTHER USERS OF THE DATABASES. */

LIBNAME PDB 'MXG.PDB' DISP=SHR;

LIBNAME TREND 'MXG.TREND' DISP=SHR

 

SAS/CONNECT AUTOEXEC.SAS

/* CONCATENATE USERID.SOURCLIB DIRECTORY AHEAD OF MXG.SOURCLIB */

FILENAME SOURCLIB ('C:\MXG\USERID' 'C:\MXG\SOURCLIB');

LIBNAME LIBRARY 'C:\MXG\FORMATS';

/* POINT TO THE TCPIP SCRIPT FOR CONNECT */

FILENAME RLINK 'C:\SAS\CONNECT\SASLINK\TCPMXG.SCR';

/* REMOTE= POINTS TO THE DNS NAME OF YOUR TCPIP SERVER FOR TN 3270 */

/* COMAMID= SAYS YOU ARE GOING TO USE TCPIP TO COMMUNICATE */

OPTIONS MAUTOSOURCE SASAUTOS=SOURCLIB COMAMID=TCP REMOTE=xxxxxxxx;

%INCLUDE SOURCLIB(VMXGINIT); %VMXGINIT;

SIGNON; /* START THE CONNECT SESSION */

/* ANY MAINFRAME DATABASES YOU WISH TO ACCESS */

/* SERVER= MUST be the same as REMOTE= above */

LIBNAME PDB REMOTE SLIBREF=PDB SERVER=xxxxxx;

LIBNAME TREND REMOTE SLIBREF=TREND SERVER=xxxxxxxx;

SAS/CONNECT SCRIPT for MXG

trace OFF;

ECHO OFF;

log "NOTE: MXG SAS TCP script entered.";

if not tcp then goto notcp;

if signoff then goto signoff;

/* ------------------------ TCP SIGNON ------------------------------*/

/* make sure we are running ibm's tcp/ip */

waitfor 'IKJ56700A ENTER', 120 seconds : noinit;

/*---------------------------MVS LOGON-------------------------------*/

input 'Userid?';

type ENTER;

waitfor

'Password ===>',

'IKJ56714A',60 seconds : nolog;

input nodisplay 'Password?';

type ENTER;

basewait:

waitfor 'READY',

'CURRENTLY LOGGED ON' : dup_log,

'IKJ56425I' : dup_log,

'IKJ56410I' : dup_log,

'YOU MAY CHANGE IT' : chngeit,

'ENTER YOUR SELECTION:' : ispf,

'IKJ' : hitenter,

'*** ' : hitenter,

'NOT VALID' : nouser,

'PASSWORD INVALID' : nopass,

'RECONNECT SUCCESS' : recon,

30 seconds : nostrt;

waitfor 1 second;

strt_sas:

log 'NOTE: Logged on to TSO.... Starting remote SAS now.';

/* tcpipprf option-locates TCP config data sets - value is site */

/* specific and its need dependent on your TCP configuration. */

/* noterminal suppressses prompts from remote SAS session. */

/* no$syntaxcheck prevents remote side from going into syntax */

/* checking mode when a syntax error is encountered. */

type "MXGTCP" ENTER;

sas_wait:

waitfor

'***' : hitnter2,

'SESSION ESTABLISHED', 30 seconds : nosas;

log 'NOTE: SAS/CONNECT conversation established.';

stop;

/*---------------------------MVS LOGOFF------------------------------*/

signoff:

type 'logoff' LF;

waitfor 'LOGGED OFF' , 20 seconds : noterm;

log 'NOTE: SAS/CONNECT conversation terminated.';

stop;

 

/*----- SUBROUTINES -------------------------------------------------*/

recon:

log 'NOTE: Reconnected to previous session. Old SAS session lost.';

type "$abort" LF;

waitfor 'READY' : strt_sas,

120 seconds;

log 'NOTE: Reconnected to a Running Session, but no READY prompt';

abort;

 

/*--------------- ERROR ROUTINES --------------------------------*/

nouser:

snapshot;

log 'ERROR: Unrecognized userid.';

abort;

nopass:

log 'ERROR: Invalid password.';

abort;

notcp:

log 'ERROR: Incorrect communications access method.';

log 'NOTE: You must set "OPTIONS COMAMID=TCP;" before using this';

log ' script file.';

abort;

noinit:

log 'ERROR: Did not understand remote session banner.';

abort;

nolog:

snapshot;

log 'ERROR: Did not get userid or password prompt.';

abort;

nostrt:

snapshot;

log 'ERROR: Did not get TSO startup messages after logon.';

abort;

nosas:

snapshot;

log 'ERROR: Did not get SAS software startup messages.';

abort;

dup_log:

log 'ERROR: User is already logged onto TSO.';

abort;

noterm:

log 'WARNING: Did not get messages confirming logoff.';

abort;

ispf:

type 'X' ENTER;

goto basewait;

chngeit:

TYPE ENTER;

goto basewait;

hitenter:

snapshot;

TYPE ENTER;

TYPE CLEAR;

goto basewait;

hitnter2:

snapshot;

TYPE ENTER;

TYPE CLEAR;

goto sas_wait;

 

 

VMXGSUM Messages

MXGNOTE: VMXGSUM FROM MXG MXG Version HAS BEEN INVOKED value of invokeby

VMXGSUM invocation message.

MXGNOTE: INDATA = PDB.JOBS (KEEP= TYPETASK JOBCLASS SELA

MXGNOTE: OUTDATA = JOBSUM

MXGNOTE: SUMBY = JOBCLASS

MXGNOTE: KEEPIN = TYPETASK

After parsing, a truncated version of the parameters as seen by VMXGSUM. The text is limited to the first 40 characters of the strings to save space and may not be syntactically correct.

MXGNOTE: NO SUMBY VARIABLES WERE SPECIFIED;

MXGNOTE: PROCESSING CONTINUES BUT FINAL DATASET WILL;

MXGNOTE: CONTAIN ONLY A SINGLE OBSERVATION PER ID GROUP;

There is no SUMBY= statement. You are asking for global summarization to a single observation. In other words, the grand total for the INDATA= datasets. If this is what you

wanted, then it is not a problem.

MXGNOTE: FIRST DATA STEP IS NOT REQUIRED FOR THIS;

MXGNOTE: INVOCATION AND IS BEING BYPASSED;

The conditions are right to bypass the first data step and go directly to the SORT.

MXGNOTE: THE SORT STEP IS BEING BYPASSED. IF THE INPUT DATA;

MXGNOTE: SET IS NOT IN THE CORRECT SEQUENCE ERRORS MAY RESULT;

You told us the data is in order and we trust you so we are bypassing the sort step. The PROC MEANS will ABEND if the data is not in sequence.

MXGWARN: THE NUMBER OF LEFT PARENS (number left ‘(‘) IS NOT THE SAME;

MXGWARN: AS THE NUMBER OF RIGHT PARENS (number right ‘)’) IN THE INDATA;

MXGWARN: STRING OF:value of indata;

MXGWARN: THIS WILL PROBABLY RESULT IN A SYNTAX ERROR BUT I WILL;

MXGWARN: ATTEMPT TO CONTINUE PROCESSING;

The number of parentheses in the INDATA= string is unbalanced. This will probably result in a syntax error somewhere downstream, but we are going to try and continue processing.

 

MXGWARN: PARENTHESIZED PHRASE FOUND WITHOUT A VALID DSN;

MXGWARN: PROBABLE SYNTAX ERROR IS COMING;

There is a parenthesized phrase (dataset options like KEEP=) that is not preceded by a valid dataset name. This will most likely result in a syntax error.

MXGWARN: END= PHRASE FOUND WITHOUT A VALID DSN;

MXGWARN: PROBABLE SYNTAX ERROR IS COMING;

You specified END=xxxx without first specifying a valid dataset name in the INDATA= parameter. It will most likely cause a syntax error but we will attempt to continue processing.

MXGWARN: OPEN=DEFER USED WITH KEEPALL=NO;

MXGWARN: THIS CAN RESULT IN ERRORS AND MULTIPLE;

MXGWARN: TAPE MOUNTS.;

OPEN=DEFER uses only the variables found on the first dataset to construct the input vector. No variables that exist on the second or subsequent datasets that do not also exist on the first dataset can be processed. If it is attempted, a WARNING message is raised. Assuming you are using OPEN=DEFER to avoid tape mounts, using KEEPALL= NO will defeat that since we must mount every tape to read the contents and determine the variables. You may wish to specify KEEPALL=YES if you are using OPEN=DEFER.

MXGWARN: OPEN=DEFER PHRASE FOUND WITHOUT A VALID DSN;

MXGWARN: PROBABLE SYNTAX ERROR IS COMING;

You specified OPEN=DEFER without first specifying a valid dataset name in the INDATA=. This will probably result in a syntax error but we will attempt to continue processing.

MXGWARN: THE INPUT DATASET missing input dataset DOES NOT EXIST.;

MXGWARN: THIS CAN CAUSE UNPREDICTABLE RESULTS WHEN;

MXGWARN: KEEPALL=NO IS SPECIFIED.;

One of the datasets specified in INDATA= does not exist. If you are expecting variables that exist only in this dataset, they will not be there unless you specify KEEPALL=YES.

MXGWARN: USE OF NODUP IN CONJUNCTION WITH KMXGSUM OPTIONS;

MXGWARN: CAN RESULT IN THE DROPPING OF OBSERVATIONS THAT ARE;

MXGWARN: NOT REALLY DUPLICATES BUT HAVE BEEN MADE SO BY THE;

MXGWARN: DROPPING OF THE VARIABLES THAT MADE THE OBSERVATION;

MXGWARN: UNIQUE. CARE SHOULD BE EXERCISED WITH THIS OPTION;

NODUP=NODUP was specified. The use of this option can result in a loss of data if you unintentionally remove the variables that made the observation unique. Suppose for the sake of argument that you had two jobs with the same name that got exactly the same amount of CPU time. If you remove all the variables EXCEPT the CPU time and the job name, one will be dropped because they are now in effect duplicates even though in reality they are not. In this instance, adding the READTIME and JESNR to the mix prevents the problem.

MXGWARN: &NODUP IS NOT A VALID VALUE FOR NODUP. THE ONLY;

MXGWARN: VALID VALUE IS NODUP=NODUP. WILL BE; NODUP=value specified

MXGWARN: IGNORED.;

An invalid value was specified for the NODUP= option and the option will be ignored.

MXGWARN: VARIABLES SPECIFIED IN THE value of incorrect normx parameter;

MXGWARN: PARAMETER ARE MISSING. THIS PARAMETER;

MXGWARN: WILL BE IGNORED.;

One or more of the variables specified in a NORMx argument is missing. The argument will be ignored and processing will continue.

MXGWARN: PERCENTILE VALUES ARE NOT SUPPORTED BY THIS;

MXGWARN: RELEASE OF SAS AND WILL BE IGNORED!!!

The specification of P1, P5,... P99 is not supported by the release of SAS you are using. You must be at version 7 of SAS or greater to use this option.

MXGWARN: THE DATASET SPECIFIED BY OUTDATA=value of outdata IS EITHER;

MXGWARN: EMPTY OR MISSING. ERASEOUT= PROCESSING IS BYPASSED;

You specified ERASEOUT processing but the output dataset does not exist and cannot therefore be deleted.

MXGWARN: EITHER MULTIPLE DATASETS WERE SPECIFIED BY THE;

MXGWARN: OUTDATA=value of outdata OPERAND OR THE DATASET NAME;

MXGWARN: IS NOT VALID. ERASEOUT= PROCESSING BYPASSED;

You specified multiple output datasets or the dataset name is not valid and we cannot determine what dataset it is you want is to erase. Therefore, we are not going to erase anything.

MXGWARN: DURATM=INTERVAL WAS SPECIFIED BUT THE DURATM;

MXGWARN: VARIABLE CONTAINS NON-MISSING VALUES. THIS;

MXGWARN: MAY BE AN ERROR CONDITION. VALUE OF DURATM;

MXGWARN: IN THE OUTPUT DATA IS: value of duratm

You specified DURATM=INTERVAL but the DURATM variable already exists in the output dataset. Depending on your intent, this may or may not be an error.

MXGERROR: MORE THAN 70 200 BYTE STRINGS WERE FOUND

MXGERROR: WHICH REPRESENTS MORE THAN 1500 VARIABLES

MXGERROR: VMXGSUM IS ABORTING.

VMXGSUM KEEP processing is limited to approximately 1500 variables and you have exceeded that number. This is an arbitrary limitation that can be expanded. Because we cannot parse the strings, we are aborting all processing.

MXGERROR: NONE OF THE DATASETS SPECIFIED IN THE INDATA= STATEMENT;

MXGERROR: EXIST. BECAUSE OF THIS, NO VARIABLES EXIST TO BE;

MXGERROR: SUMMARIZED AND THE PROC MEANS WILL FAIL. BECAUSE OF;

MXGERROR: THIS SITUATION, WE ARE GOING TO SAVE SOME RESOURCES ;

MXGERROR: AND STOP PROCESSING NOW.;

None of the datasets you listed in the INDATA= parameter exist. Because of that, there is no data to be summarized and everything beyond here is going to fail. To avoid that and save some time and resources, this invocation of VMXGSUM is aborted.

MXGERROR: NO SUM, MIN, MAX, OR MEAN VARIABLES HAVE BEEN;

MXGERROR: SPECIFIED, PROCESSING ABORTED

There is no action specified by any of the statistics parameters and that means there is nothing for us to do so we are shutting down this VMXGSUM invocation.

 

MXGERROR: EITHER NO INPUT OR OUTPUT DATASET WAS SPECIFIED;

MXGERROR: PROCESSING ABORTED

There are no input datasets and no output datasets so there is nothing for us to do and we are shutting down this VMXGSUM invocation.

Table of MXG dataset sizes

MXG NUMBER LENGTH PAGE RECORDS

DATASET OF OF SIZE / 3390

NAME DATASET LABEL VARS OBS BYTES TRACK

ACF2AR ACFAR: ACF2 SUBTYPE R 19 148 27648 372

ACF2CR ACFCR: ACF2 SUBTYPE T 28 382 27648 144

ACF2DR ACFDR: ACF2 SUBTYPE D 61 485 27648 114

ACF2ER ACFER: ACF2 SUBTYPE E 29 261 27648 210

ACF2JR ACFJR: ACF2 SUBTYPE L BEFORE/A 36 418 27648 132

ACF2JRL ACFJRL: ACF2 SUBTYPE L LID INF 91 686 55296 80

ACF2NRA ACFNRA: ACF2 SUBTYPE A 22 343 27648 160

ACF2NRB ACFNRB: ACF2 SUBTYPE G 24 201 27648 274

ACF2PR ACFPR: ACF2 SUBTYPE P 28 191 27648 288

ACF2TR ACFTR: ACF2 SUBTYPE J 23 162 27648 340

ACF2VR ACFVR: ACF2 SUBTYPE V 49 1201 55296 46

ACTVSRVR NTACSR: NT ACTIVE SERVER PAGES 51 288 27648 192

AICOSTAT AICOST: AICORP KLBMS PRODUCT S 18 144 27648 384

AICSCS AICSCS: AICORP CENTRAL SERVER 25 204 27648 270

AIM098_A AIMRA: AIM - DATABASE AREA ACC 33 377 27648 146

AIM098_B AIMRB: AIM - DATABASE BUFFER U 39 368 27648 150

AIM098_D AIMRD: AIM - DATABASE DSI ACCE 34 347 27648 158

AIM098_P AIMRP: AIM - TASK SEPERATOR RE 14 67 27648 824

AIM098_R AIMRR: AIM - INDEXED FILE USAG 28 241 27648 228

AIM098_S AIMRS: AIM - SQL SESSION RECOR 73 303 27648 182

AIM098_T AIMRT: DATABASE TABLE ACCESS S 30 237 27648 232

AIM110 AIM0: AIM TASK RESOURCE RECORD 16 77 27648 718

AIM111_B AIM1B: AIM DATABASE RECORD BAS 15 77 27648 718

AIM111_D AIM1D: AIM DATABASE RECORD DAT 11 61 27648 906

AIM111_S AIM1S: AIM DATABASE RECORD SCH 12 69 27648