gcraig
asked on
Splitting print job between multiple printers.
Within my VB app, I need the ability to split large print jobs between multiple printers to print simultaneously.
Any suggestions?
Any suggestions?
you can setup an array of print jobs (or pages in a print job depending on what your app does)
lets say 3 printers and 10 print jobs
array printjobs (10)
array printers (3) 'each element with printer name
then cycle that array
p=0
for n=0 to ubound(printjobs())
print printjob(n) on printer p 'i invented this syntax :)
' because you are not
'telling us how you are
'printing
p=p+1
if p=ubound(printers()) then p=0
next
clear your array and asign new print jobs to the begining
... or something like that, never done that and this is just a comment, but it should give you an idea.
just need to asign each new print job to a new array element.
lets say 3 printers and 10 print jobs
array printjobs (10)
array printers (3) 'each element with printer name
then cycle that array
p=0
for n=0 to ubound(printjobs())
print printjob(n) on printer p 'i invented this syntax :)
' because you are not
'telling us how you are
'printing
p=p+1
if p=ubound(printers()) then p=0
next
clear your array and asign new print jobs to the begining
... or something like that, never done that and this is just a comment, but it should give you an idea.
just need to asign each new print job to a new array element.
I think he is wanting to take say a 5000 page report and print 1-1000 on printer 1 1001-2000 on printer 2 and 2001- 5000 on printer 3.
If anybody has a fairly easy way of doing this in access I would be willing to post points for it as well.
Andy
If anybody has a fairly easy way of doing this in access I would be willing to post points for it as well.
Andy
Here are two simple ways:
1) The simple answer is to open the data required in known order and start printing from different starting points. Create a batch file with multiple lines starting your report.exe with a command line.
e.g.
Report.EXE A, GZZZZZZ, PrinterName1
Report.EXE H, PZZZZZZ, PrinterName2
Report.EXE Q, TZZZZZZ, PrinterName3
etc.
or for numeric keys:
Report.EXE 0, 15000, PrinterName1
Report.EXE 15001, 30000, PrinterName2
If the data does not have a unique primary key or numeric identity then you may have to loop through the data inthe required order and create a sequential identity.
Before the job starts running find the requested printer:
dim pr as printer
set pr=nothing
for each pr in printers
if pr.devicename=requestedpri nter then
set printer=pr
exit for
end if
Next
' handle invalid printer name
if pr is nothing then
msgbox "Invalid printer"
end
end if
2) Method 2 - In your page headings add 1 to a currentbatchpage counter. When the currentbatchpage>100 then swap to the next printer:
e.g.
Const PagesInBatch=100
currentbatchpage=currentba tchpage+1
If currentbatchpage>PagesInBa tch then
printer.enddoc
SetUpNextPrinter ' a sub to Set Printer=Next printer device.
end if
Ths method won't work on windows 95 or 98 clients as they are only allow a maximum of 100 pending print jobs. So in this case you must set PagesInBatch=TotalPagesReq uired/90.
1) The simple answer is to open the data required in known order and start printing from different starting points. Create a batch file with multiple lines starting your report.exe with a command line.
e.g.
Report.EXE A, GZZZZZZ, PrinterName1
Report.EXE H, PZZZZZZ, PrinterName2
Report.EXE Q, TZZZZZZ, PrinterName3
etc.
or for numeric keys:
Report.EXE 0, 15000, PrinterName1
Report.EXE 15001, 30000, PrinterName2
If the data does not have a unique primary key or numeric identity then you may have to loop through the data inthe required order and create a sequential identity.
Before the job starts running find the requested printer:
dim pr as printer
set pr=nothing
for each pr in printers
if pr.devicename=requestedpri
set printer=pr
exit for
end if
Next
' handle invalid printer name
if pr is nothing then
msgbox "Invalid printer"
end
end if
2) Method 2 - In your page headings add 1 to a currentbatchpage counter. When the currentbatchpage>100 then swap to the next printer:
e.g.
Const PagesInBatch=100
currentbatchpage=currentba
If currentbatchpage>PagesInBa
printer.enddoc
SetUpNextPrinter ' a sub to Set Printer=Next printer device.
end if
Ths method won't work on windows 95 or 98 clients as they are only allow a maximum of 100 pending print jobs. So in this case you must set PagesInBatch=TotalPagesReq
Furthermore, when pinting more than 2000 print jobs in any day you may start getting GPF's in SPOOL32.DLL. If this is the case configure the printer drivers to start printing after the last page has printed and using RAW spool format and not EMF.
exactly you send your print request with parameters, if you can know the aproximate total page count you can divide your printing (more or less what i posted before but instead of using an array of print jobs, you can use each elemnt of the array as parameters to pass (range of pages))
ASKER
Seems like I wasn't clear enough in my description, but abaldwin got the idea. It's a flat file of data which may contain between 15,000 and 50,000 pages. I don't have any code yet, still in the analysis and design stage.
I will be trying both suggestions (arana and inthedark). I don't know what effect switching printers within the code will have on the print queue of each printer.
Thanks for the suggestions, any further suggestions is still appreciated.
I will be trying both suggestions (arana and inthedark). I don't know what effect switching printers within the code will have on the print queue of each printer.
Thanks for the suggestions, any further suggestions is still appreciated.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Andy