AGINGREPORT - enhanced Aging report |
Top Previous Next |
In this third example, an aging report is enhanced to be more readable. This shows the use of relative enhancements, which are those applied relative to the occurrence of text or regular expressions anywhere on the page.
uf101c –i sample3.txt –f advanced.rul –p pdf –o client:aging.pdf
This statement header identifies this rule set.
[AgingReport]
The only detect statement required is this one, looking for the report title at column 50, row 2.
detect 50,2,"Detail Aging Report"
These constants are used throughout the rule set.
# set up document constants const MAXCOLS=131 # max cols to output const MAXRCOLS=130 # MAXCOLS-1 const LEFTCOL=.5 # use 1 if empty const RIGHTCOL=131.5 # LEFTCOL for symmetry const MAXROWS=66 # max rows to output
This report should print in landscape orientation, rather than the default portrait. UnForm will scale the columns and rows to 131 by 66.
landscape dpi 1200 gs on # graphical shading cols MAXCOLS # max output cols rows MAXROWS # max output rows
pcopies 1 # max # of copies
The title "Aging Sample" will appear in PDF document properties. It is ignored for laser output.
title "Aging Sample" # view in PDF properties
The following prejob code demonstrates the use of sdOfficeÔ to mine data from this report and export it to Microsoft ExcelÒ. SdOffice can be running anywhere on your network on a system with Excel. The code relies on your setting two variables correctly. First, the sdo$ variable should be set to the path to the sdOffice client program sdofc_e.bb. In addition, the value of gbl("$sdhost") needs to be set to the address or hostname of the system running sdOffice. An optional way of doing this is to define an environment variable prior to running UnForm, called SDHOST. If you use that alternative, then comment out the x$=gbl("$sdhost") line.
The code here contains enough error handling to ignore the code if sdOffice isn't present or fails to execute.
prejob { # set up sdOffice export to Excel # set to path to your sdoffice *.pv programs sdo$="/u0/sdofc/sdofc_e.pv"
# You can set the environment variable SDHOST, or use this # stbl function to define the sdOffice server address x$=gbl("$sdhost","bcj")
# initialize excel call sdo$,err=prejob_done,"newbook","",errmsg$ if errmsg$>"" then goto prejob_done sdofc_init=1 call sdo$,"show","","" call sdo$,"setdelim |","","" call sdo$,"writerow ID|Name|Phone|Over 60|Total","","" call sdo$,"format row=1,font=Arial,size=12,bold","","" prejob_done: }
The prepage code block starts with code that exports data to Excel, but only if the prejob code block successfully initializes the sdOffice connection. In addition to that code, it also sets two numeric variables, colw and scol, based upon positions and widths of report column headers. These values are used later in the rule set for fonting and line drawing.
prepage{ # if prejob hasn't initialized sdoffice, skip this code if sdofc_init<>1 then goto sdofc_complete
for row=1 to 66 ln$=text$[row]
# customer heading row contain phone numbers x=mask(ln$,"\(...-...-....\)") while x custid$=mid(ln$,1,6) custname$=trim(mid(ln$,8,30)) custphone$=trim(mid(ln$,38,14)) x=0 wend
# totals - 50 plus spaces followed by digit-.-digit-digit x=mask(ln$,"^"+fill(50)+".*[0-9]\.[0-9][0-9]") while x amount60=cnum(mid(ln$,87,11)) amount90=cnum(mid(ln$,98,11)) amount120=cnum(mid(ln$,109,11)) over60=amount60+amount90+amount120 total=cnum(mid(ln$,120,11))
export$=custid$+"|"+custname$+"|"+custphone$+"|" export$=export$+str(over60)+"|"+str(total) call sdo$,"writerow "+export$,"","" x=0 wend
next row sdofc_complete:
# Now for some tricky code. # Agings can have different headings and column widths # To use version 5 features allowing variable columns and rows, # the following code will calculate starting positions # and column widths. It assumes a consistency in column widths, # 1 char negative, and 1 blank space between each column hd1$=text$[7] # temp heading line with agings x=pos("Type"=hd1$) xhd1$=trim(hd1$(x+4)) # remove all except agings x=pos(" "=xhd1$) x$=xhd1$(1,x-1) # get first column header xhd1$=trim(xhd1$(x)) x=pos(x$=hd1$) # find true position x1=x+len(x$)-1 # get end of first column # now find end of 2nd column x=pos(" "=xhd1$) x$=xhd1$(1,x-1) # get second column header x=pos(x$=hd1$) x2=x+len(x$)-1 # get end of second column # now calculate mask width less space between columns colw=x2-x1-1 # now calculate start of first field scol=x1-colw+2 }
The postjob code block performs some closing formatting control if the job is exporting data to Excel. If sdOffice is not being used, based upon the attempt to initialize it in the prejob code block, then this code is skipped.
postjob{ # if prejob hasn't initialized sdoffice, skip this code if sdofc_init<>1 then goto sdofc_complete2
call sdo$,"leaveopen","","" call sdo$,"format autofit","","" call sdo$,"format col=1,numberformat=@","","" call sdo$,"format col=4,numberformat=""###,##0.00""","","" call sdo$,"format col=5,numberformat=""###,##0.00"",bold","",""
call sdo$,"insertrow 1","","" call sdo$,"mergecells range=A1:E1","","" call sdo$,"writecell range=A1,value="+$22$+ \ "Over 60 Aging Values as of "+date(0)+$22$,"","" call sdo$,"format range=A1:E1,center,size=15,bold","","" sdofc_complete2: }
Here, finally, are the commands to enhance the formatting of the report. The initial commands use text commands with cut expressions to move the report header data around and change the fonting.
# heading section const BLFONT=univers,10,bold,italic const BSFONT=univers,9,bold,italic cbox .5,.5,RIGHTCOL,5,5,30 # line 1 text 2,1.25,{trim(cut(1,1,10,""))},BSFONT # date text 1,1.25,{trim(cut(20,1,100,""))},BLFONT,center, \ cols=MAXRCOLS # comp name text 1,1.25,{trim(cut(121,1,15,""))},BSFONT,right, \ cols=MAXRCOLS # page # # line 2 text 2,2.35,{trim(cut(1,2,10,""))},BSFONT # time text 1,2.35,{trim(cut(20,2,100,""))},BLFONT,center, \ cols=MAXRCOLS # rpt title # line 3 text 1,3.45,{trim(cut(20,3,100,""))},BSFONT,center, \ cols=MAXRCOLS # sub heading # line 4 text 1,4.45,{trim(cut(20,4,100,""))},BSFONT,center, \ cols=MAXRCOLS # sub heading
This section formats the column headings. The left portion is drawn with text commands, while the aging columns are fonted with font commands, which use the positions from the values calculated in the prepage code block.
# detail heading section const HFONT=univers,10,italic cbox LEFTCOL,5.25,RIGHTCOL,7.5,1,20 # line 1 cerase 1,6,MAXCOLS,6 text 1,6,"Customer # & Name",HFONT text 38,6,"Phone #",HFONT,center,cols=14 text 54,6,"Contact",HFONT
# line 2 cerase 1,7,49,7 text 3,7,"Invoice #",HFONT text 12,7,"Due Date",HFONT,center,cols=8 text 21,7,"P/O #",HFONT text 32,7,"Order #",HFONT text 39,7,"Terms",HFONT,center,cols=5 text 45,7,"Type",HFONT,center,cols=4 # using variables from prepage, enhance aging headings font {scol},7,{colw-1},1,HFONT,right font {scol+1*(colw+1)},7,{colw-1},1,HFONT,right font {scol+2*(colw+1)},7,{colw-1},1,HFONT,right font {scol+3*(colw+1)},7,{colw-1},1,HFONT,right font {scol+4*(colw+1)},7,{colw-1},1,HFONT,right font {scol+5*(colw+1)},7,{colw-1},1,HFONT,right font {scol+6*(colw+1)},7,{colw},1,HFONT,right,bold
The report body is enhanced using UnForm's ability to scan for patterns and anchor enhancements to those patterns. The first series of font commands scan for two spaces in the region from column 1, row 9 through column 2, row 66 (defined as the constant MAXROWS above). At each point in that search region, if the two spaces are found, a font command is issued relative to the location. This changes the font of the input data at that location.
The second series of font commands looks for customer heading line types, by searching for any alpha or digit character in the region 1,9 though 2,66. A different set of font commands is then issued for those positions.
# detail data section const BDFONT=cgtimes,10,bold const DFONT=cgtimes,10 # invoice line font " @1,9,2,MAXROWS",2,0,8,1,DFONT font " @1,9,2,MAXROWS",11,0,8,1,DFONT,center font " @1,9,2,MAXROWS",20,0,10,1,DFONT font " @1,9,2,MAXROWS",31,0,7,1,DFONT font " @1,9,2,MAXROWS",38,0,5,1,DFONT,center font " @1,9,2,MAXROWS",44,0,4,1,DFONT,center # using variables from prepage, enhance agings font " @1,9,2,MAXROWS",{scol},0,{colw},1,DFONT,decimal font " @1,9,2,MAXROWS",{scol+1*(colw+1)},0,{colw},1,DFONT,decimal font " @1,9,2,MAXROWS",{scol+2*(colw+1)},0,{colw},1,DFONT,decimal font " @1,9,2,MAXROWS",{scol+3*(colw+1)},0,{colw},1,DFONT,decimal font " @1,9,2,MAXROWS",{scol+4*(colw+1)},0,{colw},1,DFONT,decimal font " @1,9,2,MAXROWS",{scol+5*(colw+1)},0,{colw},1,DFONT,decimal font " @1,9,2,MAXROWS",{scol+6*(colw+1)},0,{colw+1},1,BDFONT,decimal
# cust line font "~[A-Z0-9]@1,9,2,MAXROWS",0,0,6,1,BDFONT font "~[A-Z0-9]@1,9,2,MAXROWS",7,0,28,1,BDFONT font "~[A-Z0-9]@1,9,2,MAXROWS",37,0,14,1,BDFONT,center font "~[A-Z0-9]@1,9,2,MAXROWS",53,0,36,1,BDFONT shade "~[A-Z0-9]@1,9,2,MAXROWS",0,-.15,{RIGHTCOL-1.5},1,20
The following commands look for sequences of dashes, which indicate sub total lines. Wherever a sequence of 50 dashes occurs, a box is drawn and input data is bolded. In addition, the original dashes are removed with the hline command.
# customer totals hline "---",erase # example of UnForm command with continuation to next line box "--------------------------------------------------", \ -1,.25,{RIGHTCOL-53},1.25 bold "--------------------------------------------------",0,1,120,1
Finally, grand total lines are treated with special fonting and a box.
# grand totals const DFONT=cgtimes,11,bold # sample of box command with increased thickness and double lines box "Grand Total:",-9.5,-1.25,MAXRCOLS,2.25,5,30,dbl 9 font "Grand Total:",0,0,12,1,BDFONT,13 font "Grand Total:",{scol-10},0,{colw},1,DFONT,decimal font "Grand Total:",{scol-10+1*(colw+1)},0,{colw},1,DFONT,decimal font "Grand Total:",{scol-10+2*(colw+1)},0,{colw},1,DFONT,decimal font "Grand Total:",{scol-10+3*(colw+1)},0,{colw},1,DFONT,decimal font "Grand Total:",{scol-10+4*(colw+1)},0,{colw},1,DFONT,decimal font "Grand Total:",{scol-10+5*(colw+1)},0,{colw},1,DFONT,decimal font "Grand Total:",{scol-10+6*(colw+1)},0,{colw+1},1,DFONT,decimal
|