4GL design - select printers
Posted in 1991
Informix 4GL design techniques...
I am designing stuff in a vacuum, input welcome. Please feel free to comment
or make suggestions on improvements.
In order to provide flexibility in generating reports from 4GL ie.
spooling reports to various printers I set up the following:
create table syspcmd (
rcdnum serial not null,
reportid char(8) not null, "Identifing report by name, duplicates"
cmddflt char(1), " "Y" identifies default printer "
cmdprt char(40) not null, "lp spooler command"
cmddesc char(25), "discription/location of printer "
prtclass char(1) ); "unused at present"
examples
34|SERAINV1||lp -s -o12 -o-FF -dlaser2|DP - Laser||
35|SERAINV1||lp -s -o12 -dti880|DP - TI880||
33|SERAINV1|Y|lp -s -o12 -oT1 -dlaser1|HLA - Laser Tray 1||
then
print_pipe char(40),
condition_val integer
call select_printer("Select printer for: Sera Inventory", "SERAINV1")
returning print_pipe, condition_val
if condition_val = 1 then
message "Print aborted"
sleep 2
exit program (condition_val)
end if
.
.
.
start report xxxx to print_pipe
function select_printer(hdr, rptid)
{ syspcmd table contains Unix printer spooler commands. This routine loads
the first 10 commands for the user to choose from. The first record that
has command default = "Y" is used as the default. If there are any more
then 10 commands they are ignored. }
define
hdr char(40),
rptid char(8),
xrptid char(12),
inst_row integer,
ps array[10] of record
cmddflt like syspcmd.cmddflt,
cmddesc like syspcmd.cmddesc,
cmdprt like syspcmd.cmdprt
end record,
pc array[10] of record
prtclass like syspcmd.prtclass
end record,
prt char(40),
x,d,n,user_esc smallint,
ans char(1),
condition_val integer
let inst_row = 24
let xrptid = rptid clipped, "%"
declare spoolc cursor for
select cmddflt, cmddesc, cmdprt, prtclass
from syspcmd where reportid like xrptid
let x = 1
let d = 0
foreach spoolc into ps[x].cmddflt, ps[x].cmddesc,
ps[x].cmdprt, pc[x].prtclass
{get a default spooler command, pick the first one }
if ps[x].cmddflt = "Y" then let d = x end if
let x = x + 1
if x > 10 then exit foreach end if
end foreach
let x = x - 1
if d = 0 then let d = 1 end if {NO DEFAULT SPECIFIED}
if x = 0 then {NO PRINTERS DEFINED FOR THIS REPORTID}
let x = 1
let d = 1
let ps[x].cmddflt = "Y"
let ps[x].cmdprt = "lp -s"
let ps[x].cmddesc = "NO PRINTERS DEFINED"
let pc[x].prtclass = " "
end if
open form fspool from "bin/sy_pcmd"
display form fspool
display hdr at 1,1
let user_esc = true
let condition_val = 0
let int_flag = 0
while user_esc = true
display "" at inst_row,1
display " ", "DEL(abort)" at inst_row,1 attribute(reverse)
display ps[d].cmdprt, ps[d].cmddesc to xcmd, xdesc
for n = 1 to x
display ps[n].* to s_array[n].* attribute(underline)
end for
input by name ans
if ans <> "Y" then
display "" at inst_row,1
display " ", "F1(select) DEL(abort)" at inst_row,1 attribute(reverse)
call set_count(x)
display array ps to s_array.* attribute(underline)
on key (F1)
let d = arr_curr()
let user_esc = false
exit display
on key (INTERRUPT)
exit display
end display
display ps[d].cmdprt, ps[d].cmddesc to xcmd, xdesc
else
let user_esc = false
end if
end while
if int_flag <> 0 then
let condition_val = 1
end if
close form fspool
clear screen
return ps[d].cmdprt, condition_val
end function
*** sy_pcmd.per
database formonly
screen
{
Default printer command:[pd ]
[pc ]
Enter Y(Default) N(Choose):[e]
Dflt Description Spooler Command
[d|c |s ]
[d|c |s ]
[d|c |s ]
[d|c |s ]
[d|c |s ]
[d|c |s ]
[d|c |s ]
[d|c |s ]
[d|c |s ]
[d|c |s ]
}
attributes
pc = formonly.xcmd type char, reverse;
pd = formonly.xdesc type char, reverse;
e = formonly.ans type char, upshift, default = "Y", include = ("Y", "N"),
required, reverse, comments = "Enter Y or N and press return";
d = formonly.deflt type char;
s = formonly.spooler type char;
c = formonly.desc type char;
instructions
screen record s_array[10] (formonly.deflt, formonly.desc, formonly.spooler);
delimiters " ";
end
Michael J. Kuhn Consultant phone :301-254-7060 e-mail :c/o Baltimore Rh Typing Laboratory, Inc. phone :301-225-9595 uunet!rhlab!kuhn