Opening and closing ReportWriter printer channels
You can overload ReportWriter’s default printer interface with user-supplied routines to open and close the output channel for the Print report and Generate report file functions.
RW_PRTOPEN_METHOD
subroutine RW_PRTOPEN_METHOD
a_channel ,n ;Returned as the channel for output (d2)
a_file ,a ;Either name of report file to generate, if
; print_flag is zero, or unique filename
; that may be used for temporary file storage,
; if print_flag is nonzero (a30)
a_prnt_flg ,n ;Indicates whether report is being printed (d1)
; 0 Generate report file; do not print it.
; 1 Print report.
a_quit ,n ;Returned with true if no further report
; generation should occur (d1)
a_mode ,n ;Optional, file open mode. If passed and nonzero
; output file will be opened in append mode.
; Otherwise, it will be opened in creation mode (d1)
Discussion
Use RW_PRTOPEN_METHOD to open a file and output channel for printing. The version of this routine linked with the original ReportWriter distribution opens the specified file and returns the channel. If an error occurs on open, a_quit is returned with the error code. Any user-overloaded version of this routine should at minimum perform these functions. ReportWriter outputs the report to the channel returned in a_channel, using the Synergy DBL WRITES and FORMS statements.
Examples
This is the version of RW_PRTOPEN_METHOD that is linked with your original ReportWriter distribution.
subroutine rw_prtopen_method
;
; Description: Printer open routine for ReportWriter
;
; Arguments:
;
a_chan ,n ;Output channel (incoming unassigned)
a_file ,a ;A unique filename which may be used
a_qflg ,n ;Queue flag - 1 = Print, 0 = Create file
a_quit ,n ;Returned true if no further report generation should occur
a_mode ,n ;Optional file open mode
.include "WND:tools.def"
.include "RPT:rptmsg.def"
record
line ,a80
linlen ,d2
proc
.ifdef D_VMS
;If this is printing on an OpenVMS system, use the O:S format
if (a_qflg) then
line = "/SI=96/DEQ=96/BUFNUM=2/BUFSIZ=16/IO=O:S"
else
.endc
;Part of the above 'else'
clear line
if (%passed(a_mode)) then
begin
if (a_mode) then
xcall u_open(a_chan, 'A', a_file, line,, a_quit)
else
xcall u_open(a_chan, 'O', a_file, line,, a_quit)
end
else
xcall u_open(a_chan, 'O', a_file, line,, a_quit)
if (a_quit)
begin
xcall ru_sbld(line, linlen, MSG_OOPNERR, a_file)
xcall u_message(line(1:linlen), D_ERROR)
end
xreturn
endsubroutine
RW_PRTCLOSE_METHOD
subroutine RW_PRTCLOSE_METHOD
a_chan ,n ;Channel used for output (d2)
a_file ,a ;Filename passed to RW_PRTOPEN_METHOD (a30)
a_pflg ,n ;Indicates whether report is being printed (d1)
; 0 Generate report file; do not print it.
; 1 Print report.
Discussion
Use RW_PRTCLOSE_METHOD to close the channel used for printing and the file. The version of this routine linked with the original ReportWriter distribution closes the channel specified by a_chan, and if a_pflg is true, the file specified by a_file is submitted to the queue via the Synergy DBL LPQUE statement. At a minimum, any user-supplied version of this routine must close a_chan.
Examples
This is the version of RW_PRTCLOSE_METHOD that is linked with your original ReportWriter distribution.
subroutine rw_prtclose_method
;
; Description: ReportWriter printer close routine
;
; Arguments:
;
a_chan ,n ;Channel on which output performed
a_filnam ,a ;Filename passed to RW_PRTOPEN_METHOD
a_qflg ,n ;0 = Generating report file; don't print
;1 = Output to printer
.include "WND:tools.def"
.include "RPT:rptmsg.def"
proc
xcall u_close(a_chan)
if (a_qflg)
begin
xcall e_state(D_ON, D_INTR) ;Allow interrupt
onerror noprt
lpque(a_filnam, DELETE)
offerror
xcall e_state(D_OFF, D_INTR) ;Disallow interrupt
end
xreturn
noprt,
offerror
xcall ru_message(MSG_NOPNTR, D_ERROR)
xcall e_state(D_OFF, D_INTR) ;Disallow interrupt
xreturn
endsubroutine
Here’s another example:
subroutine rw_prtclose_method
;
;Description: Processes printer close for ReportWriter
;
;Arguments:
;
a_channel ,n ;Channel used for output. Must be closed by routine
a_filename ,a ;Filename passed to RW_PRTOPEN_METHOD
a_genprt ,n ; 0 - Generate report file - do not print
; 1 - Printer output
;
;Notes:
; This subroutine is called when ReportWriter is finished
; generating a printed report.
;
; This routine requires an external file that has the following
; format:
;
; "Name you want user to see", "LPQUE queue name"
;
; In other words, the format is a single quoted string with the name
; you want your users to see, followed by a comma, followed by
; another quoted string with the queue name LPQUE uses for printing
; on the particular device.
;
; This file is named PRT:print.lst, although you can change the
; filename by changing the OPEN statement in the fifth line after
; the PROC statement.
;
; In addition, the following needs to be placed in the window script
; file opened as win_libchn:
;
; --------------------------------------------------------
;
; print.wsc - window script file for rw_prtclose_method
;
;---------------------------------------------------------
;;
;; Menu column definition
;;
;.column s_select, "Selection functions"
;.entry s_down, "Next selection", key(down)
;.entry s_up, "Prior selection", key(up)
;.end
; --------------------------------------------------------
;
.include "WND:tools.def"
.include "WND:windows.def"
.define ITEMS, 10
.align
static record
win_libchn ,i4 ;Window library channel
colid ,i4 ;Column ID for input window
wndid ,i4 ;Input window ID
list_ix ,i4 ;List index
name ,ITEMS a30 ;List of printer names
device ,ITEMS a15 ;List of printer system device names
.align
record
file_chn ,i4 ;File channel
error ,i4 ;Error number
start_loc ,i4 ;Start of parse string
end_loc ,i4 ;End of parse string
sel_printer ,i4 ;Selected printer
status ,i4 ;Status of routine
prt_name ,a40 ;Printer name
prt_device ,a15 ;Printer's device name for operating system
wnd_name ,a25 ;Window name
buffer ,a80 ;Buffer for buffered output
item_pos ,ITEMS d2 ;Item position list for s_parse
item_length ,ITEMS d2 ;Item length list for s_parse
item_type ,ITEMS d2 ;Item type list for s_parse
num_items ,d2 ;Number of items for s_parse
proc
xcall u_close(a_channel)
if (.not.list_ix) ;Has list been loaded?
begin
xcall u_open(file_chn, 'I', "PRT:print.lst",,, error)
if (error)
goto no_print
repeat
begin
reads(file_chn, buffer, err)
if (buffer(1:1).eq.';') ;Comment line
nextloop
call get_prtinfo
incr list_ix ;Load lists
name[list_ix] = prt_name
device[list_ix] = prt_device
end
err,
xcall u_close(file_chn)
end
if (.not.win_libchn) ;Has window library been loaded?
begin
xcall u_open(win_libchn, 'I:I', "PRT:print",,, error)
if (error)
goto no_winlib
end
xcall e_enter
xcall m_column(D_REMOVE, D_LOCAL) ;Remove unprocessed columns
xcall m_ldcol(colid, win_libchn, "s_select", D_NOPLC)
if (.not.wndid)
xcall s_selbld(wndid, 'PRINTERS', list_ix, 15, name)
xcall w_brdr(wndid, WB_TITLE, "Select a printer", WB_TPOS, WBT_TOP, WB_TON)
xcall u_window(D_PLACE, wndid, 5, 5)
while (.not.sel_printer) do
begin
xcall s_select(wndid, 1,, colid, sel_printer)
case (g_entnam) of
begincase
"O_EXIT": exitloop
"O_CANCEL": exitloop
endcase
else
begin
xcall u_beep
nextloop
end
end
if (.not.sel_printer)
begin
xcall u_message("No printer was selected,using default printer.")
sel_printer = device[1]
end
if (FALSE)
begin
no_winlib,
xcall u_message("PRT:print was not found,using default printer.")
sel_printer = device[1]
end
if (a_genprt)
begin
xcall e_state(D_ON, D_INTR)
onerror ($ERR_IOFAIL) no_print
lpque(a_filename, LPNUM:device[sel_printer], DELETE)
offerror
xcall e_state(D_OFF, D_INTR) ;Disallow interrupt
end
cleanup,
xcall e_exit
xreturn
get_prtinfo,
xcall s_parse(buffer, start_pos, 10, item_pos, item_length,
& item_type, num_items, end_pos)
return
no_print,
xcall u_message("File not printed. Filename was: " + a_filename)
goto cleanup
endsubroutine
