The final script of this volume turns the personnel table on its side to illustrate more uses of the MAXWIDTH function and the ability to go through the same set of records several times. That is, instead of the table looking like this:
number name phone credit_limit value value value value value value value value value value value value value value value value
it now looks like this:
number value value value value name value value value value phone value value value value credit_limit value value value value
Rotating a table through 90 degrees may sound trivial, but presents several problems when examined in detail. For example, how wide should the new columns be? In order for everything to fit, they must actually be as wide as the widest entry in the entire original table. Similarly, since the records are being printed across the line instead of down the page, there is a definite possibility that the new table will be too wide for the page.
In the script below, all the records are selected from the personnel table, and the maximum width of each attribute is found. These widths are then compared to find the widest, which is then used as the width for all the new columns (so that all the data will fit), plus a couple of spaces between the columns.
We do a simple check that the table will actually fit across the page by finding the number of records and multiplying this by the new column width to find the entire width of the table. If it will not fit, an error message is printed.
The data is printed by going through all the records four times, printing number, name, phone, and credit limit, respectively, on successive passes.
Here is the script:
LET DATABASE = "repairs"; SELECT FROM personnel; LET numberwidth = MAXWIDTH number; LET namewidth = MAXWIDTH name; LET phonewidth = MAXWIDTH phone; LET creditwidth = MAXWIDTH credit_limit; LET widest = 0; IF numberwidth > widest LET widest = numberwidth END; IF namewidth > widest LET widest = namewidth END; IF phonewidth > widest LET widest = phonewidth END; IF creditwidth > widest LET widest = creditwidth END; LET widest = widest + 2; LET recno = COUNT name; IF (recno * widest + 8)<= PAGEWIDTH/* 8 is width of Number + 2 */ PRINT "Number" width 8; FOR EACH GROUP OF name PRINT number WIDTH widest; END; NEWLINE; PRINT "Name" width 8; FOR EACH GROUP of name PRINT name WIDTH widest; END; NEWLINE; PRINT "Phone" width 8; FOR EACH GROUP OF name PRINT phone WIDTH widest; END; NEWLINE; PRINT "Credit" width 8; FOR EACH GROUP OF name PRINT credit_limit PIC G$FF9V.99" width widest; END; ELSE PRINT "Table is too wide for page", NEWLINE; END;
The output is shown below (minus extra blank lines from the end). Only the first four records from personnel are shown, otherwise, the table is too wide for the page!
Number 3 4 5 8 Name Jones Scarlatti Mosca Peterson Phone (415)667-2951 (416)961-7363 (415)426-9681 (415)978-6060 Credit $500.00 $100.00 $750.00 $250.00