Sunday, January 22, 2017

Easytrieve : The ACTIVITY Section

The Activity section is where all of the actual processing takes place. The activity definition section of an Easytrieve program contains the CA-Easytrieve Plus statements that perform the tasks for which the program was created: reading in, processing, and writing out data.

The JOB Statement

As stated before, this should not be confused with the JOB card in JCL, the JOB statement in EasyTrieve identifies that the Library section has finished and that processing statements will follow.

There are 3 frequent parameters to the job statement, they are FILE, START and FINISH.  An example of the JOB statement is shown below:-

001840 *                          
001900 JOB INPUT ( DUNS         ) +
002000     START ( A-INITIALISE ) +
002100     FINISH( B-TERMINATE  ) 
002200 *


The INPUT Parameter

As the name implies, this parameter identifies all of the files which are to be read into the process.  It is possible to identify more than 1 file as input.

If there are no files being used as input then INPUT( NULL ) should be entered.

When a file name is supplied to the INPUT statement, the file is automatically opened and the first record is read in as the job starts.  Thereafter, every time the logic flow of the module returns to the job statement (either by being specifically directed there with a GOTO command or because the logic has reached the end of the module), the next record on the file will be read in and processed.  This happens until the last record on the file has been processed, at which point the processing stops and the FINISH parameter, if present, is processed.


The START Parameter

This parameter contains the name of a PROC (PROC is the name for an EasyTrieve subroutine, these are detailed later) which is to be run before any other processing starts.

This routine will only run once (unless specifically called later in the Activity section) and is useful to initialise variables before any ‘real’ processing starts.

If there is no procedure to run, this parameter may be omitted.

The FINISH Parameter

As with the start routine, the PROC defined by the FINISH parameter will be run once, at the end of the processing activity.

It is usually used to return information to the user regarding how many records were read in and processed.

It may be omitted if not required.



The DISPLAY Statement

This is the means by which the EasyTrieve module communicates with the user.  Any information output by a DISPLAY command will appear in the data set identified by the DD name SYSPRINT in the JCL.  The format of the command is as follows:-

DISPLAY [LITERAL] [FIELD]

The DISPLAY statement may show one or more fields or literals on a line.  Each DISPLAY command prints the following fields and literals on the same line until a new DISPLAY command is found.

Exercise 1 - Hello World

As with learning any new language, the first exercise is to get the language communicating with the outside world.

Write an EasyTrieve module to display ‘HELLO WORLD’ surrounded by a box of asterisks.

There is no input file to be processed.

To perform this it will be necessary to create an EasyTrieve module and the JCL required to run it.



 Reading And Writing Files

As has been previously stated, adding a file name to the INPUT parameter of a JOB statement causes records to be read in one at a time whenever the logic flow returns to the top of the job.  This is a quick and effective method of getting information into the module.  Passing processed records out of the job ready for the next process is just as simple.

To write a record to an output file, use the following statement:-

PUT FILENAME

Note that the FILENAME does not have to be defined as an output file anywhere else except for in the processing.

Exercise 2 - File Reformatting

Create an EasyTrieve module to perform the following:-

Read records from the data set ‘UEOE.VA00835.FILE0001.TAPEDATA’, records are 282 bytes long and contain alpha numeric data.

Each record contains 2 records (each 141 bytes long) which are presented side by side, split the incoming record into two records and write them to a dataset called USER‑ID.EASY.TRAINING.EX2.

Print control totals of the number of records read in and written out.




Assignment Statements

EasyTrieve has two methods of assigning values to variables.  The first method used to initialise fields, while the second allows data to be manipulated before moving into the required fields.

The MOVE Statement

This is used to initialise fields before their use, it is possible to fill the field with either SPACES or ZEROS.  The receiving field must be of the appropriate type to accept the characters with which it is to be initialised.

An example of the use of the MOVE statement is given below:-

FILE  OTFILE
    OT-RCD                 1   310   A
.
.
.
MOVE SPACES TO OT-RCD

Arithmetic Functions

Arithmetic functions are available on all numeric type fields in EasyTrieve, the table below shows the functions available and their identifiers:-

FUNCTION
IDENTIFIER
Addition
+
Division
/
Multiplication
*
Rounding
ROUNDED
Subtraction
-
Truncation
TRUNCATED

The format of an arithmetic operation is as follows:-

FIELD [ROUNDED/TRUNCATED] = FIELD/LITERAL/ARITHMETIC-EXPRESSION

Arithmetic expressions are associative in the normal manner (Division and Multiplication are processed before Addition and Subtraction, otherwise process from left to right), the order of processing can be changed with the use of brackets.

Exercise 3 - Performing Calculations

This exercise is designed to introduce the user to field initialisation and arithmetic calculations in EasyTrieve and practise sorting methods in JCL.

File ‘UEOE.TRAINING.SALES.K350TOM1’ contains 7,664 records of length 376, bytes 263 to 311 contains sales data from the last 3 years as follows:-

START
LENGTH
FIELD-ID
263
15
SALES 1 YEAR AGO
279
15
SALES 2 YEARS AGO
295
15
SALES 3 YEARS AGO

Produce JCL and EasyTrieve to perform the following,

1
Calculate the percentage change (increase or decrease) in sales between 1 and 2 years ago and between 2 and 3 years ago.



Percentage change is defined as
( NEWEST SALES - OLDEST SALES ) / OLDEST SALES * 100.



Output each input record in full to the output record and add both calculations in the following formats to the end of the file

Numeric whole numbers only

Numeric to 2 decimal places



At the end of the process display a message stating the number of records read in, written out and the count of each type of calculation which has been successfully completed.


2
Sort the resulting file on the Numeric to 2 decimal places field descending.

PDS members should be called UK280PC, output files should begin USER‑ID.UK96280.



 Conditional Functions

There are two conditional functions in EasyTrieve, both are reasonably common and their syntax is detailed below:-

IF... THEN... ELSE... END-IF

The IF... THEN... ELSE... END-IF statement is common to most languages and it’s use in EasyTrieve is no different.  The IF statement is followed by a statement which can be resolved to true or false.  If the statement is true, then commands following are processed.  If the statement resolves to false, the statements following the ELSE statement are performed.

The THEN keyword is optional is usually omitted.  It is not mandatory to have an ELSE statement, if there is no ELSE statement, the keyword must also be omitted.

However, it is mandatory to have the END-IF keyword to identify the end of the IF construct.

An example of the IF... THEN... ELSE... END-IF is shown below:-

    IF    ( IN-OOB-IND NOT SPACE ) +         
       OR ( IN-RPT-TYP = ' ' 'B' )           
                                             
        DISPLAY 'NOT REQUIRED TYPE - ' IN-DUNS
        W10-WRONG-TYPE = W10-WRONG-TYPE + 1  
        GOTO JOB                             
    END-IF

As can be seen, more than one statement can be used in the IF statement, combined using AND and OR commands.

When an ELSE statement is introduced, the statement looks like this:-

IF W30-UPD-DATE-YY > 80
    EX-UPD-DATE-CC = 19
ELSE                  
    EX-UPD-DATE-CC = 20
END-IF

The valid relational operators for use in the comparison statements are as follows:-

OPERATOR
RESULT
= or EQ
Is Equal To
¬= or NE
Is Not Equal To
> or GT
Is Greater Than
< or LT
Is Less Than
>= or GE
Is Greater Than Or Equal To
<= or LE
Is Less Than Or Equal To

Using a statement such as IN-RPT-TYP = ' ' 'B' adds an implicit ‘or’ between the last operands and is the equivalent of IN-RPT-TYP = ' ' OR IN-RPT-TYP = 'B'.




The keyword THRU can be used in an IF statement to identify a range of values which are to be selected, as follows:-

IF W20-REG-DATE = 19941001 THRU 19950930
    OK-DUNS     = CF-DUNS               
    OK-REG-DATE = W20-REG-DATE         
    PUT OKDUNS                         
    W10-OK      = W10-OK + 1           
ELSE                                   
    D2-DUNS     = CF-DUNS              
    D2-REG-DATE = CF-REG-DATE          
    PUT DRPDUNS2                       
    W10-NOT-OK  = W10-NOT-OK + 1       
END-IF

Finally, it is possible to perform validation on the contents of fields before processing them.  This can be used to ensure that expected fields contain numeric data, or to check that a field contains all spaces before processing it.  Validation statements are shown below, followed by examples of their use.

VALIDATION
EFFECT
ALPHABETIC
Entire field contains characters in the range ‘A’ to ‘Z’
NUMERIC
Field contains a valid number
SPACE or SPACES
Entire field contains spaces
ZERO or ZEROS or ZEROES
Entire field contains all ‘0’ characters

IF     IN-EMPL-C (WS-IN-SUB) NOT SPACES +                   
   AND IN-EMPL-C (WS-IN-SUB) NUMERIC  
                 
   WS-EMPLOYEES-C (WS-OUT-SUB) = IN-EMPL-N (WS-IN-SUB)
   WS-OUT-SUB = WS-OUT-SUB - 1                       
END-IF




The CASE Statement

The CASE statement is similar to that used in COBOL and C, a single field is scrutinised and depending on its value various actions may be performed.  This statement will be used in place of a series of IF statements against a single field.

The format of the statement is as follows:-

CASE FIELD-NAME
    WHEN COMPARE-EXPRESSION-1
            STATEMENTS-1

    WHEN COMPARE-EXPRESSION-2
            STATEMENTS-2

    OTHERWISE
            STATEMENTS-3

END-CASE

Each COMPARE-EXPRESSION may be a constant, a literal or a range of constants using the THRU keyword.

The OTHERWISE keyword will be processed if the logic reaches the OTHERWISE without finding a match on any of the WHEN statements.  It is not mandatory and may be omitted if not required.

Note that there is no explicit terminator to the WHEN or OTHERWISE clauses.  When a COMPARE-EXPRESSION is found to be true, the statements are processed until the next WHEN or OTHERWISE clause is encountered when processing immediately jumps to the END-CASE statement.

Use of the CASE statement is demonstrated below:-

CASE IN-EMPLOYEES               
    WHEN '        0' THRU '      200'
        OT-EMPLOYEES = 'A'             

    WHEN '      201' THRU '      400'
        OT-EMPLOYEES = 'B'            

    WHEN '      401' THRU '      800'
        OT-EMPLOYEES = 'C'            

    WHEN '      801' THRU '     1200'
        OT-EMPLOYEES = 'D'            

    WHEN '     1201' THRU '     1600'
        OT-EMPLOYEES = 'E'            

    WHEN '     1601' THRU '     2000'
        OT-EMPLOYEES = 'F'            

    OTHERWISE
        OT-EMPLOYEES = 'G'            
END-CASE




Exercise 4 - Conditional Expressions

File ‘UEOE.UK96120.CD360K.FULL.EXTRACT’ contains details of 368,426 records with the following layout:-

START
LENGTH
DESCRIPTION
1
4
Standard Industrial Classification Code (SIC)
5
9
Number Of Employees

Read each record on the file and count the number of SIC codes in each of the following bands; 0001 to 0999, 1000 to 1999, 2000 to 2999, 3000 to 3999, 4000 to 4999, 5000 to 6999 and ‘OTHERS’.

When the file is complete, display a report of the number of records processed and the number of cases in each group.

PDS members should be called UK120PC, output files should begin USER‑ID.UK96120.

Use the FIND ALL option in 3.4 of ISPF to check the results.




Loop Functions

There is a single statement which allows EasyTrieve logic to perform a loop, that is the DO... END-DO statement.  There are two versions of this command, one which will guarantee at least one pass through the loop and one which will not.

The DO UNTIL Statement

This form of the statement guarantees that the processing of the loop will take place at least once by performing the terminating check at the end of the loop, after the first set of processing has taken place.

An example of the use of the statement is shown below:-

DO UNTIL    ( W20-STRIP-COUNT > 30 ) +                      
         OR ( W20-OUT-COUNT   > 20 )                        

    IF W20-STRIP-CHAR( W20-STRIP-COUNT ) ALPHABETIC
        ND-REFMAT-CHAR( W20-OUT-COUNT ) = W20-STRIP-CHAR( W20-STRIP-COUNT )                 
        W20-OUT-COUNT = W20-OUT-COUNT + 1                    
    END-IF                                                  
                                                            
    W20-STRIP-COUNT = W20-STRIP-COUNT + 1                   
END-DO

In this example, as long as the conditional expressions are false (that is the, counter values are less than 30 and 20 respectively), the loop will continue to process.

The DO WHILE Statement

In contrast with the above statement, a DO WHILE loop checks the terminating criteria before the loop is processed, so it is possible to the loop to be processed zero times.

The use of this statement is demonstrated below:-

DO WHILE     ( W20-CUSTOMER-COUNT LE 5 ) +                      
         AND ( TI-CUSTOMER-NBR( W20-CUSTOMER-COUNT ) NOT SPACE )

    MT-CUSTOMER-NBR    = TI-CUSTOMER-NBR( W20-CUSTOMER-COUNT )
    PUT MATCH                                                
    W10-OUT-MATCH      = W10-OUT-MATCH + 1                   
    W20-CUSTOMER-COUNT = W20-CUSTOMER-COUNT + 1              
END-DO

In this example, the terminating condition is checked first and the loop is processed only if the conditions are met.  As soon as one or more of the conditions are not met, the loop will stop processing.

As can be seen, the terminating criteria is formatted the same way as the condition in the IF statement and may be combined in the same manner.




Exercise 5 - Loops

File ‘UUKB.UK960230.BEMSALL’ contains 12,782 records with the following layout;

START
LENGTH
DESCRIPTION
1
9
DUNS Number
10
7
Index Number
17
6
Second Index Number
23
172
Name and Address
195
11
Post Code

Split the incoming file into 2.  Output those records where the DUNS number is not spaces to one file.  The other file is to contain the records where the DUNS is spaces, take the first part of the Post Code (up to the first space) and place the result in a new 4 byte field at the beginning of the record.  Be aware that some Post Codes are missing, display the names of the businesses where no Post Code exists and a report on the number of cases read and the number of cases routed to each file.

PDS members should be called UK230PC, output files should begin USER‑ID.UK96230.




File Synchronisation

One of the major advantages of EasyTrieve over COBOL is it’s excellent file handling capabilities.

Many of the jobs involve extracting information from databases and merging it with data from supplied customer files.  In COBOL, this is a major task, but the file synchronisation routines of EasyTrieve make it much easier.

Other tasks rely on deduplicating incoming files (to prevent duplication of work), this is also made much easier using EasyTrieve.

File synchronisation relies on two major factors, the incoming file(s) must be sorted into ascending order on the key which is to be used and the key fields must be contiguous in the file, that is the key fields must follow one after another with no intervening non-key fields.

File deduplication is the easier of the two actions to describe and this will be covered first.  The statements which are used in file deduplication can also be used in file merging, but not vice versa.




File Deduplication

To define a file for deduplication, a single key field must be defined in the Library section for the file and the keyword KEY and the key field name must be added to the INPUT file name on the job statement.  Once this has been successfully completed, the deduplication commands will be available.  An example of the preparation of a file for deduplication is shown below:-

FILE  CSFILE                              
    CS-DUNS                 1   9   N    
    SIC-1                  10   4   A    
    SIC-2                  14   4   A    
.
.
.
JOB INPUT ( CSFILE KEY CS-DUNS ) +   
    FINISH( DISPTOTS           )
.
.
.
MOVE SPACES TO OT-DATA          
W10-IN = W10-IN + 1         
IF    NOT DUPLICATE CSFILE +
   OR     FIRST-DUP CSFILE  
                                    
    OT-DATA = OT-DUNS
    PUT OT-FILE
ELSE                        
    MOVE SPACES TO DUP-DATA 
    DUP-DATA = CS-DUNS
    PUT DUPFILE             
    W10-DUPES = W10-DUPES + 1
END-IF

In the example, only one copy of the duns number is required on the output file but it is known that there are may be more then one occurrence of each duns on the incoming file.

Once the incoming file has been sorted into ascending duns number order, the EasyTrieve routine checks to see if each duns number on the file occurs only once (i.e. NOT DUPLICATE), in which case it is output straight away, or more than once, in which case only the first occurrence of the duns number (FIRST-DUP) is output.

The following statements are available when processing duplicates on a given file:-

STATEMENT
MEANING
DUPLICATE
Is there more than one occurrence of the key field on the file?
FIRST-DUP
If there is more than one occurrence of the key field on the file, is this the first such occurrence
LAST-DUP
If there is more than one occurrence of the key field on the file, is this the last such occurrence




File Merging

This function is similar to file deduplication, except that it allows the contents of 2 or more files to be combined based on a defined key field. 

The key fields of all of the files are defined as before, each key field must be identical in type (numeric or alpha), but in the case of numeric keys it is possible to mix Binary and Packed Decimal layouts with Numeric fields.

Each file to be merged must be added to the INPUT parameter of the JOB statement in the same layout as for the deduplication process.

Note:
Only one of the input files may contain duplicate records based on the selected key, this must be placed last on the list of files defined on the INPUT files.

Once the files have been defined, the following commands are available:-

COMMAND
RESULT
FILE-NAME
Tests to see if there is a valid record from this file currently loaded
MATCHED FILE-1 FILE-2 [FILE-N]
Checks if the keys of 2 or more files are identical
EOF FILE-NAME
Checks to see if the end of file marker has been met for the given file




The following example shows how the file merging process works:-

FILE  INFILE                                                           
    IN-NAME                                1  48   A                   
    IN-INDEX                              49   4   N                    
*                                                                      
FILE  EUROPA                                                           
    EU-DUNS                                1   9   N                   
    EU-NAME                               10  48   A                   
*                                                                      
FILE  DPLMSTR                                                          
    DI-DATA                                1  54   A                    
    DI-NAME                                1  48   A                   
    FILLER-1                              49   1   A                   
    DI-INDEX                              50   4   N                   
*                                                                       
FILE  OTFILE                                                           
    OT-DATA                                1  61   A                   
    OT-NAME                                1  48   A                    
    OT-INDEX                              49   4   N                   
    OT-DUNS                               53   9   N                   
*=======================================================================
 JOB INPUT  ( EUROPA KEY EU-NAME +                                     
              INFILE KEY IN-NAME   )
*                                                                      
    IF EOF INFILE                                                      
        STOP                                                            
    END-IF                                                             
                                                                       
    MOVE SPACES TO OT-DATA                                              
    MOVE SPACES TO DI-DATA                                             
    IF INFILE                                                          
        OT-NAME  = IN-NAME                                             
        OT-INDEX = IN-INDEX                                             
        IF DUPLICATE INFILE                                            
            DI-NAME     = IN-NAME                                     
            DI-INDEX    = IN-INDEX                                     
            PUT DPLMSTR                                                
            OT-DUNS     = 999999999                                   
        ELSE                                                           
            IF MATCHED INFILE EUROPA                                   
                OT-DUNS   = EU-DUNS                                    
            END-IF                                                     
        END-IF                                                         
                                                                       
        PUT OTFILE                                                     
    END-IF                                                             
*                                                                       




Exercise 6 - File Synchronisation

File ‘UEOE.UK96120.CD360K.FULL.EXTRACT’ contains 368,426 records.  This is the same file as used in Exercise 4.

Deduplicate the SIC codes so that a new file contains only one record for each of the codes.

It is not known whether the file is correctly sorted or not.

Display a report of the number of records processed.

PDS members should be called UK120DED, output files should begin USER‑ID.UK96120.


File ‘UEOE.UK96174.CSDB.EXTRACT1’ contains details extracted from the Case Summary database as follows:-

DESCRIPTION
START
LENGTH
DUNS Number
1
9
Name
10
40
CRO Prefix
50
2
CRO Number
52
7
Sic
59
4
Employees
63
15

File ‘UEOE.UK96174.MERGE1’ contains information from other sources.  It’s layout is:-

DESCRIPTION
START
LENGTH
DUNS Number
1
9
Registration date
10
8
Director’s name
18
40
Function code
58
3
Associate duns
61
9
Associate function code
70
3

Merge the 2 files together based on DUNS.  The final file layout must be as follows:-

DESCRIPTION
START
LENGTH
DUNS Number
1
9
Registration Prefix
10
2
Registration Number
12
7
Registration date
19
8
Director’s name
27
40
Function code
67
3
SIC
70
4
Employees
74
15
Associate duns
89
9
Associate function code
98
3

PDS members should be called UK174MR3, output files should begin USER‑ID.UK96174.




File ‘UEOE.SEDGWICK.CUSTFILE.FEB96’ contains 660 records.
File ‘UEOE.UK96222.CSDB.EXTRACT’ contains 319 records.
File ‘UEOE.UK96222.GLOBAL.EXTRACT’ contains 149 records.

Merge the data from the last 2 files onto the first file using the DUNS numbers as a key.  If a duplicate DUNS is found on the first file, only write the first occurrence to the output file.

If a DUNS number from the first file is not found on the second or third files, output the record to a FAILFILE with a similar layout to the first file.

Ensure that all of the records from the first file are accounted for and display a report of the processing completed.

PDS members should be called UK222MRG, output files should begin USER‑ID.UK96222.




Look-Up Tables

A look-up table is a special use of a file which allows cross reference tables to be used in EasyTrieve.  This was not mentioned in the Library section as it is considered an advanced topic and some EasyTrieve experience is required before attempting to use the feature.

General Requirements

Look-up tables may either be external files or defined within an EasyTrieve module.  Whatever their location, a key field (known as the ARG) must be defined with a result field (called the DESC field).

The ARG fields must be unique and must be sorted into ascending order.

Instream Tables

Tables which are defined in the EasyTrieve module itself are termed as INSTREAM.

An INSTREAM table is defined in the Library section as follows:-

FILE EXCODES TABLE INSTREAM         
 ARG                        1    2  A
 DESC                       4   30  A
04 COMPANY SECRETARY                
05 PRESIDENT                        
06 PROPRIETOR                       
07 PARTNER                           
08 MANAGING DIRECTOR                
09 OTHER DIRECTOR                   
10 GENERAL MANAGER                  
12 FINANCIAL DIRECTOR               
13 COMMERCIAL DIRECTOR              
14 TECHNICAL DIRECTOR               
16 PERSONNEL DIRECTOR               
21 SALES DIRECTOR                   
22 EXECUTIVE DIRECTOR               
23 MARKETING DIRECTOR               
24 CHAIRMAN                         
25 MANAGER

In this example, the ARG field is defined as 2 bytes starting in column 1, the DESC starts in column 4 and is 30 bytes long.

The ARG and DESC fields can be any length and start in any position, but their combined lengths must not exceed 72 bytes.




File Tables

Look-up tables which are held on file are defined in a similar manner:-

FILE SICTABLE  TABLE (2000)                       
  ARG                                    1     4  A
  DESC                                   6   118  A

The value in brackets is the maximum number of records on the file.

As can be seen, there is no restriction on the length of the fields in the table when using a file instead of instream.

Searching Tables

Once the table has been defined (either as a file or instream) in the Library section, it can be searched in the Activity section in the following manner.

SEARCH SICTABLE WITH OT-USSIC-1 GIVING WS-SIC
IF SICTABLE                                 
   OT-USSIC-DESC-1 = W-USSIC-DESC           
END-IF

The search field (in this case OT-USSIC-1) and target field (WS-SIC), must match the ARG and DESC field definitions exactly.

The test following the search command will return true if a match on the ARG was found, false otherwise.

Exercise 7 - Tables

Using the output file from Part 1 of Exercise 6, create a new file with the SIC code and it’s description.

The file which can be used as a table in this instance is held in ‘UEMS.SIC.CONVERT’.  Details of this file are held in the Programmers Checklist & Standards (Section 9).

PDS members should be called UK120TBL, output files should begin USER‑ID.UK96120.




Database Access

Extracting data databases usually takes 2 forms.  The first form is to use a key to extract specific records from the database.  The second is to ‘sweep’ the database, selecting each record in turn and discarding or processing the records depending on set criteria.

The former is the most common way of extracting records, the latter is used less often and almost always against the Case Summary database.

JCL Requirements

Whichever type of access to the database is required, the database(s) used must be identified in the JCL.  This is done by identifying that a database is to be used in the JCLLIB and JOBLIB statements and then identifying one or more databases to be INCLUDED in the appropriate step.  The example below shows the inclusion of a database in the JCL, the mandatory statements are highlighted:-

//**********************************************************************
//*                                                                    *
//*  CS ORDER : 146   EMS ORDER : *****  CLIENT : SEDGWICK LTD         *
//*                                                                    *
//*  DESCRIPTION                                                       *
//*  ~~~~~~~~~~~                                                       *
//*                                                                    *
//*  EXTRACT CSDB DATA                                                 *
//*                                                                    *
//*  AUTHOR : DUNCAN SPENCE                   DATE :16TH FEB 1996      *
//*                                                                    *
//**********************************************************************
//JCLLIB JCLLIB ORDER=(SEDV.FIX.JCLLIB,SEDV.PRD.JCLLIB)                
//JOBLIB   DD DSN=SYS9.FASTSW.LOAD,DISP=SHR                            
//         DD DSN=IDMS.PROD.LOAD,DISP=SHR                              
//         DD DSN=IDMS.PROD.SCHEMA,DISP=SHR
.
.
.
//S040     EXEC PGM=EZTPA00,REGION=8M,COND=(0,NE),TIME=(0,10)
//EZTVFM   DD  UNIT=SYSDA,SPACE=(CYL,(20,02),,,ROUND)       
//PCSUMDB  INCLUDE MEMBER=PCSUMDB                           
//JOURN    DD  DUMMY




EasyTrieve Requirements

Once the database has been identified in the JCL, it is necessary to define the database and how it will be used in the EasyTrieve module itself.  There is a certain amount of information which is mandatory and this is laid out in the following example:-

****LIBRARY SECTION
FILE   DBASE     IDMS( CS001R   RESET )        
RECORD CASE-REC 544   +          
KEY   ( NBR-DUNS 1   4 )
   NBR-DUNS                     1     4  B  0
   IND-STOP-DISTRIBUTION       13     1  A  
   IND-OUT-BUSINESS            14     1  A  
   IND-BASE-CATEGORY           15     1  A  
   IND-IMPORT-EXPORT           16     1  A  
   DATE-OUT-BUSINESS           17     4  P  0
   DATE-EAA-STATEMENT          21     4  P  0
   DATE-BASE                   25     4  P  0
   DATE-STATEMENT              41     4  P  0
   TOTAL-EMPLOYEES             45     5  P  0
   DATE-YEAR-STARTED           59     3  P  0
   TOTAL-SALES                 63     8  P  0
   TOTAL-NET-WORTH             71     8  P  0
   IND-WORTH                   79     1  A  
   IND-TREND                   85     1  A  
   NBR-CASE-TELEPHONE          86    14  A  
   TEXT-LINE-BUSINESS         106    50  A  
   NAME-PRIMARY               215    40  A  
   ADDR-PRIMARY-STREET-1      255    40  A
   NBR-SIC                    407     4  N OCCURS  6

Once the file has been identified as a database (DBASE), the name of the record must be identified and the field which is to be used as a key.  Once the key field has been identified, it must be included in the record layout which follows.




Extracting Data By Key

To extract data using the selected key into the database, an input file must be defined with the required key in a similar format to the key defined for the database.  Once this is complete, the first statement of the JOB section MUST be to read the database using the supplied key, as follows:-

FILE  DBASE     IDMS(CS001R   RESET)         
RECORD CASE-REC           544   +           
KEY  (NBR-DUNS       1   4)            
    NBR-DUNS                1     4  B  0     
    NBR-SIC               407     4  N        +
                         OCCURS  6           +
                         INDEX NBR-SIC+INDEX 
*                                            
FILE  INFILE                                
    IN-DUNS                  1     4  B  0
.
.
.
JOB INPUT ( DBASE    ) +
    FINISH( DISPTOTS )                 
*                                                  
RETRIEVE DBASE                              +
KEYFILE  INFILE                              +
KEYVALUE IN-DUNS                            +
SELECT   ( CASE-REC AREA 'CASE-SUMM-AREA' )    
*
IF PATH-ID = 'NF'                
    W10-MISMATCH = W10-MISMATCH + 1
    FAIL-DUNS    = IN-DUNS        
    PUT FAILFILE                  
    GOTO JOB                      
END-IF

Note that the file containing the incoming KEY field is not defined in the JOB statement, the retrieve statement automatically reads the next record in before interrogating the database.

The check against PATH-ID is to ascertain whether the given key exists on the database.




Sweeping The Database

When sweeping the database, it is not necessary to supply an input file with a key field.  The EasyTrieve statements cause a fresh record from the database to be returned on each pass through the logic.  It is sill necessary to supply a KEY field in the database definition as this is used to control the order in which the records are returned.  The example on the following page shows how to code for a database sweep.

Once again, at this stage it is not necessary to go into great detail on the processes which take place, the BIND statements prepare the database ready for use, the STATUS-CHECK at each stage ensures that the database is being read correctly and the IDMS FINISH command closes the database once the sweep is finished.

It is important to remember the STOP command at the end of the processing because otherwise the module falls into a continuous loop and will never end!




JOB INPUT (NULL) START(INIT)    FINISH(DISPTOT)
*
IDMS OBTAIN FIRST RECORD  CASE-REC  +     
             AREA  'CASE-SUMM-AREA'            

DO WHILE IDMSSTATUS NE '0307'               
      PERFORM STATUS-CHECK
.
.
.
    IDMS OBTAIN NEXT RECORD  CASE-REC  +
                AREA 'CASE-SUMM-AREA'    
*                                        
END-DO                                 
*                                        
STOP
*================================================================*
INIT.  PROC                            
*
IDMS BIND 'CS001R'                    
PERFORM STATUS-CHECK                   
*                                      
IDMS BIND,  FILE DBASE, RECORD CASE-REC
PERFORM STATUS-CHECK                  
*                                      
IDMS READY, AREA 'CASE-SUMM-AREA'     
PERFORM STATUS-CHECK                  
*                                       
IDMS READY AREA 'INDEX-CTRL-AREA'      
PERFORM STATUS-CHECK                   
*                                       
IDMS READY AREA 'BUSINESS-INDX'        
PERFORM STATUS-CHECK
*
IDMS READY AREA 'NAME-ADDR-INDX'                                  
PERFORM STATUS-CHECK                                             
*                                                                
IDMS READY AREA 'NAME-CNTRY-INDX'                                
PERFORM STATUS-CHECK                                              
*                                                                
IDMS READY AREA 'POST-CODE-INDX'                                 
PERFORM STATUS-CHECK                                             
END-PROC.                                                         
*================================================================*
DISPTOT.  PROC.  
*                
IDMS  FINISH    
END-PROC.
*================================================================*
STATUS-CHECK.  PROC.              
*                                 
IF IDMSSTATUS NE '0000'          
    DISPLAY NEWPAGE               
    DISPLAY 'STATUS OF ' IDMSSTATUS
    STOP                          
END-IF                           
END-PROC




Exercise 8 - Database Access

Sweep the Case Summary database and select the DUNS numbers of the first 1,000 cases which are shown as trading in the UK.

The country code field is found at offset 395 on the record, is 2 bytes alpha and contains ‘UK’ for United Kingdom cases.

PDS members should be called UK361CS, output files should begin USER‑ID.UK96361.


Using the DUNS numbers extracted above, select cases from the Case Summary database and output the following information on each one; Business Name, Primary SIC and Telephone Number.

Ensure that the data output falls in line with the Programmers Checklist & Standards.




Subroutines

A certain amount of information on EasyTrieve subroutines has already been covered, this section formalises that information.

As in many other programming languages, a subroutine contains code which may be called many times from main logic, or may be used to aid in the readability of code by simplifying the structure of a module.

An EasyTrieve subroutine is known as a PROC and usually appears at the end of the module.  The structure of a PROC is shown in the example below:-

CHECK-EXCLUDES. PROC.                             
*                                                 
DO WHILE     ( W30-END-EXCLUDED   = 'N'         ) +
         AND ( NBR-DUNS           > W30-EX-DUNS ) 
                                                  
    GET EXCLFILE                                  
    IF EOF EXCLFILE                               
        DISPLAY 'AT END OF EXCLUDE FILE'           
        W30-END-EXCLUDED = 'Y'                    
        W30-EX-DUNS      = 0                      
    ELSE                                          
        W30-EX-DUNS      = EX-DUNS                
    END-IF                                         
END-DO                                            
                                                  
END-PROC

Note that the full stops are important in the definition of the PROC and that no parameters may be passed into or out of the subroutine.

To call a PROC code the statement PERFORM PROC-NAME in the code.




EasyTrieve Macros

Macros in EasyTrieve can be closely allied to macros in C, they are used to substitute code for an identifier.  This allows blocks of reusable code to be created to simplify program logic or perform identical actions in several different modules.

Macros are generally used to identify file layouts for some of the most common files and ‘pseudo’ databases which exist and also to perform ‘generic’ actions on data such as expanding addresses or manipulating text.

This section will only cover the use of pre-defined macros in EasyTrieve modules, details of the creation of macros is outside the scope of this guide.

JCL Requirements

To call a macro into an EasyTrieve module, the location of the macro to be used must be defined in the JCL step where it will be used.  This is achieved by coding a MACRO1 DD name and adding the correct PDS where the macro is kept, as follows:-

//S040     EXEC PGM=EZTPA00,REGION=8M,COND=(0,NE),TIME=(3,00)
//EZTVFM   DD  UNIT=SYSDA,SPACE=(CYL,(20,02),,,ROUND)       
//MACRO1   DD  DSN=UEOE.PROD.MACLIB,DISP=SHR
//             DSN=UEMS.EAZY.MACLIB,DISP=SHR

Note that it is possible to add more than one macro library to the DD statement if required.

EasyTrieve Requirements

To call a macro into the EasyTrieve module, prefix the macro name (which is identical to the PDS member name) with a %.  Some of the generic macros also allow parameters to be passed.  Examples of both an ordinary macro call and a parameterised macro call are shown below:-

FILE  INFILE                          
   IN-DUNS                 1     5  P 0
*                                     
*MACRO TO CALL IN PRE-GENERATED FILE LAYOUT
%DASHGENR
.
.
.
IF DG-MIDL-NAME NOT SPACES             
    %EMCONCAT OT-EXEC-NAME 1 WS-MIDL-CHAR
    %EMCONCAT OT-EXEC-NAME 1 DG-SURNAME 
ELSE                                   
    %EMCONCAT OT-EXEC-NAME 1 DG-SURNAME 
END-IF

Details of generic macros for file layouts and data manipulation are held in the Programmers Checklist & Standards document.




APPENDIX I - Numerical Formats


There are several different ways in which numerical values can be stored on the mainframe system depending on the way in which the values are to be used.

Each must be viewed and interpreted in a different way.  The following is a discussion of how the numerical values may be stored and how they may be viewed.

Numeric Values

This is the easiest form to explain and view.  The drawback of using this method of storing values is that it is the most inefficient way of storing and processing numbers.  With a maximum of 18 bytes allowed for a numeric field this gives a range of values from -999,999,999,999,999,999 to +999,999,999,999,999,999.

When the layout of the field is defined as x N (where x is the number of digits in the field), each byte in the output layout represents a single digit in the number.

LIST ON                   
                          
FILE  OTFILE              
  FIELD-1       1    5    N
*                         
JOB INPUT( NULL )         
                          
FIELD-1  = +250           
PUT OTFILE                
                          
STOP

Returns the following information on the OTFILE:-

 ----
00250
FFFFF
00250
 ----
*****

Note that the above output is achieved by browsing the file in ISPF Option 3.4 and typing HEX at the command line.  The emboldened line is the contents of the byte, the two lines below show the value of the two word sized values which make up the byte.




It should be noted that negative numbers will lose their sign when stored in a field defined as above.  To ensure that the sign of a value is preserved the field must be defined as it is below.

LIST ON                        
                                
FILE  OTFILE                   
  FIELD-1       1    5    N    
  FIELD-2       7    5    N    
  FIELD-3      13    5    N    0
  FIELD-4      19    5    N    0
*                              
JOB INPUT( NULL )              
                                
FIELD-1  = +250                
FIELD-2  = -250                
FIELD-3  = +575                
FIELD-4  = -575                
PUT OTFILE                     
                               
STOP

This produces entries on a file as follows:-

 ----------------------
00250 00250 00575 0057N
FFFFF4FFFFF4FFFFF4FFFFD
00250000250000575000575
 ----------------------

When interpreting the fields output by this EasyTrieve module, the most significant word of the last byte will contain F if the value is positive and D if it is negative.  The least significant word will contain the least significant digit of the value.




To introduce decimal places into a numeric field, the field definition must be changed as follows:-

LIST ON                         
                               
FILE  OTFILE                   
  FIELD-1       1    5    N    
  FIELD-2       7    5    N    
  FIELD-3      13    5    N    2
  FIELD-4      19    5    N    2
*                              
JOB INPUT( NULL )              
                               
FIELD-1  = +250                
FIELD-2  = -250                
FIELD-3  = +575.2              
FIELD-4  = -575.2              
PUT OTFILE                     
                                
STOP

When executed, this gives the following results:-

 ----------------------
00250 00250 57520 5752}
FFFFF4FFFFF4FFFFF4FFFFD
00250000250057520057520
 ----------------------

As can be seen, it is vital to know how many decimal places were defined when the field was populated to ensure that the value is interpreted as 575.20 and not, for example, 5.7520.

Once again, the sign of a number is stored in the most significant word of the last byte as a D for negative and F for positive values.




Packed Decimal Values

This data type is the middle ground of the EasyTrieve data types, being more efficient in storage space and calculation time at the expense of readability of the final output.

Up to 10 bytes can be assigned for a packed decimal value giving a range of values from ‑9,999,999,999,999,999 to +9,999,999,999,999,999,999.  The following example repeats those from the Numeric Values section and shows the output received.

LIST ON                        
                               
FILE  OTFILE                   
  FIELD-1       1    5    P    
  FIELD-2       7    5    P    
  FIELD-3      13    5    P    0
  FIELD-4      19    5    P    0
  FIELD-5      25    5    P    2
  FIELD-6      31    5    P    2
*                              
JOB INPUT( NULL )              
                               
FIELD-1  = +250                
FIELD-2  = -250                
FIELD-3  = +575                
FIELD-4  = -575                
FIELD-5  = +575.2              
FIELD-6  = -575.2               
PUT OTFILE                     
                               
STOP

 ----------------------------------
..... ..... ....* ....) ..... .....
00020400020400055400055400550400550
0005F00005F00007C00007D00072C00072D
 ----------------------------------

As can be seen, browsing the file in ‘normal’ mode will show many unprintable values, it is necessary to switch to the HEX view to see the true value of the fields.

The figures are interpreted top line to bottom (most significant word to least significant) and then left to right.  In contrast to the numeric fields detailed before, the sign field of the value (when available) is stored in the least significant word of the last byte, with a C denoting a positive value and a D indicating a negative.




Unsigned Packed Decimals

These react in a similar fashion to the ordinary Packed Decimal values.

The acceptable range given by the 9 bytes which Unsigned Packed Decimals are allowed to cover is zero to +999,999,999,999,999,999.

The following examples show how to code for Unsigned Packed Decimals and the result of using them with positive and negative values.

LIST ON                        
                               
FILE  OTFILE                   
  FIELD-1       1    5    U    
  FIELD-2       7    5    U    
  FIELD-3      13    5    U    0
  FIELD-4      19    5    U    0
  FIELD-5      25    5    U    2
  FIELD-6      31    5    U    2
*                              
JOB INPUT( NULL )              
                               
FIELD-1  = +250                
FIELD-2  = -250                
FIELD-3  = +575                
FIELD-4  = -575                
FIELD-5  = +575.2              
FIELD-6  = -575.2              
PUT OTFILE                     
                               
STOP

 ----------------------------------
....& ....& ..... ..... ..... .....
00005400005400007400007400072400072
00020000020000055000055000550000550
 ----------------------------------

It can be seen that the values always lose their sign.  Interpreting the figures in HEX mode is similar to Packed Decimal except that the least significant word of the last byte is now the least significant digit of the value instead of the sign indicator.

Unsigned Packed Decimals are not generally used.




Binary Values.

Binary numbers (which are also called hexadecimal because of the way in which they are represented in output files) are the most efficient way to store numerical information on the mainframe.  Not only do the values take up the least space, but arithmetic processing is also at it’s fastest when fields are defined as Binary.

However, these values are the hardest to interpret, requiring an hexadecimal calculator to convert from the binary representation into decimal.

The range of values which can be stored in a binary field are -2,147,483,648 to +2,147,483,647.
It is worth noting that if the sign is not retained by coding a digit after the data type, the maximum positive value IS NOT doubled.  If the figure becomes greater than +2,147,483,647, figures will simply be stored incorrectly.

The following repeats the previous examples with binary numbers:-

LIST ON                        
                               
FILE  OTFILE                   
  FIELD-1       1    4    B    
  FIELD-2       7    4    B    
  FIELD-3      13    4    B    0
  FIELD-4      19    4    B    0
  FIELD-5      25    4    B    2
  FIELD-6      31    4    B    2
*                              
JOB INPUT( NULL )              
                               
FIELD-1  = +250                
FIELD-2  = -250                
FIELD-3  = +575                
FIELD-4  = -575                
FIELD-5  = +575.2              
FIELD-6  = -575.2              
PUT OTFILE                     
                               
STOP

 ---------------------------------
....  ....  ....  ...A  ..\.  ...&
000F44000F44000344FFFC4400EB44FF15
000A00000A00002F00FFD100000000FFF0
 ---------------------------------

The example shows that each word of each byte contains an hexadecimal digit (1 to 9 or A to F), values are read in the same manner as for packed decimal values (highest to lowest significant word and left to right).

The binary versions of the values follow the 2’s compliment order of calculation so, when negative values are being represented, the value of the field on the file will be greater than 7FFFFFFF.

The Windows calculator (usually found in the Accessories folder) has decimal and hexadecimal conversion function when in scientific mode and there is a hex converter function on the mainframe (enter TSO HEX on any command line to start this function).


No comments:

Post a Comment

Note: Only a member of this blog may post a comment.