PL1TAX
Tutorial

 

Home

The following is a tutorial to PL1TAX programming. That is to say, a study of the language without regard to exact syntax, but with an eye on functional understanding by building on examples from simple to more complex. There are three sections: Cross-Tabulations, Reports, and File/Instruction processing.


Cross-tabulations:

First, a PL1TAX program consists of sections. For the moment we will consider the following sections:

*FILES
...
*RECORDS
...
*TABLES
...


Since PL1TAX is primarily used for creating cross-tabulations, lets examine a basic program:

*FILES
 OLD FILE PL1TAXDATA 80 

*RECORDS    
 AGE//21-22 
 SEX//24    
 
*TABLES     
 TABLE
 STUB SEX CODES M,F     
 SPREAD AGE GROUPS 00-21,22-65,66-99


Now lets go through the program.

*FILES
 OLD FILE PERSONAL 80

This is the *FILES section: It is used to define the input file to a PL1TAX program, and other global aspects of the program. In this case we are reading an input file known to the Operating System as PERSONAL, whose record length is 80 characters.

*RECORDS
 AGE//21-22 
 SEX//24

This is the *RECORDS section. It is used to define the variables used by the program. In the case the variable AGE is located in columns 6 and 7, and the variable SEX is located in column 9 of the input file. Note that not all columns in the input file need be accounted for.

*TABLES
 TABLE
 STUB SEX CODES M,F     
 SPREAD AGE GROUPS 00-21,22-65,66-99

This is the *TABLES section. TABLE indicates table definitions are to follow. STUB says stub the variable SEX into M and F values. SPREAD says spread the variable into 00-17, 18-35, 36-65, 66-99 values.

When run the above program would produce:

SEX                         AGE 

             TOTAL       00-21       22-65       66-99  

TOTAL         1000         125         527         348  

M              592          77         307         208  
F              408          48         220         140


Now lets dress up the table a little bit:

*FILES
 OLD FILE PERSONAL 80
 
*RECORDS
 AGE//21-22 
 SEX//24    
 
*TABLES
 TABLE ='SEX VRS AGE',/,='BREAKDOWN',/    
 STUB SEX LABELS MALE,FEMALE  
 STUB SEX CODES M,F     
 SPREAD AGE LABELS KIDS,ADULTS,RETIREES   
 SPREAD AGE GROUPS 00-21,22-65,66-99

When run the above program would produce:

 

                         SEX VRS AGE 
                          BREAKDOWN  

SEX                          AGE

              TOTAL        KIDS      ADULTS    RETIREES 

TOTAL          1000         125         527         348 

MALE            592          77         307         208 
FEMALE          408          48         220         140 
                     

We've added a title to the given table, and added labels for the stub and spread values.


Now lets apply some filtering to the table:

*FILES
 OLD FILE PERSONAL 80
 TITLE *'PERSONAL DIVISION',/

*RECORDS
 AGE//21-22 
 SEX//24    
 COMPANY//27-36

*TABLES
 TABLE ='SEX VRS AGE',/,='BREAKDOWN',/,   
       ='FOR IBM',/     
 SELECT COMPANY = IBM   
 STUB SEX LABELS MALE,FEMALE  
 STUB SEX CODES M,F     
 SPREAD AGE LABELS KIDS,ADULTS,RETIREES   
 SPREAD AGE GROUPS 00-21,22-65,66-99

When run the above program would produce:

                           SEX VRS AGE 
                            BREAKDOWN  
                             FOR IBM   

SEX                          AGE

              TOTAL        KIDS      ADULTS    RETIREES 

TOTAL           157          18          91          48 

MALE            103           9          59          35 
FEMALE           54           9          32          13 
                     

First we added the variable COMPANY to the program. Then we applied the SELECT filter to the input file for this table. That is only records in which the variable STATE was equal to CA were processed by the table.


Now lets add a second stub:

*FILES
 OLD FILE PERSONAL 80

*RECORDS
 AGE//21-22 
 RC/RACE/23   
 SEX//24    
 COMPANY//27-36

*TABLES
 TABLE ='SEX, RACE VRS AGE',/,='BREAKDOWN',/,   
       ='FOR IBM',/     
 SELECT COMPANY = IBM   
 STUB SEX LABELS MALE,FEMALE  
 STUB SEX CODES M,F     
 STUB RC LABELS WHITE, BLACK, HISPANIC  
 STUB RC CODES W,B,H  
 SPREAD AGE LABELS KIDS,ADULTS,RETIREES   
 SPREAD AGE GROUPS 00-21,22-65,66-99

When run the above program would produce:

                        
                           SEX, RACE VRS AGE  
                               BREAKDOWN  
                                FOR IBM   

SEX                                AGE  

    RACE            TOTAL        KIDS      ADULTS    RETIREES   

TOTAL                 114          14          63          37   

    WHITE              55           6          34          15   
    BLACK              37           4          17          16   
    HISPANIC           22           4          12           6   

MALE                   76           8          42          26   

    WHITE              39           2          25          12   
    BLACK              23           3           9          11   
    HISPANIC           14           3           8           3   

FEMALE                 38           6          21          11   

    WHITE              16           4           9           3   
    BLACK              14           1           8           5   
    HISPANIC            8           1           4           3

First we added another variable RC. Note that the variable definition RACE has been extended to include a label for the variable RC. A modification of the table title has been added and a second stub definition. Note also that 2 and 3 stub tables can get very messy.

Home Top


Reports:

For the moment we will consider the following sections:

*FILES
...
*RECORDS
...
*REPORTS
...


First, lets examine a basic program:

*FILES    
 OLD FILE PL1TAXDATA 80 

*RECORDS    
 LASTNAME/LAST NAME/1-12
 FIRSTNAME/FIRST NAME/13-20   
 COMPANY//27-36   
     
*REPORTS    
 REPORT     
 SELECT AGE = 22  
 LIST COMPANY,LASTNAME,FIRSTNAME

Now lets go through the program:

*FILES    
 OLD FILE PL1TAXDATA 80

This is the *FILES section: It is used to define the input file to a PL1TAX program, and other global aspects of the program. In this case we are reading an input file known to the Operating System as PL1TAXDATA, whose record length is 80 characters.

*RECORDS    
 LASTNAME/LAST NAME/1-12
 FIRSTNAME/FIRST NAME/13-20   
 COMPANY//27-36

This is the *RECORDS section. It is used to define the variables used by the program. In the case the variable LASTNAME is located in columns 1 through 12, the variable FIRSTNAME is located in columns 13 through 20, and COMPANY is located in columns 27 through 36 of the input file. Note that not all columns in the input file need be accounted for.

*REPORTS    
 REPORT     
 LIST COMPANY,LASTNAME,FIRSTNAME

This is the *REPORTS section. It is used to define the content of the report. It this case we are listing 3 variables.

When run the above program would produce:

IBM       WILLIAMS    LARRY 
CDC       HARRIS      MOE   
UNIVAC    DAVIS       LARRY 
BURROUGHS MILLER      LUKE  
UNIVAC    SMITH       JOHN  
WANG      WILLIAMS    MARK  
DEC       JONES       MOE   
DEC       DAVIS       FRAN  
DEC       SMITH       CURLY 
BURROUGHS STREET      MATHEW
DEC       WILLIAMS    LUKE  
DEC       CARTER      MARK  
WANG      DAVIS       CURLY 
WANG      SMITH       ALTHEA
BURROUGHS JONES       MATHEW
PRIME     CARTER      CURLY 
WANG      SMITH       MARK  
CDC       CARTER      FRAN

Just a listing, no labels.


Now lets add a little:

*FILES   
 OLD FILE PL1TAXDATA 80 

*RECORDS    
 LASTNAME/LAST NAME/1-12
 FIRSTNAME/FIRST NAME/13-20   
 COMPANY//27-36   
   
*REPORTS    
 REPORT ='COMPANY PERSONEL',/  
 LIST COMPANY,10X,LASTNAME,10X,FIRSTNAME  
 SORT COMPANY,LASTNAME,FIRSTNAME

 

When run the above program would produce:

    
              COMPANY PERSONEL  

BURROUGHS           JONES                 MATHEW
BURROUGHS           MILLER                LUKE  
BURROUGHS           STREET                MATHEW
CDC                 CARTER                FRAN  
CDC                 HARRIS                MOE   
DEC                 CARTER                MARK  
DEC                 DAVIS                 FRAN  
DEC                 JONES                 MOE   
DEC                 SMITH                 CURLY 
DEC                 WILLIAMS              LUKE  
IBM                 WILLIAMS              LARRY 
PRIME               CARTER                CURLY 
UNIVAC              DAVIS                 LARRY 
UNIVAC              SMITH                 JOHN  
WANG                DAVIS                 CURLY 
WANG                SMITH                 ALTHEA
WANG                SMITH                 MARK  
WANG                WILLIAMS              MARK

We gave the report a heading, spaced out the listing with 10X, and SORTed the output.


Now:

*FILES   
 OLD FILE PL1TAXDATA 80 

*RECORDS    
 LASTNAME/LAST NAME/1-12
 FIRSTNAME/FIRST NAME/13-20   
 COMPANY//27-36   
 
 REPORT ='COMPANY PERSONEL',/ 
 LISTAH  COMPANY,LASTNAME,FIRSTNAME 
 SORT COMPANY,LASTNAME,FIRSTNAME

When run the above program would produce:

                           COMPANY PERSONEL  

***************************************************************************
 COMPANY     LAST NAME    FIRST NAME
***************************************************************************

BURROUGHS   JONES          MATHEW   
BURROUGHS   MILLER         LUKE 
BURROUGHS   STREET         MATHEW   
CDC         CARTER         FRAN 
CDC         HARRIS         MOE  
DEC         CARTER         MARK 
DEC         DAVIS          FRAN 
DEC         JONES          MOE  
DEC         SMITH          CURLY
DEC         WILLIAMS       LUKE 
IBM         WILLIAMS       LARRY
PRIME       CARTER         CURLY
UNIVAC      DAVIS          LARRY
UNIVAC      SMITH          JOHN 
WANG        DAVIS          CURLY
WANG        SMITH          ALTHEA   
WANG        SMITH          MARK 
WANG        WILLIAMS       MARK


Now we've used LISTAH, list with automatic headings.


Now lets expand a little:

*F    
 OLD FILE PL1TAXDATA 80 

*RECORDS    
 LASTNAME/LAST NAME/1-12
 SALARY//56-60

*REPORT
 REPORT ='COMPANY PERSONEL',/,='FOR IBM'  
 SELECT COMPANY = IBM   
 IMAGES 4   
 LISTAH LASTNAME, SALARY
 SORT -SALARY

When run the above program would produce:

                                                          COMPANY PERSONEL  
                                                              FOR IBM  
 
           ********************          ********************          ********************          ********************   
            LAST NAME    SALARY           LAST NAME    SALARY           LAST NAME    SALARY           LAST NAME    SALARY   
           ********************          ********************          ********************          ********************
   
           STREET        99548           STREET        63983           MILLER        37757           HARRIS        03806
           STREET        99283           STREET        62716           STREET        37746           MILLER        03719
           MILLER        98775           WILLIAMS      62212           MILLER        37179           HARRIS        02440
           CARTER        98602           HARRIS        61217           SMITH         37032           STREET        02121
           SMITH         98571           STREET        58786           WILLIAMS      37003           CARTER        02088
           SMITH         97552           SMITH         57522           MILLER        36931           JONES         01989
           JONES         96868           HARRIS        57264           MILLER        36593           MILLER        00792
           WILLIAMS      96521           HARRIS        57251           JONES         35602  
           WILLIAMS      94376           SMITH         57015           STREET        35225  
           CARTER        94153           HARRIS        56120           CARTER        33046  
           JONES         93655           DAVIS         55756           SMITH         32355  
           SMITH         91278           STREET        55656           DAVIS         32207  
           SMITH         90919           CARTER        55175           STREET        31455  
           CARTER        88872           CARTER        54919           STREET        30721  
           SMITH         88651           JONES         54185           SMITH         30583  
           SMITH         88027           MILLER        53756           JONES         30366  
           JONES         87239           CARTER        53083           DAVIS         30328  
           MILLER        86556           WILLIAMS      52318           MILLER        30097  
           WILLIAMS      86314           SMITH         52126           SMITH         29076  
           CARTER        85649           WILLIAMS      51452           MILLER        26256  
           MILLER        85590           CARTER        51391           SMITH         25382  
           DAVIS         84922           CARTER        50865           DAVIS         23118  
           CARTER        83867           STREET        50745           DAVIS         22836  
           CARTER        82447           STREET        50644           STREET        21409  
           JONES         82401           DAVIS         50072           STREET        21335  
           SMITH         82229           SMITH         49225           DAVIS         20551  
           DAVIS         81796           HARRIS        49060           WILLIAMS      18820  
           MILLER        80801           SMITH         48783           DAVIS         18475  
           MILLER        78646           HARRIS        48742           JONES         18014  
           WILLIAMS      78635           HARRIS        48452           DAVIS         17269  
           HARRIS        77901           JONES         48016           MILLER        17127  
           WILLIAMS      76720           WILLIAMS      47489           HARRIS        15577  
           STREET        76707           JONES         47186           HARRIS        14896  
           SMITH         75920           JONES         46998           STREET        14822  
           WILLIAMS      75712           SMITH         46774           CARTER        13288  
           STREET        75456           JONES         46691           SMITH         12624  
           WILLIAMS      74715           STREET        46571           STREET        12174  
           HARRIS        74548           HARRIS        45755           STREET        11105  
           DAVIS         73127           HARRIS        45654           CARTER        10876  
           STREET        70936           JONES         44591           DAVIS         09695  
           CARTER        69176           JONES         43844           SMITH         09462  
           DAVIS         68764           STREET        42167           MILLER        08646  
           STREET        68478           CARTER        42047           MILLER        08157  
           MILLER        67924           STREET        41884           STREET        07825  
           HARRIS        67876           JONES         41771           WILLIAMS      07544  
           WILLIAMS      67691           HARRIS        41111           HARRIS        07088  
           CARTER        66529           SMITH         41072           WILLIAMS      06071  
           HARRIS        66445           HARRIS        40821           DAVIS         06010  
           CARTER        64482           STREET        39455           MILLER        05906  
           JONES         64248           WILLIAMS      38686           STREET        04410

Here we've SELECTed IBM records, sepeified 4 IMAGES per page, and SORTed in descending order of SALARY (note - in front of SALARY).

Home Top


File/Instruction processing:

For the moment we will consider the following sections:

*FILES
...
*WORKINGSTORAGE
...
*RECORDS
...
*INSTRUCTIONS
...


Lets examine a basic program:

*FILES
 OLD FILE PL1TAXDATA 80
 OUT FILE IBMDATA 80
 OUT FILE IRSDATA 38

*WORKINGSTORAGE
 SSNL//A11

*RECORDS
 LASTNAME/LAST NAME/1-12
 COMPANY//27-36
 SSN//47-55
 SSN1//47-49
 SSN2//50-51
 SSN3//52-55
 SALARY//56-60/N

*INSTRUCTIONS

 SSNL=SSN1,'-',SSN2,'-',SSN3

 IF COMPANY = PRIME
    COMPANY = CDC
 ENDIF

 IF COMPANY=IBM
    WRITE DATA ON IBMDATA
 ENDIF

 IF SALARY > 90000
    WRITE LASTNAME,COMPANY,SALARY,SSNL ON IRSDATA
 ELSEIF SALARY < 02000
    PRINT LASTNAME,2X,COMPANY,2X,SALARY,4X,SSNL
 ENDIF

When run the above program would produce:

MILLER        CDC         00714    352-60-0981
WILLIAMS      CDC         00283    442-68-4861
STREET        CDC         00436    643-59-6650
STREET        UNIVAC      00215    757-28-4713
JONES         WANG        01021    207-57-7369
HARRIS        WANG        01258    790-52-5531
SMITH         DEC         01104    063-93-6678
CARTER        CDC         01121    518-80-5347
MILLER        CDC         01866    497-79-1760
SMITH         WANG        00369    251-82-2697
JONES         CDC         01707    474-16-8235
MILLER        WANG        00778    210-82-1718
JONES         IBM         01989    054-08-6065
MILLER        CDC         00574    581-58-3733
MILLER        IBM         00792    805-13-8948
HARRIS        DEC         00747    265-74-3465

**  PL1TAX INSTRUCTIONS/READ COUNTS  **

**  OLD               1000  READ

**  OLD               1000  SELECTED

**  PL1TAX OUTPUT FILE COUNTS  **

**  IBMDATA            157  WRITTEN

**  IRSDATA             96  WRITTEN

**  LINES               16  PRINTED

**  CPU TIME        0.0000  SECONDS
**  CPU/RECORD      0.0000  MILLISECONDS
**  CPU/SELECT      0.0000  MILLISECONDS

**  PL1TAX START  06/07/99  15:19:02  **

**  PL1TAX END    06/07/99  15:19:02  **

**  PL1TAX TOTAL  06/07/99  00:00:00  **

**  CPU/TOTAL    0.0000000  PERCENT

First notice the output files IBMDATA, and IRSDATA defined in the *FILES section. Next the variable SSNL defined in the *WORKINGSTORAGE section. In *INSTRUCTIONS the variable SSNL is filled with data. Next all occurrences of COMPANY = PRIME are changed to CDC (assume the company was sold). Next all records with COMPANY = IBM are written to the IBMDATA file. Next large SALARYs are written to the IRSDATA file and low SALARYS are printed out. Last the printed output and run statistics are displayed.

Home Top