STATEMENT - two page formats

 

Top  Previous  Next

In this sample, a two-page, plain paper statement is printed.  The two pages contain two slightly different formats, with the second page containing detail lines and a customer aging, and the first page containing some more detail lines and the phrase "CONTINUED" at the bottom.  In the same statement print run, some statements may contain a single page, others two or more pages.

 

The trick here is to get UnForm to produce two formats based on the content of each page.  In order to accomplish this, we define the job to produce multiple copies, and assign certain copies to certain formats.  Using a precopy{} code block, we can then control the printing of the different formats.

 

uf101c –i sample2.txt –f advanced.rul –p pdf –o client:statement.pdf

 

 

This statement header identifies this rule set.

 

[Statement]

 

The word STATEMENT appears at column 34, row 2, and a date appears at column 65, row 7.  To further clarify, a date format is matched at position 65, 7.

 

detect 34,2,"STATEMENT"

detect 65,7,"~../../.."                                # statement date

 

 

 

The page dimensions are 66 rows and 75 columns.  The text input to UnForm doesn't contain any form-feeds to indicate the end of a page, so the command "page 66" tells UnForm to consider each 66 lines to be a page.

 

Pcopies 4 is used to tell UnForm to print 4 copies of each page, with copies following each other in sequence for each page (collated).  You will find later that UnForm doesn't actually print all copies of each page, but instead simply prints selected copies, depending on the format required.  As each page is processed, if the page contains aging totals, UnForm prints 2 copies of that format, and if it does not contain aging totals, then UnForm prints 2 copies of the second format.

 

# set up document constants

const MAXCOLS=75                                        # max cols to output

const MAXRCOLS=74                                        # MAXCOLS-1

const LEFTCOL=1                                        # use 1 if empty

const RIGHTCOL=75                                        # MAXCOLS for symmetry

const MAXROWS=66                                        # max rows to output

 

portrait

dpi 300

gs on                                                        # graphical shading

cols MAXCOLS                                                # max output columns

rows MAXROWS                                                # max output rows

page MAXROWS                                                # no form-feeds used

 

# to print more copies, increase value and add copy titles in prejob

# Copy 1,2        Statement with aging totals

# Copy 3,4        Statement w/o  aging totals

pcopies 4                                                        # max # of copies

 

 

If this rule set is used to produce a PDF document, then the title "Statement Sample" will be added to the PDF file.  For laser output, the title command is ignored.

 

title "Statement Sample"                                # view in PDF properties

 

 

The prejob command defines a string variable form_title$, assigning it the value "STATEMENT".  This variable is used later in the rule set for a page heading and also in a watermark.

 

prejob {

 # set up variables needed by merged routines below

 # if form title changes per page,

 # set up in prepage routine below

 form_title$="STATEMENT"

}

 

 

The prepage code block performs 2 functions.  It checks the input data for the word "CONTINUED" at position 66, 64.  If that word is present, then a variable continued$ is assigned to the phrase "Continued"; otherwise it is set to null.  In addition, at three individual lines (16, 62, and 64), there may be single ! characters used as character-mode vertical lines in the input data.  Elsewhere in the rule set is a 'vline "!!", erase' command, which erases instances of 2 or more ! characters vertically on the page.  This code takes care of the single-row instances.

 

prepage {

 # get continued if it exists

 continued$=get(66,64,9)

 if continued$="CONTINUED" then continued$="Continued" \

         else continued$=""

 

# remove single ! from line draw regions

       x=pos("!"=text$[16]); \

       while x>0; text$[16](x,1)="",x=pos("!"=text$[16]);wend

 

       x=pos("!"=text$[62]); \

       while x>0; text$[62](x,1)="",x=pos("!"=text$[62]);wend

 

       x=pos("!"=text$[64]); \

       while x>0; text$[64](x,1)="",x=pos("!"=text$[64]);wend

 

}

 

 

The precopy code block is executed as each of the 4 copies are about to be printed.  The logic here indicates the copies 1 and 2 are for pages that do not contain the word "CONTINUED" (remember the prepage code block?), and copies 3 and 4 do contain that word.  By setting the variable skip to a non-zero value, the copy being processed is skipped.  Only 1 of the 2 formats is printed, depending on the content of the page.

 

precopy {

 if copy=1 or copy=2 then if continued$="Continued" then skip=1

 if copy=3 or copy=4 then if continued$<>"Continued" then skip=1

}

 

 

The following lines remove most of the existing character-mode line drawing elements from the input data.  The hline and vline commands scan for places where at least the indicated number of characters, horizontally or vertically, occur on the page.  The erase option removes them rather than replacing them with graphical lines.

 

#remove existing lines

hline "--",erase

hline "==",erase

vline "!!",erase

cerase 1,1,1,MAXROWS                                        # erase all 1st column

cerase MAXCOLS,1,MAXCOLS,MAXROWS                        # erase all last column

 

 

The following lines draw the page headings.  Some of the commands are stored in another rule set, "Mrg Form Header", which is merged as the rule set is parsed.  The headings already exist, and are moved and fonted with text commands using expressions, such as {cut(66,5,4,"")}.

 

# heading section

const HFONT=univers,12                                        # headings

cerase 1,1,MAXCOLS,10

cbox LEFTCOL,1,RIGHTCOL,MAXROWS,5                        # complete page box

merge "Mrg Form Header"                                        # merge std hdr rules

 

# right top ribbon section

const HFONT=univers,11,italic                                # headings

const DFONT=cgtimes,11,bold                                # data

# draw info box with internal grid and shading

# horizontal line at 6

# vertical line at 68 with shading between 63 and 68

cbox 63,5,MAXCOLS,9,5,crows=7,ccols=68::20

text 64,6,{cut(66,5,4,"")},HFONT                        # page #

text 64,8,{cut(59,7,4,"")},HFONT                        # date

text 69,6,{trim(cut(71,5,3,""))},DFONT                # page #

text 69,8,{trim(cut(65,7,8,""))},DFONT                # date

 

# customer section

# draw info box with internal grid and shading

# vertical line at 10 with shading between 1 and 10

cbox LEFTCOL,10,MAXCOLS,15,5,ccols=10::10

text 2,11,{cut(2,10,2,"")},HFONT                        # to

text 4,13,{trim(cut(15,10,10,""))},DFONT                # cust code

cfont 12,11,MAXCOLS,14,DFONT                                # address

 

 

The detail section contains several columns of information.  There are fewer detail lines on pages with the aging data, so the grid drawing is made specific to particular formats with "if copy 1,2" and "if copy 3,4" sections.  Then two groups of font changes are used, first for the column headings and then for the data columns.

 

# detail section

# detail headings

# draw info box with internal grid and shading

# horizontal line at 6

# vertical line at 68 with shading between 63 and 68

if copy 1,2

 cbox LEFTCOL,15,MAXCOLS,56,5,crows=17::20, \

         ccols=10 18 27 39 48 60 63

end if

if copy 3,4

 cbox LEFTCOL,15,MAXCOLS,61,5,crows=17::20, \

         ccols=10 18 27 39 48 60 63

end if

const ROW=16

cfont 2,ROW,9,ROW,HFONT,center                                # date

cfont 11,ROW,17,ROW,HFONT                                        # inv #

cfont 19,ROW,26,ROW,HFONT,center                                # due date

cfont 28,ROW,38,ROW,HFONT,right                                # due amt

cfont 40,ROW,47,ROW,HFONT,center                                # pmt date

cfont 49,ROW,59,ROW,HFONT,right                                # pmt amt

cfont 61,ROW,62,ROW,HFONT,center                                # type

cfont 64,ROW,MAXRCOLS,ROW,HFONT,right                        # balance

# detail data

const DFONT=cgtimes,11                                                # data

cfont 2,18,9,60,DFONT,center                                        # date

cfont 11,18,17,60,DFONT                                                # inv #

cfont 19,18,26,60,DFONT,center                                # due date

cfont 28,18,38,60,DFONT,right                                        # due amt

cfont 40,18,47,60,DFONT,center                                # pmt date

cfont 49,18,59,60,DFONT,right                                        # pmt amt

cfont 61,18,62,60,DFONT,center                                # type

cfont 64,18,MAXRCOLS,60,DFONT,right,BOLD                # balance

 

 

A watermark prints the form title as large, lightly shaded text.  Its position depends upon the format, hence the use of if copy blocks.

 

# watermark - large font with light shading and rotation

if copy 1,2

 text 39,56,{form_title$},cgtimes,75,shade 20,center, \

         cols=MAXCOLS,rotate 90

end if

if copy 3,4

 text 44,61,{form_title$},cgtimes,85,shade 20,center, \

         cols=MAXCOLS,rotate 90

end if

 

 

The footer section differs considerably between the two formats.  Copies 1 and 2 are associated with pages that have aging data, so you see the fonting of the aging columns defined there.  Copies 3 and 4 are printed when the word "CONTINUED" appears, and that word is printed below, though as the value stored in continued$ ("Continued").

 

# footer section

# remarks

if copy 1,2

 cbox LEFTCOL,56,RIGHTCOL,61,5

 cfont 2,57,MAXRCOLS,60,HFONT

endif

# totals

const DFONT=cgtimes,11,bold                                        # data

if copy 1,2

 cbox LEFTCOL,61,RIGHTCOL,64.5,5,crows=63::20, \

         CCOLS=14 26 38 50 62

 const ROW=62

 cfont 1,ROW,13,ROW,HFONT,right                                # current

 cfont 15,ROW,25,ROW,HFONT,right                                # 1-15

 cfont 27,ROW,37,ROW,HFONT,right                                # 16-30

 cfont 39,ROW,49,ROW,HFONT,right                                # 31-45

 cfont 51,ROW,61,ROW,HFONT,right                                # over 45

 cfont 63,ROW,MAXRCOLS,ROW,HFONT,right,bold,12        # total due

 const ROW=64

 cfont 1,ROW,13,ROW,DFONT,right                                # current

 cfont 15,ROW,25,ROW,DFONT,right                                # 1-15

 cfont 27,ROW,37,ROW,DFONT,right                                # 16-30

 cfont 39,ROW,49,ROW,DFONT,right                                # 31-45

 cfont 51,ROW,61,ROW,DFONT,right                                # over 45

 cfont 63,ROW,MAXRCOLS,ROW,DFONT,right,bold,12        # total due

endif

 

if copy 3,4

 cerase 1,62,MAXCOLS,66

 text 1,65,{Continued$},HFONT,right,cols=MAXRCOLS

endif

 

 

Finally, within the two formats are two physical copies.  Each of these copies is either for the customer to keep or for the customer to return with their payment.  Copy 1, the first page of format 1, and copy 3, the first page of format 2, get the "Customer Copy" footer.  The others get the "Remittance Copy" footer.

 

# copy name section

const ROW=65.5

if copy 1,3

 text 1,ROW,"Customer Copy",HFONT,bold,center,cols=MAXCOLS

end if

if copy 2,4

 text 1,ROW,"Remittance Copy",HFONT,bold,center,cols=MAXCOLS

end if