|
PL1TAX Tutorial |
|
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 ...
*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
*FILES OLD FILE PERSONAL 80This 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//24This 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-99This 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
*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.
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 80This 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-36This 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,FIRSTNAMEThis 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 FRANJust 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 MARKWe 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.
*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 04410Here we've SELECTed IBM records, sepeified 4 IMAGES per page, and SORTed in descending order of SALARY (note - in front of SALARY).
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.