Omnis Technical Note TNPR0004
Report Class Prints Itself
For Omnis Studio version 1.2
By Michael Monschau
How to code report classes which implement their
own printing loop.
Contents
The correct way
More than one method
Printing a list
Printing Omnis data
Opening the Job Setup Dialog
Finally
The correct way
There is never just one correct way to do something. Consistency and reusability
however are
some of the keys to successful development. Reusability is addressed easily
by using inheritance. Consistency can be very difficult to achieve and
is not within the scope of this Technical Note.
Our example is based on the idea that the report class we create shall
be used as a super class to
all other report classes we develop. Therefore the methods we create for
it have to cater for all our development needs. They need to be flexible
and we may need more then one.
More than one method
Coding a report which prints itself. I can think of several ways to go
about it. Here are two of them.
We can code everything in the $construct of the report class. So the calling
code can simply say
'Do myReport.$open()'. However this restricts us to only one way of printing
the report, unless we
want the make the method and its parameters very complex and difficult
to understand.
My preferred way is to write one or more public methods which print the
report. This means when we want to print the report, we will have to make
two calls. One to open the report and the second to print
it. Ok it is an extra call, but it is far cleaner and more intuitive.
Do myReportClass.$open('instName') returns repInst
Do repInst.$print()
Printing a list
We shall call our method $printlist. It will have three parameters,
a field reference to the list, a boolean
telling as to print all rows or just the selected rows, and another boolean
telling us whether to open the
job setup dialog.
##### Method '$printlist'
##### |
No. Parameter |
Type |
Subtype |
Init.Val/Calc |
1 |
pList |
Field reference |
2 |
pSelectedOnly |
Boolean |
3 |
pOpenJobSetup |
Boolean |
|
No. Local Variable Type |
|
Subtype |
Init.Val/Calc |
1 |
ok |
Boolean |
kTrue |
2 |
theRow |
Item reference |
|
|
1 |
; call method to open job setup if
we are asked to |
2 |
If pOpenJobSetup |
3 |
|
Do method openJobSetup Returns ok |
4 |
End If |
5 |
If ok |
6 |
|
; fetch the first row |
7 |
|
Set reference theRow to pList.$first(pSelectedOnly) |
8 |
|
While theRow&ok |
9 |
|
|
; first load the crb fields from
the list row |
10 |
|
|
Do row.$loadcols() |
11 |
|
|
; now print a record |
12 |
|
|
Do $cinst.$printrecord() Returns
ok |
13 |
|
|
; fetch next row |
14 |
|
|
Set reference theRow to pList.$next(theRow,pSelectedOnly) |
15 |
|
End While |
16 |
|
; if everything went well finish
off |
17 |
|
If ok |
18 |
|
|
Do $cinst.$endprint() Returns ok |
|
19 |
|
End If |
|
20 |
End If |
|
21 |
; if something went wrong close the
instance |
|
22 |
If not(ok) |
|
23 |
|
Do cinst.$close() |
|
24 |
End If |
|
Printing Omnis data
We shall call our method $printOmnisData(). It will have two
parameters, a search string for filtering records, and a boolean telling
us whether to open the job setup dialog.
##### Method '$printlist'
##### |
No. Parameter |
Type |
Subtype |
Init.Val/Calc |
1 |
pSearchString |
Character |
10000 |
2 |
pOpenJobSetup |
Boolean |
|
|
No. |
Local Variable |
Type |
Subtype |
Init.Val/Calc |
1 |
ok |
Boolean |
|
kTrue |
|
|
|
|
|
No |
Method text |
1 |
; call method to open job setup if
we are asked to |
2 |
If pOpenJobSetup |
3 |
|
Do method openJobSetup Returns ok |
4 |
End If |
5 |
; print |
6 |
If ok |
7 |
|
; set the main file name from the
class which inherits this class |
8 |
|
Begin reversible block |
9 |
|
|
Set read-only files {[$cinst.$class().$mainfile]} |
10 |
|
|
Set main file {[$cinst.$class().$mainfile]} |
11 |
|
End reversible block |
12 |
|
; set the search if one has been
specified |
13 |
|
If len(pSearchString) |
14 |
|
|
Set search as calculation {evalf(pSearchString)} |
15 |
|
Else |
16 |
|
|
Clear search class |
17 |
|
End If |
18 |
|
; the main printing loop |
19 |
|
Find first (Use search) |
20 |
|
While ok&#F |
21 |
|
|
Do $cinst.$printrecord() Returns
ok |
22 |
|
|
Next (Use search) |
23 |
|
End While |
24 |
|
; finish off |
25 |
|
Do $cinst.$endprint() |
26 |
|
Clear search class |
27 |
End If |
28 |
; if something went wrong close the
instance |
29 |
If not(ok) |
30 |
|
Do cinst.$close() |
31 |
End If |
|
|
Opening the Job Setup
Dialog
We will write a common private method which is responsible for
opening the Job Setup dialog, when
so requested. This method will be called by our public methods $printList
and $printOmnisData.
##### Method 'openJobSetup' ##### |
No. |
Local Variable |
Type |
Subtype |
Init.Val/Calc |
1 |
ok |
Boolean |
|
|
|
No. |
Method text |
1 |
; we only want to open the job setup
if we are printing |
2 |
; to the Printer, Memory or Disk
(optional) |
3 |
Switch $cdevice.$ident |
4 |
|
Case kDevPrinter,kDevMemory,kDevDisk |
5 |
|
|
; force the job setup dialog by passing
kTrue |
6 |
|
|
Do $cinst.$openjobsetup(kTrue) Returns
ok |
7 |
|
Default |
8 |
|
|
Calculate ok as kTrue |
|
9 |
End Switch |
10 |
Quit method ok |
Finally
In order to try our report, create
a report class from an Omnis file class for which you have some data.
Use the Omnis report wizard from the component store. Once created set
the superclass name to the name of
We should now be able to say
Do $clib.$reports.fileReport.$open('instName')
Returns theInst
Do theInst.$printOmnisData('',kTrue);
Also try entering some search criteria i.e. 'myField=x'.
Download RTF Document