Don’t Clone That Printer File!
February 6, 2013 Hey, Ted
I have a program that uses an externally described printer file to create a report. I need to change the program so that it writes some information to one spooled file and the remaining information to a separate spooled file. I could clone the printer file, but that would mean I’d have to change two files instead of one when I modify the report file in the future. Do I have to clone the printer file?
No, Mark, you can build two or more reports from one printer file definition. Here’s how it’s done.
Let’s start with a printer file, QAD001P.
A REF(QCUSTCDT) A R HEADER SKIPB(1) SPACEA(1) A TITLE 40 1 A R DETAIL SPACEB(1) A CUSNUM R 1 A LSTNAM R + 1 A INIT R + 1 A CITY R + 1 A STATE R + 1 A R FOOTER SPACEB(2) A 1'** End of report **'
Here’s program QAD001R, which uses the printer file to build a report.
Fqcustcdt if e k disk Fqad001p o e printer /free *inlr = *on; title = 'Customers'; write header; dow '1'; read cusrec; if %eof(); leave; endif; write detail; enddo; write footer; return;
Let’s modify the program to put Texas customers on one report and everybody else on another one. Here’s what we do:
1. Define the report twice in the program. You can use any name that suits you. I’ve used the clever names REPORT1 and REPORT2.
2. Since two files cannot have a record format of the same name, rename the report formats for all but one of the files. In this example, I chose to rename the formats in both printer files, even though renaming the formats of one file would have sufficed.
3. Change the program to reference the new record formats as required.
Here’s the modified program.
Fqcustcdt if e k disk Freport1 o e printer F rename(header: header1) F rename(detail: detail1) F rename(footer: footer1) Freport2 o e printer F rename(header: header2) F rename(detail: detail2) F rename(footer: footer2) /free *inlr = *on; title = 'Texas only'; write header1; title = 'All but Texas'; write header2; dow '1'; read cusrec; if %eof(); leave; endif; if state = 'TX'; write detail1; else; write detail2; endif; enddo; write footer1; write footer2; return;
To compile the program, override both printer files to the original printer file.
ovrprtf report1 tofile(qad001p) ovrprtf report2 tofile(qad001p) crtbndrpg pgm(qad001r) srcfile(mylib/qrpglesrc)
You must also override the files at run time. Use the Spool File Name (SPLFNAME) parameter to distinguish the two reports.
pgm ovrprtf report1 tofile(qad001p) splfname(Texas) ovrprtf report2 tofile(qad001p) splfname(NoTexas) call qad001r endpgm