Fomin Report Builder

Transcription

Fomin Report Builder
Fomin Report Builder
Users Manual
2005-2014 Scott Daughtry/Oleg Fomin
Contents
2
Table of Contents
Foreword
4
5
Part I Contents
Part II Introduction
1 Overview:
.............................................................................................................................................
Databases
7
2 Dictionary
............................................................................................................................................. 9
...........................................................................................................................................................................
10
Dictionary:
Functions (Others)
...........................................................................................................................................................................
11
Dictionary:
Functions (Date/Time)
...........................................................................................................................................................................
12
Dictionary:
Functions (Mathematical)
...........................................................................................................................................................................
13
Dictionary:
Functions (String)
...........................................................................................................................................................................
15
Dictionary:
Functions (Trigonometric)
...........................................................................................................................................................................
16
Dictionary:
Operators (Arithmetic)
...........................................................................................................................................................................
17
Dictionary:
Operators (Logical)
...........................................................................................................................................................................
19
Dictionary:
Processed Files
...........................................................................................................................................................................
19
Dictionary:
User Variables (Calculated Fields)
...........................................................................................................................................................................
20
Dictionary:
User Variables (Gather Totals)
3 ReportFormatterWindow
........................................................................................................................................... 20
........................................................................................................................................................................... 21
MenuToolbar
........................................................................................................................................................................... 22
ReportFormatterMenu
........................................................................................................................................................................... 22
ReportPropertiesWindow
4 Overview:
Frames
...........................................................................................................................................
24
........................................................................................................................................................................... 26
BreakPropertiesWindow
...........................................................................................................................................................................
27
Frame Properties
Window
...........................................................................................................................................................................
28
Band Properties
Window
........................................................................................................................................................................... 29
PropertyBoxWindow
........................................................................................................................................................................... 30
UpdateTotalWindow
5 Overview:
Pictures
...........................................................................................................................................
31
........................................................................................................................................................................... 33
Picture Wizard
........................................................................................................................................................................... 34
PictureDate
........................................................................................................................................................................... 35
PictureNumeric
........................................................................................................................................................................... 35
PicturePattern
........................................................................................................................................................................... 36
PictureScientific
........................................................................................................................................................................... 36
PictureString
........................................................................................................................................................................... 36
PictureTime
...........................................................................................................................................
37
6 Overview:
Bands
7 Overview:
...........................................................................................................................................
Filters
37
...........................................................................................................................................................................
38
Overview:
Filters Part 2
...........................................................................................................................................................................
38
Overview:
Filters Part 3
...........................................................................................................................................................................
40
Overview:
Filters Part 4
...........................................................................................................................................................................
40
Overview:
Filters Part 5
.........................................................................................................................................................................
427
Overview:
Filters Part 6
Part III Basics You Need To Know (aka: The Tutorial)!
44
1 Basics:
...........................................................................................................................................
Overview
44
2 Basics:
...........................................................................................................................................
Step 1 (Report Manager Screen)
45
2005-2014 Scott Daughtry/Oleg Fomin
3
Contents
3 Basics:
...........................................................................................................................................
Step 2 (Create/Save A New Report File)
46
4 Basics:
...........................................................................................................................................
Step 3 (Details & Frames)
48
5 Basics:
...........................................................................................................................................
Step 4 (Modifying Frame Contents)
53
6 Basics:
...........................................................................................................................................
Step 5 (Resizing The Detail Band)
54
7 Basics:
...........................................................................................................................................
Step 6 (Adding A Page Header)
55
8 Basics:
...........................................................................................................................................
Step 7 (Sorting Output)
58
9 Basics:
...........................................................................................................................................
Step 8 (Functions & Pictures)
60
10 Basics:
...........................................................................................................................................
Step 9 (Combining Info Inside A Frame)
63
11 Basics:
...........................................................................................................................................
Step 10 (Multiple Sorting Levels)
67
12 Basics:
...........................................................................................................................................
Step 11 (Filters)
69
13 Basics:
...........................................................................................................................................
Step 12 (Filters Continued)
73
14 Basics:
...........................................................................................................................................
Step 13 (Adding Graphics)
74
15 Basics:
...........................................................................................................................................
Step 14 (Records Printed Counter)
75
16 Basics:
...........................................................................................................................................
Step 15 (Page Breaks)
76
17 Basics:
...........................................................................................................................................
Step 16 (Using Total Fields)
81
18 Basics:
...........................................................................................................................................
Step 17 (Using Group Total Fields)
84
19 Basics:
...........................................................................................................................................
Step 18 (Using Grand Total Fields)
87
Part IV "How To" Section
1 Frame...........................................................................................................................................
Tricks
92
92
How To: ...........................................................................................................................................................................
Modify Default Frame Settings
92
How To: ...........................................................................................................................................................................
Combine Text And Database Fields
93
How To:.............................................................................................................................................................................
Conditionally Print Text
94
How To:.............................................................................................................................................................................
Date Fields
95
How To:.............................................................................................................................................................................
Prevent MEMO Field Truncation
96
How To:.............................................................................................................................................................................
Change a Frame's Border/Fill Properties
2 Header/Footer
Tricks
.............................................................................................................................................
97
97
How To:.............................................................................................................................................................................
Add Date & Time To Report Page
97
How To:.............................................................................................................................................................................
Add Page Number Counter
98
How To:.............................................................................................................................................................................
Different Page Footers
98
How To:.............................................................................................................................................................................
Different Page Headers
3 Report
Variations
.............................................................................................................................................
99
99
How To:.............................................................................................................................................................................
Labels
100
How To:...........................................................................................................................................................................
Mail Merge Report
...........................................................................................................................................
102
4 Sorting
Tricks
102
How To:...........................................................................................................................................................................
Descending Sort Sequence
103
How To:...........................................................................................................................................................................
Multiple Sort Levels
5 User-Defined
Variables
...........................................................................................................................................
103
103
How To:...........................................................................................................................................................................
Creating User Variables
6 Misc...........................................................................................................................................
Topics
105
...........................................................................................................................................................................
105
Help File
Modification History
105
How To:...........................................................................................................................................................................
Save A Report
2005-2014 Scott Daughtry/Oleg Fomin
Contents
FORWARD
The Fomin Report Builder (FRB) is a royalty free reporting tool created by Oleg
Fomin for Clarion computer language programmers to include within Windows
software applications that they create. Oleg Fomin is the copyright holder for this
reporting accessary.
Scott Daughtry is a longtime FRB customer that created an enduser's Fomin
Report Builder help file for his customers. He offered that help file to Oleg, free of
charge, to include with his FRB product in appreciation for the capabilities that FRB
offered his clients. That original help file has since swelled into the 100 page user's
manual before you. Scott, in no way, helped develop FRB - Oleg takes 100% credit
for FRB!
FRB is a fantastic reporting tool - it uses a very simple and understandable
approach to building various types of reports that endusers can quickly understand
and benefit from. The ability for customers to create/tweak their own reports is
immensely useful to them - they don't need to wait months (or years) for an
updated software version to include a new report - within an hour they can create it
themselves to their own liking/reporting need.
If you are new to FRB, it is highly advisable to at least skim this user's manual
(which contains the same content as the context-sensitive help file that was
distributed with your Windows software application). At a minimum, read the
'Basics You Need To Know (aka: The Tutorial), which walks you through
creating a very generic report and then tweak it into a much more capable/polished
report. Once you have mastered the FRB basics, the remainder of this user's
manual then becomes a reference that can be pulled off the shelf (or opened within
your favorite *.PDF file viewer) to answer a quick question.
Happy (FRB) Reporting!
2005-2014 Scott Daughtry/Oleg Fomin
4
5
1
Contents
Contents
Introduction
Databases - what are they?
Dictionary
Report Formatter Screen
Frames
Pictures
Report Bands
Filters
Basics You Need To Know (aka: The Tutorial)!
Overview
Step 1: Reports Manager Screen
Step 2: Create/Save A New Report File
Step 3: Details & Frames
Step 4: Modifying Frame Contents
Step 5: Resizing The Detail Band
Step 6: Adding A Page Header
Step 7: Sorting Information
Step 8: Functions & Pictures
Step 9: Combining Info Into A Frame
Step 10: Multiple Sorting
Step 11: Filters
Step 12: Filters Part Two
Step 13: Adding Graphics
Step 14: Adding A "Record's Printed" Counter
Step 15: Page Breaks
Step 16: Using Total Fields
Step 17: Using Group Total Fields
Step 18: Using Grand Total Fields
"How To" Section
Frame Tricks
Change default frame settings (border, fill color, etc)
Combine text and database field information onto a report page
Conditionally print information onto a report page
Date fields are printing five numbers - help!
Prevent truncation of a MEMO field during printing
How To: Change a Frame's Border/Fill Properties
2005-2014 Scott Daughtry/Oleg Fomin
Contents
6
Header/Footer Tricks
Add page number counter to the report page
Add current date/time to the report page
Different header on page one than remaining report pages
Same footer text is printed until last report page is reached
Report Variations
Labels
Mail merge form letters
Sorting Tricks
Multiple sort levels
Sorting in descending sequence
User-Defined Variables
Creating/saving user defined variables
Help File History
Changes to this help file
2005-2014 Scott Daughtry/Oleg Fomin
7
2
Fomin Report Builder
Introduction
Databases - what are they?
Dictionary
Report Formatter Screen
Frames
Pictures
Report Bands
Filters
2.1
Overview: Databases
Preface
As simple to use as Report Builder is (really!), there are some database fundamentals
that you should be comfortable with in order to get the most out of this powerful tool.
It is one thing to blindly type information into a computer, but empowering yourself as
to how a database program really works will greatly enhance the reports that you
create (to get that information back out in a manner that you need).
Database - Description
A database is nothing more than a collection of information that is somehow related. A
phone book is a great example of a database it is a collection of names/addresses/
phone number(s) for people and businesses in one physical area (usually a city, or an
area code). So, a database would be all the names, addresses and phone numbers
contained within a phone book.
Database - Components
A database file is comprised of two new terms: database records and database
fields. Going back to the phone book once again, each person's name listed in the
phone book would be a database record - it contains all the information for one
person or business (their name, address, phone number(s), etc). The next name
shown in the phone book would be a separate database record, and so on.
A database record is made up of database fields. Using the phone book again as an
example, we would have separate database fields for the following information:
Individual/business name
Street address
Phone number
A database could have only one field or it can have hundreds of fields - whatever it
takes to store all the information required to group together all of that related data
inside of one database record entry.
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
8
Database Index File
A phone book is usually sorted on the name of the individual/business, beginning with
the number 0, and ending with the letter Z. This type of sort is known as ASCENDING
sequence. If you started at the back of a phone book and worked your way to the
front (going from the letter Z to the number 0) this sort is called DESCENDING
sequence. Sorting a database requires the creation of a second type of file known as
a database index, which can also be called a database key.
A database index is a file used by a database application to change how database
information is displayed. Going back to the phone book example - every day the
phone company creates phone numbers as people and businesses move into the city.
Their name(s) are obviously not going to be in alphabetical order when the clerk
creates their new phone number entry - a person named Jones may be first, then
Joe-Bob's Barbeque is next, then Alpha-Beta Drugs may be third, and so on. Without
a way of sorting this information a printed phone directory would be a total mess names would jump around the alphabet! The index file's job is to regain some
structure and order to the information being input into the database.
A database index file can be created using one database field, or several database
fields. These file(s) are normally opened when the database is opened, and as each
database record is added/deleted an identical action is performed on the index file.
For the phone book example, the desired sort would be the individual/business name
to be sorted in ascending alphabetical sequence. The field name used for the index
would be the individual/business name. If your phone company were really customeroriented they could perhaps create section(s) in their phone book that were sorted on
the street address - a new index created on that database field would be created/
used to print this new section of the phone book.
Index file(s) are most commonly used in browse screens (a screen where all the
database records are displayed in columns, sorted alphabetically for easy location of
information) and reports.
Relational Databases
Index file(s) are also used to relate (aka: link) two or more database files together,
which store different pieces of information that belong together. This type of database
application is known as a relational database - two or more database file(s) relate to
each other by means of a common database field, and an index file that links the two
separate files together.
An example of a relational database could be your bank account. When you first
joined your bank you filled out a form with your name, address, work history, etc. The
clerk typed this information into the computer, handed you a bundle of blank checks
and thanked you for joining their bank. All this "initial" information is stored in a
database. As you start writing checks to pay for things a transaction is created for the
2005-2014 Scott Daughtry/Oleg Fomin
9
Fomin Report Builder
date it was written, the dollar amount, the date the transaction was posted to your
account, the check number, etc. These transactions are stored in a separate
database file.
At this point we have one database that stores customer information (name, address,
etc) and another database that stores transactions for each check cashed. In both
database files is a field that contains the account number, and an index file is created
for each database on this field. The two database files are related to each other by
these index files created on the account number.
Not all database applications require a relational database setup - if the information
being tracked is simple (e.g. a grocery shopping list) then a single database file will
contain all the data being monitored. However, all business type database systems
rely on the relational database structure in order to keep track of a large quantity of
information. Relational databases greatly reduce the amount of information being
stored in database files, which keeps the size of the database file(s) small and
increases the speed of the program when retrieving data.
Finale
This Report Builder can create reports from single database programs or relational
database programs.
2.2
Dictionary
The Dictionary provides access to everything you can add to a report page (with the
exception of information that you manually type into a frame). It's interface is split into
four basic categories:
Processed Files: Add information stored inside of the application's database files.
Others: Access to standard report page counters and programmer-defined
information is found here.
Standard: Use built-in functions to manipulate text and numbers. This section is
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
10
broken into six sub-sections:
o Operators: Arithmetic
o Operators: Logical
o Functions: String
o Functions: Mathematical
o Functions: Trigonometric
o Functions: Date/Time
User Variables: Access to variables that you (or the programmer) has created and
some report totaling variables is found here. This section has two sub-sections:
o User Variables: Calculated Fields
o User Variables: Gather Totals
To select a Dictionary item you can either double left click the mouse on an item or
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.2.1
Dictionary: Functions (Others)
This section of the Dictionary provides access to two types of items that can be
added to your report:
Functions: These are defined by the developer of this application - as shown above
there are four functions that have been created, and made available, for the user to
input a date or select a product or vendor from another application database. Your
database application might not have any functions defined here. Usually a function
will either ask you for information or to select an item from a list.
Built-in Variables: By default there will are four variables available for use (as
shown above). The developer of this application can add other variables (i.e.
predefined text) for you to use in a report that would show up here (example: a
variable that combines the first, middle, and last names stored in a database into a
formatted variable string).
To select a Dictionary entry you can double left click the mouse on the desired item or
click the check mark icon at the top left of the window (after highlighting your desired
2005-2014 Scott Daughtry/Oleg Fomin
11
Fomin Report Builder
choice). The Dictionary window will automatically close after a Dictionary function or
built-in variable is selected.
2.2.2
Dictionary: Functions (Date/Time)
This section of the Dictionary provides access to built-in functions that manipulate date
or time data types:
TODAY() - Returns the operating system date as a standard date. The range of
possible dates is from January 1, 1801 (standard date 4) to December 31, 2099
(standard date 109,211). You can use a picture command to change the
appearance of the return value. For example: cToday = format( TODAY(), @d01B )
CLOCK() - Returns the current time based upon your computer's BIOS time.
DATE() - Returns a standard date for a given month, day, and year. The month and
day parameters do allow positive out-of-range values (zero or negative values are
invalid). A month value of 13 is interpreted as January of the next year. A day value
of 32 in January is interpreted as the first of February. Consequently, DATE
(12,32,97), DATE(13,1,97), and DATE(1,1,98) all produce the same result. The
century for a two-digit year parameter is resolved using the default "Intellidate"
logic, which assumes the date falls in the range of the next 20 or previous 80 years
from the current operating system date. For example, assuming the current year is
1998, if the year parameter is "15," the date returned is in the year 2015, and if the
year parameter is "60," the date returned is in 1960.
For example, HireDate = DATE(Hir:Month,Hir:Day,Hir:Year); FirstOfMonth = DATE
(MONTH(TODAY()),1,YEAR(TODAY())) would compute the first day of month
DAY() - Returns day of month. Computes the day of the month (1 to 31) for a given
standard date. For example, OutDay = DAY(TODAY()) to get the day from today's
date; DueDay = DAY(TODAY()+2) to calculate the return day
MONTH() - Returns the month of the year (1 to 12) for a given standard date. For
example, PayMonth = MONTH(DueDate) to get the month from the date
YEAR() - Returns a four digit number for the year of a standard date (1801 to 9999)
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
12
. For example, YEAR( today() )
AGE() - Returns a string containing the time elapsed between two dates. The age
return string is in the following format: 1 to 60 days - 'nn DAYS'; 61 days to 24
months - 'nn MOS'; 2 years to 999 years - 'nnn YRS'. For example, nAge = AGE
( EMP:Birthday, TODAY()) would compare the database field EMP:Birthday against
the computer date to return the persons age.
To select a Dictionary item you can either double left click the mouse on an item or
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.2.3
Dictionary: Functions (Mathematical)
This section of the Dictionary provides access to built-in functions that manipulate
numbers.
ABS() - Returns an absolute value from an expression. The absolute value of a
number is always a zero. For example, C = ABS( A-B ). C would contain the
absolute value of the difference of B subtracted from A
INRANGE() - Compares a numeric expression for an inclusive range of numbers.
Returns a value of true if the scope is met, and false otherwise. For example,
INRANGE( nVariableName, 1, 5 ) would check if the variable 'nVariableName' is
between the values of 1-5, and return true if so; the starting number to scan is 1,
and ending scanned number is 5.
INT() - Returns an integer value from a numeric expression. For example, INT( 8.5 )
would return a value of 8.
LOGE() - Returns the natural algorithym. The natural logarithm of a value is the
power to which e must be raised to equal that value. The value of e used internally
for these calculations is 2.71828182846. For example LOGE(2.71828182846)
returns 1; LOGE(1) returns 0
2005-2014 Scott Daughtry/Oleg Fomin
13
Fomin Report Builder
LOG10() -Returns base 10 logarithm. If the value of the expression is zero or less,
the return value will be zero. The base 10 logarithm is undefined for values less than
or equal to zero. The LOG10 procedure returns the base 10 logarithm of a numeric
expression. The base 10 logarithm of a value is the power to which 10 must be
raised to equal that value. For example, LOG10(10) returns 1; LOG10(1) returns 0
RANDOM() - Returns random integer.Returns a random integer between the low
and high values, inclusively. The low and high parameters may be any numeric
expression, but only their integer portion is used for the inclusive range. For
example, RANDOM( 22, 80 ) would return a random number between the numbers
22 and 80.
ROUND() - Returns a rounded number. For example, ROUND( 5163, 100 ) would
return the rounded number of 5163+100 (which is 5200); ROUND(657.50,1) returns
658; ROUND(51.63594,.01) returns 51.64
SQRT() - Returns the square root of a number.
To select a Dictionary item you can either double left click the mouse on an item or
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.2.4
Dictionary: Functions (String)
This portion of the Dictionary provides access to built-in functions that manipulate text
strings.
ALL() - Returns a text string that replicates itself a defined number of times. For
example, ALL('A',5) would return the text string 'AAAAA'.
CAPITALIZE() - Returns a text string with the first letter in uppercase and the
remainder in lowercase.
CHR() - Returns the ANSI character from an ASCII code. For example, CHR(122)
would return 'z'
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
14
CLIP() - Returns a string with the trailing spaces removed. Commonly used to
properly format names and addresses into a more aesthetic appearing text string;
multiple database fields are combined together using the concatenation symbol (&)
to form a formatted string.
For example, the database field ADR:City that contains the city name 'Tucson' could
be combined with the ADR:State field that contains 'Az'. Because the ADR:City
database field has 30 spaces allocated to it, and only 6 positions were used for
'Tucson', the resulting output would resemble this on the report's printed page:
Tucson
Az
not exactly appealing! Using the CLIP() function and the concatenation symbol you
can use the CLIP() function like this:
CLIP( ADR:City ) & ', ' & CLIP( ADR:State )
to make it print as expected on the report's printed page:
Tucson, Az
Note that there is a blank space after the comma to "push" the state over one
position to avoid crowding the comma character.
DEFORMAT() - Returns a string that contains the unformatted characters of a
numeric string. For example DEFORMAT('999-53-9954') returns 999539954
FORMAT() - Returns a formatted string; knowledge of the PICTURE command is
mandatory to make best use of this function. For example SSN = FORMAT( Emp:
SSN,@P###-##-####P), which would properly format the database field EMP:SSN
to a standard social security number.
INLIST() - Returns the position of an item in a comma delimited list. For example,
INLIST('D','A','B','C','D','E') returns a value of 4
LEN() - Returns the length of a string. For example, LEN('Scott Daughtry') would
return a value of 14.
LOWER() - Returns the lowercase version of a string. For example LOWER
('SCOTT Daughtry') would be returned as 'scott daughtry'.
NUMERIC() - Returns a true or false. If a string contains only numbers a true is
returned. For example NUMERIC('123') would be true, and NUMERIC('1,23') would
be false.
SUB() - Returns a portion of a string. You define where the starting and stopping
positions are in the string. For example, SUB( 'Scott Daughtry', 1, 5 ) would extract
positions 1-5 of the string, returning 'Scott'. SUB( 'Scott Daughtry', 7, 3 ) extracts
'Dau' - the starting position is 7, and the next 3 positions are extracted from that
starting point. You can also work backwards on a string by assigning a negative
starting position. For example, SUB( 'Scott Daughtry', -1, 3 ) would return 'try'.
UPPER() - Returns an uppercase version of a text string. For example, UPPER
( 'scoTT') is returned as 'SCOTT'.
VAL() - Returns the ASCII character numeric equivalent for an ANSI entry. For
example, VAL('A') would return 65.
To select a Dictionary item you can either double left click the mouse on an item or
2005-2014 Scott Daughtry/Oleg Fomin
15
Fomin Report Builder
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.2.5
Dictionary: Functions (Trigonometric)
This section of the Dictionary provides access to built-in functions that manipulate
numbers in a scientific manner.
SIN() - Returns the trigonometric sine of an angle measured in radians. The sine is
the ratio of the length of the angle's opposite side divided by the length of the
hypotenuse. For example, eturns the trigonometric cosine of an angle measured in
radians. The cosine is the ratio of the length of the angle's adjacent side divided by
the length of the hypotenuse. For example, sineAngle = SIN( 45 * 3.142498712)
COS() - Returns the trigonometric cosine of an angle measured in radians. The
cosine is the ratio of the length of the angle's adjacent side divided by the length of
the hypotenuse. For example, cosineAngle = COS( 45 * 3.142498712)
TAN() - Returns the trigonometric tangent of an angle measured in radians. The
tangent is the ratio of the angle's opposite side divided by its adjacent side. For
example, TanAngle = TAN( 45 * 3.142498712)
ACOS() - Returns the inverse cosine. The inverse of a cosine is the angle that
produces the cosine. The return value is the angle in radians. p is a constant which
represents the ratio of the circumference and radius of a circle. There are 2p
radians (or 360 degrees) in a circle. For example, acos = ACOS( 45 *
3.142498712)
ASIN() - Returns the inverse sine. The inverse of a sine is the angle that produces
the sine. The return value is the angle in radians. p is a constant which represents
the ratio of the circumference and radius of a circle. There are 2p radians (or 360
degrees) in a circle. For example, asine = ASIN( 45 * 3.142498712)
ATAN() - Returns the inverse tangent. The inverse of a tangent is the angle that
produces the tangent. The return value is the angle in radians. p is a constant which
represents the ratio of the circumference and radius of a circle. There are 2p
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
16
radians (or 360 degrees) in a circle. For example, TanAngle = ATAN( 45 *
3.142498712)
To select a Dictionary item you can either double left click the mouse on an item or
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.2.6
Dictionary: Operators (Arithmetic)
This section of the Dictionary provides access to built-in functions that manipulate
numbers/arrays/strings, and/or combine multiple values to add to your report.
Addition - Add two variables together to produce a value. The addition sign (+) is
used.
Subtraction - Subtraction one variable from another to produce a value. The minus
sign (-) is used.
Multiplication - Multiply one variable against another to produce a value. The
asterisk symbol (*) is used.
Division - Divide one variable into another to produce a value. The slash character
is used (/).
Exponentiation - Raises one variable to the value of a second variable. The carat
symbol (^) is used.
Modulus Division - Returns the remainder of one variable divided by another
variable. The percentage character (%) is used.
Concatenation - Most commonly used to combine multiple strings together into one
string, or multiple database fields and/or text into one string. You don't need to
convert numeric values into a string before combining them with a text field - this is
automatically taken care of.
To select a Dictionary item you can either double left click the mouse on an item or
2005-2014 Scott Daughtry/Oleg Fomin
17
Fomin Report Builder
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.2.7
Dictionary: Operators (Logical)
This section of the Dictionary provides access to built-in functions that conditionally
manipulate information.
Choose() - This function is used to perform a logical evaluation and return a value
based upon the result. When a condition is evaluated to true the first return value is
returned. If a condition is evaluated to false the second return value is returned. For
example, CHOOSE( 1 > 2, 'A', 'B') would return 'B'; CHOOSE( INV:Sex = 'M',
'Male', 'Female') would return the text string 'Male' if the database field INV:Sex
contained a value of 'M'.
And - A boolean operator; used to combine 2 or more logical statements together.
Used when you need/want multiple logical expressions to equal TRUE in order for
something to occur. For example: INV:Sex = 'M' AND INV:State - 'Az' would require
the database field INV:Sex to equal 'M' AND the INV:State database field to equal
'Az' for a value of true to be returned. If either database field did not contain these
values then a return value of false is returned. The expressions are evaluated from
left to right; if a value of false is returned then the subsequent expressions are
skipped over, since a value of false has already been reached. If the INV:Sex
database field did not contain a value of 'M' then the INV:State field wouldn't be
processed at all - a value of false has already been returned. If the INV:Sex
database field contained an 'M', but the INV:State database field contained
something other than 'Az', then a value of false is returned, since both items must
return a value of true. You can a very long expression with the AND operator. For
example: INV:Sex = 'M' AND INV:State = 'Az' AND INV:Birthdate > '01/01/60'.
Or - A boolean operator; used to combine 2 or more logical statements together.
Used when a condition can evaluate to a value of false but processing is still
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
18
desired. For example: INV:Sex = 'M' AND Inv:State = 'Az' OR INV:State = 'Ak'
would evaluate INV:Sex; if it equals a 'M' the INV:State field is evaluated. If it
contained 'Az' an overall return value of true is reached. If it didn't contain 'Az' it is
then checked for a value of 'Ak'. If it did, a an overall value of true is reached.
Not - A boolean operator. Used in conjunction with the Greater Than, Equal To or
Less Than operators. For example, INV:State NOT = 'Az'; INV:Age NOT < 45; INV:
Income NOT > 30000.
Xor - A boolean operator. Used when an expression can evaluate to true on one
side of the equation, but not both. For example: A XOR B; true is returned if A is
true OR B is true, but not both.
Greater Than - The symbol (>) is used for this operator. When you want the left
side of an equation to return a value of true. For example, INV:Quantity > 5 would
return a true if the INV:Quantity database field was greater than 5.
Lesser Than - The symbol (<) is used for this operator. When you want the right
side of an equation to return a value of true. For example, INV:Age < 15 would
return true if the database field INV:Age is less than 15.
Equal To - The symbol (=) is used for this operator. When you want an exact match
in an equation for a value of true to be returned. For example, INV:State = 'Az'
would return a value of true if the database field INV:State contained 'Az'
Not Equal To - The symbol (<>) is used for this operator. When you want a value
of true returned when a variable does NOT contain a particular value. For example,
INV:State <> 'Az' would return a value of true when it did not contain 'Az'
Greater Than Or Equal To - The symbol (>=) is used for this operator. When you
want a value to be equal to or greater than something. For example: INV:Sold >=
325 would return a value of true if the INV:Sold database field was equal to or
greater than 325.
Less Than Or Equal To - The symbol (<=) is used for this operator. When you
want a value to be equal to or less than something. For example, INV:Sold <= 325
would return a value of true if the INV:Sold database field was equal to or less than
325.
Note: Standard operators can be used to build complicated expressions when you
want to "drill down" to highly specific data (which is normally the case). Make sure
that the most important criteria is placed first that would (in theory) eliminate the
majority of data when the database is scanned. This will speed up the remainder of
the operational string when they are executed. Some expression examples:
EMP:Sex = 'M' AND LOC:State = 'Az' OR Loc:State = 'Nv' AND EMP:Haircolor =
'Brown'
STO:Location = 'Iowa' AND PAR:Vendor = 'Hasbro' AND PAR:Onhand <= 100
SAL:Total = INV:Itemprice * SAL:Quantity * SAL:Salestax
To select a Dictionary item you can either double left click the mouse on an item or
2005-2014 Scott Daughtry/Oleg Fomin
19
Fomin Report Builder
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.2.8
Dictionary: Processed Files
This section of the Dictionary provides access to database information to add to your
report. Some database applications may have more than one database file that
contains information; the screen capture above shows an example of three database
files (Inventory History, Vendors, Products) that can be expanded to access their
respective database fields.
To select a Dictionary item you can either double left click the mouse on an item or
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.2.9
Dictionary: User Variables (Calculated Fields)
This section of the Dictionary provides access to functions that the programmer of this
application has added for you to add to your report. This section of the dictionary
might not contain any items that you can select.
To select a Dictionary item you can either double left click the mouse on an item or
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
20
2.2.10 Dictionary: User Variables (Gather Totals)
This section of the Dictionary provides access to functions that the programmer of this
application has added for you to add to your report. This section of the Dictionary
might not contain any items that you can select.
To select a Dictionary item you can either double left click the mouse on an item or
click the check mark icon at the top left of the window (after highlighting your desired
choice).
2.3
ReportFormatterWindow
Shown above is the Report Formatter screen - think of it as a blank piece of paper
that will contain all of the information (text, database information, and/or pictures) that
you want sent to a printer. This screen is used to create a new report or modify an
existing report. The screen is configured in three different sections; from top to bottom
they are:
Pulldown menu: A standard Windows-style menu
Toolbar: A standard Windows-style toolbar displayed under the pulldown menu
Workarea: Blank space where you add information to print onto a report page
2005-2014 Scott Daughtry/Oleg Fomin
21
Fomin Report Builder
By default the Report Formatter screen is blank (as shown above). It is YOUR job to
add the pieces of the report as you want them to be printed.
A key point to remember is this: a report CANNOT change information contained
inside the application's database file(s)! This means that you can create as many
reports as you want and change them as many times as needed without fear of
altering data stored in the database file(s).
The Report Formatter screen used a standard Windows layout - a pulldown menu is
displayed at the top of the screen, with a toolbar directly below with clickable icons
for commonly used tasks. The mouse is used to add/move object(s) to the report; the
right mouse button is used to modify an object that you place onto the Report
Formatter screen.
Important to know/remember:
A report needs at least one Detail Band and one Frame
added to the above screen to generate a report.
2.3.1
MenuToolbar
The Menu Toolbar provides quick access to commonly used features inside the
Report Formatter window. The screen capture above is labeled A-W (note: the real
Report Formatter window does NOT display these letters, and is used only to make it
easy to describe each button's function):
A. Save changes and exit the Report Formatter window
B. Lose changes and exit the Report Formatter window
C. Create a new report file
D. Open an existing report file
E. Save the open report file
F. Cut the currently selected frame
G.Copy the currently selected frame
H. Paste from the Windows clipboard
I. Open the Font Selection pop up box
J. Left align the text in the currently selected frame
K. Center align the text in the currently selected frame
L. Right align the text in the currently selected frame
M.Horizontally spread the text in the currently selected frame
N. Top align the text in the currently selected frame
O.Center align the text in the currently selected frame
P. Bottom align the text in the currently selected frame
Q.Not used
R. Add/remove the left border line from the currently selected frame
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
22
S. Add/remove the right border line from the currently selected frame
T. Add/remove the top border line from the currently selected frame
U. Add/remove the bottom border line from the currently selected frame
V. Open the Fill Color pop up box
W.Open the Border Color pop up box
2.3.2
ReportFormatterMenu
The main menu of the Report Formatter resembles most other Windows applications the underlined letter is used with the ALT key to activate that menu choice. You can
also use the mouse (and clicking the left mouse button) to select and activate a menu
choice.
The above screen capture shows all of the Report Formatter menu options on one
screen.
2.3.3
ReportPropertiesWindow
The Report Properties popup window "General" tab provides options to:
o Define the Report Title (that is displayed in the Report Manager screen). Each
report you create SHOULD have a Report Title added BY YOU to make it easy to
locate the report in the Report Manager. The Report Title should be brief and
describe the purpose of the report using plain language.
o Define a Record Filter to limit the output to only database information that meets
specific criteria.
2005-2014 Scott Daughtry/Oleg Fomin
23
Fomin Report Builder
The Report Properties pop up window "Page Layout" tab provides options to:
o Define the page size of the report page by using a drop list of choices:
Letter 8 1/2 x 11 in
Letter Small 8 1/2 x 11 in
Tabloid 11 x 17 in
Ledger 17 x 11 in
Legal 8 1/2 x 14 in
Statement 5 1/2 x 8 1/2 in
Executive 7 1/4 x 10 1/2 in
A3 298 x 420 mm
A4 210 x 297 mm
A4 Small 210 x 297 mm
A5 148 x 210 mm
B4 250 x 354
B5 182 x 257 mm
Folio 8 1/2 x 13 in
Quarto 215 x 275 mm
10x14 in
11x17 in
Note 8 1/2 x 11 in
Envelope #9 3 7/8 x 8 7/8
Envelope #10 4 1/8 x 9 1/2
Envelope #11 4 1/2 x 10 3/8
Envelope #12 4 1/2 x 11
Envelope #14 5 x 11 1/2
C size sheet 17 x 22 in
D size sheet 22 x 34 in
E size sheet 34 x 44 in
Envelope C5 162 x 229 mm
Envelope C3 324 x 458 mm
Envelope C4 229 x 324 mm
Envelope C6 114 x 162 mm
Envelope C65 114 x 229 mm
Envelope B4 250 x 353 mm
Envelope B5 176 x 250 mm
Envelope B6 176 x 125 mm
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
24
Envelope 110 x 230 mm
Envelope Monarch 3 7/8 x 7 1/2 in
6 3/4 Envelope 3 5/8 x 6 1/2 in
US Std Fanfold 14 7/8 x 11 in
German Std Fanfold 8 1/2 x 12 in
German Legal Fanfold 8 1/2 x 13 in
Custom size
o Spinboxes to manually define the report page width and height.
o Page orientation (default is Portrait mode); the check box changes the report
output to Landscape
o Page margins (left, right, top, bottom)
2.4
Overview: Frames
Preface
Frames are used in the Report Builder to print something on the report page, to
include:
A database field used in the application
A text string (such as a report header, column header, etc)
A calculated field that is generated at run time
A page counter
The current date or time
Total fields (such as total expenditure, dollar total, etc)
ANYTHING that you want printed on a report page MUST be added via a Frame. A
Frame is also how you gain access to the Dictionary screen, which contains your
database file information and internal functions that enable you to manipulate
information to achieve your reporting goal for highly formatted (and attractive) printed
output. A Frame requires at least one report Band to to exist on a report page before
it can be added to the report page. An unlimited number of Frames can be added to a
report page (space permitting).
Adding A Frame To A Report Page
First ensure at least one report band (Detail Band, Group Footer or Group Header)
Left click inside the report band that you want something to be printed; this will
select the report band to receive the empty Frame
Right click the mouse to display a pop up menu; from this menu select 'New Frame'
A new empty Frame is now displayed inside the report band where you had previously
left clicked the mouse:
2005-2014 Scott Daughtry/Oleg Fomin
25
Fomin Report Builder
Moving/Resizing A Frame
Resize: When a Frame is selected red blocks outline the Frame to indicate that you
can stretch any of the corners to meet your printing size requirement.
Move (Mouse): You can drag the empty Frame to a different location inside the
report band by left clicking inside the empty Frame, then drag the empty Frame to the
desired location. When dragging the empty Frame the border will turn completely red
- release the left mouse button after moving the Frame to set it's final position.
Move (Keyboard): Hold down the CTRL key and use the arrow keys on the keyboard
to move the Frame in the desired direction (left/right/up/down).
Frame Contents
As described above, a Frame can contain many things (or combination of things). The
Dictionary is the primary method of adding an object, via the Frame, onto a report
page. You can also use the keyboard to manually enter information into a Frame
(such as a report title or column title).
If you use the Dictionary to add information to a Frame (ex: database field), you will
notice that an equal sign (=) is automatically placed in front of the database field's
name inside of the frame:
If you remove the equal sign the Report Builder will generate a runtime error when the
report is printed. This is because the equal sign is MANDATORY for adding a
database field or using internal functions (to format information in a highly specific
manner). Adding information from the Dictionary will automatically add the equal sign
for you; only one equal sign is required, and it MUST be positioned as the first entry in
the above screen.
If you are adding text to a report (ex: a column title) via a Frame the equal sign is
NOT required in the first position of the frame's contents:
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
26
Frame Border
By default a newly added Frame has a box drawn around it:
This makes the Frame easy to find (and move around) inside of that report band;
however, you can remove any (or all) of the four sides of the box by clicking the
appropriate toolbar icon to toggle that box side on or off (the first four toolbar icons):
You can fill the Frame with any color that you desire to create colorful reports by first
selecting the Frame, and then click on icon #5 (displayed above)- a pop up color
selection window will appear to select the color for that Frame.
The box line color can be changed by clicking icon #6 - a pop up color selection
window will appear to select the color to apply to the selected Frame.
Recap
Frames are the ONLY WAY to add the following items to a report page:
Report header page title
Report footer page count
Image files (ex: your company logo on the top of the report page)
Database file information
Text information (ex: column header)
Frames can be placed anywhere on a report page. Frames require a report Band to
be placed inside of. Frames can be resized as large or small as needed. By default a
Frame has a border drawn around it that can be removed (one side at a time). A
Frame can be filled with any color.
2.4.1
BreakPropertiesWindow
The screen capture above shows the "Sort Expression" dialogue box (also known as
the Break Properties" dialogue box). This pop up window is accessed by double leftclicking on a sorting band; it's purpose is to define what database field will be used to
2005-2014 Scott Daughtry/Oleg Fomin
27
Fomin Report Builder
sort the content of that report band.
To add/edit the database field that will be used in the sorting band click the blue
button next to the entry field - this will display the Dictionary, which is the easiest
method to select the desired database field to sort upon.
2.4.2
Frame Properties Window
The above screen captures show the "Frame Properties" window which is used to:
Tab #1 (General)
Define the contents of a frame (e.g. database field, calculated field, static text)
Optionally perform a "mail merge" with the chosen database field
Load an image from the hard drive to print onto the report page
Load an image stored inside the database (inside a Memo or Blob database field)
Define the picture for the frame contents
Enable the frame contents to print as multiline text
Automatically resize (shrink) the bottom of the frame to close up blank gaps on the
printed page
Define the horizontal and vertical alignment of the frame contents
Define if a border should be printed around the frame, and if so, which sides and
what color
Define the font type/size/format for the frame contents
Define the width of the frame
Optionally fill the frame with a color
Tab #2 (Position)
Fine tune the top left corner position of the frame
Fine tune the exact width and height of the frame
Fine tune the margins inside the frame
Fine tune the number of lines of text inside the frame
The above screens is accessed by double left clicking the mouse button on a frame.
NOTE: The majority of these functions are duplicated inside the Report Formatter's
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
28
toolbar.
2.4.3
Band Properties Window
The above screen captures show the "Band Properties" window that is used to define
how a BAND will:
Optionally be printed (by entering a value in the 'Print section, if expression
evaluates TRUE' entry field)
Optionally print a MEMO field after the current BAND is printed
Optionally "mail merge" a database field into text that you define (e.g. A form letter
to customers)
Resize the BAND for it's top position on a report, or it's size and/or width
How to handle Page Overflow (i.e. when the report page is full, how the information
will be printed)
An explanation of each of the primary options in this dialogue window:
Print Selection, if expression evaluates TRUE: You can elect to only print
information contained in the new report band when a specific condition evaluates to
TRUE; for example, you may want to make information stand out for customers who
are late on a payment; if you have a database field that tracks if their payment is
2005-2014 Scott Daughtry/Oleg Fomin
29
Fomin Report Builder
late you could check for this; if late you can create a fancy text warning to draw
attention to the account. Naturally you would use the Dictionary to help define the
database condition that evaluates to TRUE for this action to occur.
Explicit Page Overflow Before Band Printing: Print the Group Footer band when
the selected database field data changes at the beginning of the next group of
information (i.e. ALWAYS print this band when the selected field data changes at
the BEGINNING of the next group of information). For example, if you have 10
database records and the first 3 equal "AZ", when the state database field changes
value to "CA" the Group Footer is printed on the next page before database records
containing State=CA are printed to the page.
Explicit Page Overflow After Band Printing: Print the Group Footer band when
the selected database field data changes at the end of that group of information
(i.e. ALWAYS print this band when the selected field data changes at the END of
that group of information). The next page that prints will contain new database field
information.
Print This Band At The Same Page With Prior: This attribute specifies that the
Detail, or Group Header/Group Footer structure (contained within a Sorting Band) is
ALWAYS printed on the same page as the band immediately preceding it in the
Report Painter screen. This ensures that the structure is never printed on a page by
itself, thus eliminating "orphan" bands. An "orphan" band in this case is defined as a
Group Footer, or last detail item in a related group of items, that are printed on the
following page separated from the rest of it's related items.
Print This Band At The Same Page With Next: This attribute specifies that the
Detail, or Group Header/Group Footer structure (contained within a Sorting Band) is
ALWAYS printed on the same page as the band immediately following it in the
Report Painter screen. This ensures that the structure is never printed on a page by
itself, thus eliminating "orphan" bands. An "orphan" band in this case is defined as a
Group Header, or last detail item in a related group of items, that are printed on the
previous page separated from the rest of it's related items.
Print After This Band The Text Field: This attribute is used whenever you wish to
print a database field that is a large MEMO type database field, which are
commonly used to contain large amounts of text (such as notes). A normal Frame
will be unable to print a memo database field within it's defined space; by checking
this feature the selected database field will be printed after the report band in it's
entirety without truncation. If there is insufficient space to print all of the information
the remainder of the field information will continue printing on the next page.
For the vast majority of reports that you build the default values will work just fine. For
examples on how to use the features to their fullest potential please reference the
"How To" section of this help file for useful printing tips & tricks!
2.4.4
PropertyBoxWindow
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
30
The Property Box Window is used to add/edit an object on the report page inside of a
Frame. By default it is empty (as shown above). You can manually type information
into the Contents entry field (colored light blue), or click the button just to the right of
the entry field to use the Dictionary to help add an object to the report.
To modify how the report object is displayed on the report page click the Picture tab:
This tab of the Property Box Window contains an entry field (colored light blue) that
you can manually enter a picture for the selected object, or click the button just to the
right of the entry field to use the Picture Wizard to help create the appropriate picture.
If you leave the Picture entry field empty the object will print on the report page for the
entire length that the object is defined - for example, if you selected a database field
that is 30 characters in length, then it will occupy 30 positions on the report page. If
you enter a picture that limits that database field's length (ex: @S10), then only that
number of characters (ex: 10) in the string will print inside of that Frame.
2.4.5
UpdateTotalWindow
The above screen capture shows the dialogue box used to create a variable (storied
in the computer's memory) that can temporarily store numeric information (e.g. dollar
sales; inventory count) as the report is being generated. This screen is accessed from
the Dictionary.
Each of the entry fields (as shown above) require information from you to define the
information that is gathered as the report is being generated:
Assign Name: This entry field is blank by default; the above screen capture shows
TOT2:Quantity as the fictional name for this variable. It is a good idea to create a
name that resembles the content of the variable, and use a standardized naming
convention. It is also a good idea to use the standardized naming convention of
PREFIX:NAME when defining variables; the prefix can be 1-4 characters in length;
the colon character (:) is mandatory, and then a name that can be 1-12 characters
in length. By using the same prefix name (e.g. TOT2) you will be able to more easily
2005-2014 Scott Daughtry/Oleg Fomin
31
Fomin Report Builder
find and understand the variable's purpose in the Report Builder.
Field/Expression To Total: Click the button to the right of the entry field to display
the Dictionary to help select the database field(s) that you want to be added
together as the report is being generated.
Picture: Click the button to the right of the entry field to display the Picture Wizard
to define how this variable will be printed onto the report page.
Total Type: The drop list has the following options available to define what action to
take on the "field/expression to total" database field that you selected:
Sum
Average
Count
Minimum
Maximum
Evaluate
Evaluate On: The drop list has the following options available to define when to do
something against the "field/expression to total" database field that you selected:
o At each record retrieve
o At the end of the group
o At the end of the report
o At the end of every page
2.5
Overview: Pictures
A Picture is a way of converting information from it's original format to a different
format. Pictures can be used for database fields, built-in variables, user-defined
variables, and text that you enter onto a report page inside of a Frame. A Picture is
defined/accessed for a report page object using the Property Box dialog box and then
clicking the Picture tab:
You can manually type in a Picture value or use the Picture Wizard (the blue icon next
to the light-colored blue entry field). You can change a Picture at any time - remember
that a Picture only changes how data is displayed on a report page - it won't change/
delete any database information. If you decide you don't like the Picture for a frame
you can change it to something else and then use the print preview screen to see the
result.
Here are some sample pictures that are commonly used. Each Picture has sample
data, and the resultant output listed by category:
Numeric
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
32
@N9
4,550,000
@N_9B
4550000
@N09
@N*9
004550000
***45,000
@N9_
@N9.
@N9.2
4 550 000
4.550.000
4,550.75
@N_9.2B
4550.75
@N_9'2
4550,75
@N9.'2
4.550,75
@N9_'2
4 550,75
@N-9.2B
@N9.2@N(10.2)
@N$9.2B
@N$10.2-
-2,347.25
2,347.25(2,347.25)
$2,347.25
$2,347.25-
@N$(11.2)
$(2,347.25)
@N12_'2~ F~
@N~L. ~12'
@N~£~12.2
@N~kr~12'2
@N~DM~12'2
@N12_'2~ mk~
@N12'2~ kr~
1 5430,50 F
L. 1.430.050
£1,240.50
kr1.430,50
DM1.430,50
1 430,50 mk
1.430,50 kr
Nine digits, group with commas
(default)
Nine digits, no grouping, leading
blanks if zero
Nine digits, leading zero
Nine digits, asterisk fill, group with
commas
Nine digits, group with spaces
Nine digits, group with periods
Two decimal places, period decimal
separator
Two decimal places, period decimal
separator, no grouping, blank if zero
Two decimal places, comma decimal
separator
Comma decimal separator, group
with periods
Comma decimal separator, group
with spaces,
Leading minus sign, blank if zero
Trailing minus sign
Enclosed in parens when negative
Leading dollar sign, blank if zero
Leading dollar sign, trailing minus
when negative
Leading dollar sign, in parens when
negative
France
Italy
United Kingdom
Norway
Germany
Finland
Sweden
Scientific
@E9.0
@E12.1
@[email protected]
@E12_.4
1,967,865
1,967,865
1,967,865
.000000032
1,967,865
.20e+007
1.9679e+006
-1.9679e+006
3.2000e-008
1 967.865e+003
Date
@D1
@D1>40
@D01
mm/dd/yy
mm/dd/yy
mm/dd/y
10/31/59
10/31/59
59/10/31
2005-2014 Scott Daughtry/Oleg Fomin
33
2.5.1
Fomin Report Builder
@D10
@D11
@D12
@D13
@D14
@D15
@D16
@D17
@D18
yyyy/mm/dd
1959/10/31
yymmdd
591031
yyyymmdd
19591031
mm/yy
10/59
mm/yyyy
10/1959
yy/mm
59/10
yyyy/mm
1959/10
Windows Control Panel setting for Short Date
Windows Control Panel setting for Long Date
Time
@T1
@T2
@T3
@T03
@T4
@T5
@T6
@T7
@T8
hh:mm
17:30
hhmm
1730
hh:mmXM
5:30PM
hh:mmXM
05:30PM
hh:mm:ss
17:30:00
hhmmss
173000
hh:mm:ssXM
5:30:00PM
Windows Control Panel setting for Short Time
Windows Control Panel setting for Long Time
Pattern
@P###-##-####P
@P<#/##/##P
@P(###)###-####P
@P###/###-####P
@p<#:##PMp
@P<#' <#"P
@P<#lb. <#oz.P
@P4##A-#P
@PA##.C#P
215846377
103159
3057854555
7854555
530
506
902
112
312.45
215-84-6377
10/31/59
(305)785-4555
000/785-4555
5:30PM
5' 6"
9lb. 2oz.
411A-2
A31.C2
Picture Wizard
The Picture Wizard is defined/accessed for a report page object from the Property
Box window, and resembles this:
After clicking the blue icon (to the right of the light blue colored entry field) a popup
wizard is displayed:
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
34
As shown above, radio buttons are available for all possible data types. After
selecting the appropriate data type (by clicking on a radio button), click the NEXT
button to continue the wizard process. After you have stepped your way through the
wizard you can click the OK button to accept the newly formatted picture, or click the
CANCEL button to lose the changes.
Click on a hyperlink below to see how the wizard adapts itself based upon the radio
button that was selected:
Numeric Picture Wizard
Scientific Picture Wizard
Date Picture Wizard
Time Picture Wizard
Pattern Picture Wizard
String Picture Wizard
2.5.2
PictureDate
Shown below are screen captures of the Picture Wizard for the Date radio button;
after making your selection click the NEXT button until there are no more screens left
in the wizard:
2005-2014 Scott Daughtry/Oleg Fomin
35
2.5.3
Fomin Report Builder
PictureNumeric
Shown below are screen captures of the Picture Wizard for the Numeric radio button;
after making your selection click the NEXT button until there are no more screens left
in the wizard:
2.5.4
PicturePattern
Shown below are screen captures of the Picture Wizard for the Pattern radio button;
after making your selection click the NEXT button until there are no more screens left
in the wizard:
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
2.5.5
36
PictureScientific
Shown below are screen captures of the Picture Wizard for the Scientific radio button;
after making your selection click the NEXT button until there are no more screens left
in the wizard:
2.5.6
PictureString
Shown below are screen captures of the Picture Wizard for the String radio button;
after making your selection click the NEXT button until there are no more screens left
in the wizard:
2.5.7
PictureTime
Shown below are screen captures of the Picture Wizard for the Time radio button;
after making your selection click the NEXT button until there are no more screens left
in the wizard:
2005-2014 Scott Daughtry/Oleg Fomin
37
2.6
Fomin Report Builder
Overview: Bands
Bands are used by the Report Builder to generate information contained inside one or
more database files of this computer application to a report page. There are eight
different types of Bands available to you when creating a report:
Page Header Band - Your report can contain only one page header. This report
band is printed at the top of the output on each generated report page.
Report Header Band - Your report can contain only one report header. This report
band is printed at the top of the output on only the FIRST generated report page.
Sorting Band - Your can have multiple Sorting Band details on a report. A sorting
band may contain it's own header, footer and/or additional breaks. A sorting band is
the mechanism for SORTING a report; it is also used to perform page breaks when
a value changes within a database file.
Group Header Band - This band is printed at the top of each page when the group
break value has changed.
Detail Band - You can have multiple DETAIL bands in a report. A detail band is
responsible for retrieving database information required for the report and printing
the data onto the report. .
Group Footer Band - This band is printed at the bottom of each page when the
group break value has changed.
Report Footer Band - This band is printed at the bottom of the last generated
page in the report.
Page Footer Band - This band is printed at the bottom of each page in the
generated report.
Your report MUST have at least one Detail Band or Group Band (which can be either
a Group Header or Group Footer) to print a useful report (i.e. one that contains
database information). By default there are NO band's added to a new report - it is
up to you to decide what band(s) are required to create the desired reporting output.
2.7
Overview: Filters
Rarely do reports contain every database record's content; a report 'Filter' is how a
report's output is reduced to only what is needed (e.g. instead of printing a list of
every customer, the report will use a filter to only print customers who purchased
something in the past 12 months).
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
38
Understanding database filters is crucial to printing useful reports that print only the
information that is required for your needs. Once you learn some basics of database
filters you will find them extremely useful in building your reports - they are very easy
to use!
Some database programs may provide a "Query Wizard" that enables you to easily
create / use / save database filters. If this is the case with this database application
then please consult it's documentation on how to use this Query Wizard feature; note
that you don't have to use the Query Wizard and can instead use a Report Builder
filter if so desired.
This help file breaks down database filters into smaller pieces to help you in
understand what a filter is and how to create increasingly complex filters. It is
recommended that you at least glance over each topic; if you get stuck you can
always reference these help topics when creating your own database filter:
Filters
Filters
Filters
Filters
Filters
2.7.1
Tutorial Part
Tutorial Part
Tutorial Part
Tutorial Part
Tutorial Part
12345-
What is a database filter?
What are the components of a database filter?
Simple filters to get started
Stopping common filter problems before they start
Combining multiple conditions into one filter
Overview: Filters Part 2
A database filter enables you to extract information from database file(s) that you
want to print on the report's page. The ability to use filters has always been one of the
strongest features of database applications (dBase, Foxpro, Access, etc), as filters
allow you to limit the output of a huge database into a very specific report. While they
can be a little confusing at first, if you understand some basic concepts of how to
create a database filter you will find them to extremely helpful in creating useful
reports (and have them mastered in no time at all)!
Important Note: Filters do not change any information contained in database file(s);
they don't copy information to another file either. A filter simply "hides" information that
you don't want to see, which explains why they are called "Filters". No matter how
many times you create or use a database filter, you are guaranteed that they will
NEVER harm your database information. Hopefully this will give you the confidence to
try creating filters for various purposes.
2.7.2
Overview: Filters Part 3
A filter relies on 3 pieces of information to work:
2005-2014 Scott Daughtry/Oleg Fomin
39
Fomin Report Builder
1. A field name from the database
2. An operator symbol
3. The text string or number to compare the selected database field against
Let's examine each of these 3 pieces a little more closely:
The database field name is defined in the the database structure. If you haven't read
up on databases and what they are made of click HERE for an explanation. The
Report Builder doesn't assume that you haven't memorized the structure of each
database file in your application; the Dictionary window allows you to choose the
database field from a list of every database field that the application uses.
For this small example, let's assume that you have a database field named "City"; it is
2 character positions long and contains only text abbreviations ("az", "ca", "tx", etc) of
the 50 states in the United States.
An operator symbol tells the Report Builder what you want to do with the database
field that you've chosen from the dictionary. Again, the Dictionary helps you by
displaying a list of every operator that are available for building filters. You select an
operator symbol based upon the type of information contained in the database file.
Some operators are used only on text (such as "="); some are only used on numeric
information (such as ">", "<"). For this example we have chosen a text field, so we will
use the equal sign for the operator symbol.
The last piece of the filter is one that you provide; only you know what information you
want to extract from the database! For this example let's assume we want to print a
report of only those customers living in Texas; the abbreviation for Texas is "tx", so
we will use "tx" as the last piece of the filter. So, our first filter example looks like this:
INV:State = 'tx'
Granted, this is a very simple filter, but it clearly shows all 3 filter components - easy,
right?!?
Let's modify the filter to use a numeric field and a numeric operator. Let's assume that
we want to print a report of all customers who have at least a $5000 line of credit with
our company. A sample filter would resemble this:
CUS:LINEOFCREDIT > 5000
Again, this is a very simple filter that shows how a filter is structured.
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
2.7.3
40
Overview: Filters Part 4
In the previous tutorial page some simple filters were shown to help you understand
the components of a database filter. A database filter can be very simple or fairly
complex - it depends on the type of report that you are attempting to create. In their
most simple form database filters can be used for three different situations:
You are extracting information based on text
You are extracting information using numbers
You are extracting information based on a logical condition
Here are some sample situations and a simple database filter for each:
1. Customers who drive a BMW:
2. Products made by MierWater:
3. Items with an onhand quantity greater than 20:
4. Children who are too young to be in Kindergarten:
5. Customers who have pets:
6. Items with no detailed information available:
CUS:CarType = 'bmw'
ITM:Company = 'mierwater
ITM:QtyOnhand > 20
Nam:Age < 7
NAM:Pets = 1
ITM:Detailed = 0
The six above example filters above are very simple in their structure but some
interesting details become apparent:
The first 2 filters for Text-type filters require a quote symbol (') before and after the
text string that you are comparing against the database field ('bmw'; 'mierwater')
The next 2 filters for Integer-type filters don't use a quote symbol; quote symbols
will change the integers (aka: numbers) into a text string so they cannot be used
here
The last 2 filters for Logical-type filters use either a 0 (False) or 1 (True) to indicate
true or false. This is because the information for this database field is stored as a
one position integer (aka: number) in the database. For those of you with dBase
experience this is quite different than what you are used to, as dBase stores a value
of true as "Y" or "T" and a negative value as "N" or "F".
2.7.4
Overview: Filters Part 5
In the previous help topic some increasingly complicated filters were displayed. While
structurally correct, they could use some modification to make them 100% reliable.
You never know exactly how database information is stored; while some database
programs have very strict safeguards incorporated in them to ensure data is highly
structured, most don't. It is better to think defensively and create database filters that
will work correctly in any situation instead of assuming everything within the report is
all that existed within the database.
2005-2014 Scott Daughtry/Oleg Fomin
41
Fomin Report Builder
Let us assume that a database program tracks customer sales. The data entry
screen allows you (or your sales staff) to type in the customer name, their address,
phone number, etc. Let us assume that the boss wants a report printing all customers
living in Burbank; a simple filter should work:
CUS:City = 'Burbank'
The filter above looks correct, and would work IF the data entry clerk ALWAYS typed
in the city named 'Burbank' the same way every time. However, what would happen if
the CapsLock key was turned on for one data entry session and the clerk typed in
'BURBANK' for several dozen customers? If you guessed that the above filter example
wouldn't work 100% of the time you would be correct! That is because the
comparison of the database field CUS:CITY must EXACTLY match the text string
'Burbank' as it is currently defined; however, there are several ways of fixing this
common problem. For example, if you wanted to create a lot of work for yourself you
could define the filter like this:
CUS:City = 'Burbank' or CUS:City = 'BUrbank' or CUS:City = 'BURbank' or CUS:City =
'BURBank' or CUS:City = 'BURBAnk' or CUS:City = 'BURBANk' or CUS:City =
'BURBANK'
Thankfully there is a much easier (and reliable) way of fixing this problem and ensure
the filter works 100% of the time!! By using the functions UPPER() or LOWER() you
can define the filter like this instead:
upper(CUS:City) = 'BURBANK'
-orlower(CUS:City) = 'burbank'
Either filter method is guaranteed to work 100% of the time because you are forcing
the database field's contents to only one specific text case that can be exactly
compared against. You will also greatly increase the operational speed of the filter by
using the upper() or lower() functions instead of using the previous very long filter
example.
To learn more about the built in functions in the Report Builder click HERE.
The important thing to consider here is this - never take for granted that database
information will be typed in exactly as you think it is. The Capslock key can cause you
a great deal of grief, but the built-in Report Builder functions can quickly solve this
problem for you!
2005-2014 Scott Daughtry/Oleg Fomin
Introduction
2.7.5
42
Overview: Filters Part 6
As mentioned before, database filters can be very simple or complex; it depends on
the situation. To accommodate more complex filter situations you must used
BOOLEAN OPERATORS within the filter condition. These are used to "join" together
multiple database filter conditions (also known as Expressions). As you may have
guessed, it is important to know how to properly use a BOOLEAN OPERATOR to
achieve the desired result.
There are only a handful of BOOLEAN OPERATORS; you will use only 4 of them to
create complex filter conditions:
1. AND
2. OR
3. NOT
4. XOR
Let's use some example situations and display what a sample filter would be for each:
1. Customers from Texas that make over $50000 a year:
upper(CUS:State) = 'TX' AND CUS:Income > 49999
2. People who like ice cream or truffles:
CUS:IceCream = 1 OR CUS:Truffles = 1
3. Cars that can be any color except orange :
upper(INV:Color) NOT = 'BLACK'
Notice that every time we are comparing a text string (such as the state field) against
a database field's contents that the function UPPER() is used. This is a good practice
to get into; whenever your filters are using/comparing text use the UPPER() or
LOWER() functions.
Notice that the CUS:IceCream and CUS:Truffle fields are true/false fields; a value of
one means that the field is TRUE (a value of zero would mean false).
Notice that the NOT operator is used with the equal sign; this BOOLEAN OPERATOR
is most commonly used with another CONDITIONAL OPERATOR (greater than, less
than, equal to).
It is important to understand that there is an order of precedence involved when
combining two or more expressions into one filter. A simple definition for "precedence"
can be "what the computer will look for first in the database". There are five levels of
precedence:
Level 1: Parenthesis characters that surround a portion of a filter expression
Level 2: Conditional operators (<, >, =, etc)
2005-2014 Scott Daughtry/Oleg Fomin
43
Fomin Report Builder
Level 3: NOT
Level 4: AND
Level 5: OR
When the filter expression is evaluated the precedence order will determine the result
of the filter. The filter always returns a value of either TRUE or FALSE; either the
database field(s) matches what you are checking for or it doesn't! There is no other
result that a filter can return. Keeping this in mind here are some additional filter
examples:
upper(CUS:Car) = 'FERRARI'
Above we are checking for customers who own cars made by Ferrari; if their car is a
Honda then the filter condition returns a value of FALSE, and won't be selected for
printing on the report. Let's modify the filter to check for 'Ferrari' and 'Lotus'
automobiles by using a BOOLEAN OPERATOR:
upper(CUS:Car) = 'FERRARI' AND upper(CUS:Car) = 'LOTUS'
In this example the BOOLEAN OPERATOR of AND is being used. However, let's
examine what is happening, and why the above example will fail. The BOOLEAN
OPERATOR of AND means that both expressions MUST return a value of TRUE for
that database record to be selected. There is no way a car can be both a Ferrari
AND a Lotus so that database record will be skipped! We need to change the
BOOLEAN OPERATOR to use the OR operator so the filter looks like this:
upper(CUS:Car) = 'FERRARI' OR upper(CUS:Car) = 'Lotus'
If the car isn't a Ferrari the OR BOOLEAN OPERATOR will continue evaluating the
filter expression, since a value of TRUE isn't required for the first part of the
expression. Therefore if the car is a Ferrari or a Lotus that database record will be
selected for printing.
You can create very long filters by using BOOLEAN OPERATORS; some examples:
Male customers over 30 who drive a Lincoln or Cadillac automobile
upper(CUS:Sex) = 'M' and CUS:Age > 30 AND upper(CUS:Car) = 'Lincoln' or upper
(CUS:Car) = 'Cadillac'
Clients between the ages of 30 and 40
CUS:Age > 29 AND CUS:Age < 41
2005-2014 Scott Daughtry/Oleg Fomin
44
3
Fomin Report Builder
Basics You Need To Know (aka: The Tutorial)!
The hyperlinks shown below will teach you how to create a very generic report (steps
1-3), modify the generic report into a more useful report (steps 4-9), and then perform
add more sophisticated features for a complicated report (steps 10-18).
Overview
Step 1: Reports Manager Screen
Step 2: Create/Save A New Report File
Step 3: Details & Frames
Step 4: Modifying Frame Contents
Step 5: Resizing The Detail Band
Step 6: Adding A Page Header
Step 7: Sorting Information
Step 8: Functions & Pictures
Step 9: Combining Info Into A Frame
Step 10: Multiple Sorting
Step 11: Filters
Step 12: Filters Part Two
Step 13: Adding Graphics
Step 14: Adding A "Record's Printed" Counter
Step 15: Page Breaks
Step 16: Using Total Fields
Step 17: Using Group Total Fields
Step 18: Using Grand Total Fields
3.1
Basics: Overview
This tutorial will explain how to design a very simple report and then gradually add
new features to the same report to show how to create increasingly more
sophisticated reports. Even though the database files used in the tutorial are different
than yours, the steps involved are still the same. The database file structure for the
tutorial is very simple:
FIELD NAME
NAM:Lastname
NAM:Firstname
NAM:Middle
NAM:Adrs1
NAM:Adrs2
NAM:City
NAM:State
NAM:Zipcode
DESCRIPTION
First name
Last name
Middle Initial
Address Line 1
Address Line 2
City
State
Zip Code
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
NAM:Country
45
Country
Note: Some tutorial help topics may use different database file structures as needed
to provide adequate instruction.
Later in the tutorial a report using two database files that are related to each other
(aka: a relational database) will be used to show how to create more advanced
reports.
3.2
Basics: Step 1 (Report Manager Screen)
On the previous page the database structure was described - only 9 fields are used in
this small database. Most likely this database program will have more fields, but nine
fields are enough to learn with.
It is assumed the fictional database application is open at this point, and you have
selected the Reports Manager option from the application's pull down menu. This will
display a screen similar to this:
The above screen capture is called the "Reports Manager" screen. It keeps track of
all the reports that have been designed for/by you for this software program. Reports
are saved in an application sub-folder named REPORTS; the category for this report
is "Report On Name". The category name will be different for your software program,
but the remainder of the screen will look pretty similar (depending on your
programmer's artistic tastes for colors, button size/icons, etc).
Reports you create are saved as individual files with a file extension of *.RPT in
the \REPORTS sub-folder that this database program is installed to. The Reports
Manager also shows detailed information about the saved reports (date/time of
creation, file size).
2005-2014 Scott Daughtry/Oleg Fomin
46
Fomin Report Builder
Depending on the complexity of your database program, there may be several
categories displayed above, with multiple reports created for each category. Because
the Reports Manager uses a "tree" style browse you can easily expand/contract the
"tree" branch to locate the desired report.
Beneath the browse area are various buttons that allow you to print the highlighted
*.RPT report file, expand/contract the reports "tree", create a new report, change the
highlighted report, delete the highlighted report and close the Reports Manager
window.
To create a new report click the INSERT button. This will display the Report
Formatter screen to create/modify report(s).
3.3
Basics: Step 2 (Create/Save A New Report File)
If you've not familiarized yourself with the Report Formatter screen you need to right
now (and then return here).
There are two goals for any report that you create; it must
1. Properly extract information that you need
2. Be visually pleasing
The second goal is sometimes elusive; everyone has their own opinion on how reports
should look. The first goal is much simpler (once you understand how the Report
Builder "engine" works).
It helps some users to think of a Report Builder as a big circle. Inside the circle is the
information that you (or your users) have inputted into the database. Using a DETAIL
BAND in the report will start at the top of that circle (at the first database record),
then loop through all the inputted information until the last database record is reached,
bringing you back to the top of the circle once again. A DETAIL BAND is normally
used for doing the "grunt work" of accessing the database, retrieving the database
information and printing the database field in the area that you tell it to (aka: going
around the circle).
Almost every report that you create will have a DETAIL band in it. While there are
many different types of report "bands" that you can use, a DETAIL band (or a Group
band) is mandatory - without one of those two types of report band the reporting
'engine' won't know how to cycle through the database's contents (from the first
database record to the last). Before adding a DETAIL band let's define some basic
information about the report.
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
47
Click the main menu option titled FILE, then select REPORT PROPERTIES from the
drop down menu. A window will appear asking you for the Report Properties. The
Report Title is the report's description that will be displayed in the Reports Manager
window - you want to give a meaningful description so that others can understand in
this entry field. The Record Filter entry field allows you to use the Data Dictionary to
assist in creating a filter condition. Record Filters will be described in much more
detail in later lessons - in a nutshell a filter allows you to print ONLY the information
that you desire (such as: print all names for customers living in Hawaii). Here is what
the screen looks right now:
Click on the second tab labeled "Page layout"; on this tab you can override the default
settings for the generated report. The default settings are for 8.5x11 portrait output,
with small margins on all 4 sides of the generated report page. You can also change
the report orientation to landscape by clicking on the Landscape check box. For now
the default settings will be used. Here is the screen:
Click the SAVE button to save the report page information. At this point we need to
save the report to the *.RPT file that is stored in the \REPORTS directory. Click the
FILE main menu option, then select the SAVE AS menu option. A window will appear
onscreen that you've seen in other Windows applications - you are being prompted for
a location to save the file and a unique file name for the file. The default folder to save
the report definition file to will be the \REPORTS folder located directly "underneath"
the location where your database program is installed to. This is the desired location
for ALL reports that you create - ALWAYS save your reports in the \REPORTS
folder! For the file name you want to create a unique file name for all new reports.
You can use the Windows 95/98/NT long file names if you want, or give it a 8
character file name - the choice is yours. Leave the *.RPT file extension alone - you
2005-2014 Scott Daughtry/Oleg Fomin
48
Fomin Report Builder
do NOT want to use a file extension different that *.RPT!! For this report a file name
of PEOPLE1 will be given, with the screen resembling:
Now that the file name is input the OK button is clicked to save the report file. The
report's file c:\clarion5\frb\reports\people1.rpt is now saved to the hard drive. Each
report that you create must be saved to a DIFFERENTLY NAMED *.RPT file. You will
also notice that the top of the report painter window now displays some of the
information that was just entered above:
To recap: on this page you learned:
Generically speaking, every report needs a DETAIL band to extract/print database
information
How to create a new report file and save it to your computer's hard drive
How to change the dimensions of a report (from portrait to landscape, etc)
How and where report files (*.RPT) are saved on your computer
3.4
Basics: Step 3 (Details & Frames)
Now we are ready to define the DETAIL band for this sample report. To recap, the
DETAIL band performs the data retrieval from the database and inserts database
field contents into the desired location in your report.
SUGGESTION: Sometimes it is a good idea to draw the sample report on a piece of
paper to help you "visualize" how the report needs to look when it is generated. If you
are creating report(s) for other people you definitely need to discuss with them how
they want their reports to look like to determine how information will need to be
extracted from the database file(s) and then placed onto the report page(s).
If you haven't familiarized yourself with FRAMES you need to now!
At this point in the report creation process the Report Formatter workarea inside the
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
49
Report Builder is completely blank - only the top menu and toolbar buttons visible.
Click on the BAND main menu option, select NEW and then select DETAIL from the
menu options. Notice that the Report Formatter screen now has a rectangular box
with red boxes at each corner and the top/bottom middle. A ruler bar is now displayed
to the left of the rectangular box also. The red rectangles allow you to resize the size
of this report band - we'll leave it alone for now.
Now database fields need to be added to the DETAIL band. Database fields are
placed inside of FRAMES - a FRAME tells the Report Builder engine how and what to
print in the location where the FRAME is placed inside of a report band. There are
two ways of adding a FRAME to the DETAIL band - you can select from the main
menu "Frame", then "Create" - an empty FRAME is then created inside the DETAIL
band at the top left of the DETAIL band. An easier way to create an empty FRAME is
to place the mouse in the area where you want to print the contents of a database
field; right click the mouse to display a pop-up menu; select the menu option titled
"New Frame", and an empty frame will be created in the location where the mouse is
positioned inside the DETAIL Band.
You can move a frame at any time (e.g. after it's been placed inside of a report band
or after you have defined what type of information the frame will contain [e.g. text or
the contents of a database field]). To move the frame with the mouse left click
anywhere inside the frame, and while holding down the left mouse button drag the
Frame to the desired location. You can also use the keyboard to move the frame by
holding down the CTRL key and use the arrow keys to move the frame in the desired
direction. Here is what the screen looks like for now:
To add text to a frame left click the mouse once inside the CONTENTS entry field in
the FRAME properties box; as information is typed it will be displayed inside of the
FRAME. If the length of the text is longer than the frame you can resize the frame by
clicking on the right middle red box; while holding down the left mouse button drag the
box to it's desired new size. The mouse cursor will change shape from an arrow to a
double arrow, which means you can resize the FRAME in the directions of the arrow
by left click-dragging the mouse.
For now we are just adding the database fields to the DETAIL band; left click on the
button with the flashlight inside it to display the dictionary When the dictionary
appears onscreen click the tree expand box directly underneath the 'Processed Files'
description. A list of all database fields is displayed onscreen for you to choose from:
2005-2014 Scott Daughtry/Oleg Fomin
50
Fomin Report Builder
To select a database field double left click on the field name description; for this
example the "Last name" tree 'node' (i.e. 'choice') is double left clicked to transfer the
contents of that database field into the selected frame. The dictionary window will
disappear, and the Frame Properties window is now updated with the database field
information:
Notice that an equal sign (=) is displayed in front of the field name (NAM:lastname)
Also notice that the inside of the frame is displaying dollar signs ($). The dollar sign
symbols are displayed onscreen to help you resize the frame size for this database
field within the report band.
At this point the steps for adding a new frame and populating the frame are repeated
for each of the remaining database fields that you want printed onto the report page.
After moving the mouse to the desired location inside the DETAIL band I am right
clicking the mouse, selecting "New Frame", select the desired database field, and
then dragging the frame to be to the right of the last added frame. All frames will be
located at the top of the DETAIL band. For the Middle Initial field I resized the frame
to accommodate a single character (A-Z) since the frame is a lot wider than it needed
to be for this report. There is not sufficient space to have all the frames at the top, so
the COUNTRY field had to be left off of the report. Here is what the screen looks like:
Not too pretty, huh? We need to move the frames so they are aligned at the top for a
nicer looking report. The Report Builder features a very easy way of aligning frames in
many different ways. You can choose to move each frame yourself using the mouse,
or the keyboard, but this can be very time consuming - there is a much easier way!
The first thing to do is select all the frames on an imaginary line that you want the data
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
51
to be printed on. To do this you will left click the leftmost frame; while holding down
the CTRL key you will left click on each additional frame located on that imaginary
line. After you've selected the last frame you will have multiple frames displaying the
resize rectangles at each corner, but they will be blue in color. Right click the mouse
to display a pop up menu - this pop up menu will display various options to align
multiple frames. The easiest choice now is titled ALIGN TOP; after selecting it from
the menu all the frames are now aligned in a more pleasing way (with the top of each
frame now aligned horizontally within the report band):
So far we have one DETAIL band with eight frames that contain database fields. We'll
save the report right now by clicking the floppy disc button located on the toolbar. You
can also save the report by clicking FILE from the main menu, then select SAVE. It is
a VERY good idea to periodically save your work as you change the report.
Now we need to test the report to see how it looks. Click FILE from the main menu,
then select EXIT from the pull down menu. You will notice that the Reports Manager
screen appears different now:
The newly created report file is now displayed onscreen, with the file name / date /
time / size information about this report file displayed in the list box. To print the report
click the PRINT button; the report will be sent either to the screen (print preview) or to
the printer, depending on how the application developer designed the application. For
this example the report was generated to the screen; the database only contained 4
database records, so the output was very small:
2005-2014 Scott Daughtry/Oleg Fomin
52
Fomin Report Builder
Chances are excellent that the print preview screen will be different than the one
displayed above; the above screen capture uses a very simple print preview engine.
The important things to notice here is the layout of the information to detect problems
with how the report will be sent to the printer. Using the print preview display we can
see the following problems:
There is too much space between each line of information - this would waste a lot of
paper!
The street address field is getting chopped off before all the information is printed
(ex: 419 Anger Ma)
The country field is missing because insufficient space existed for it on the DETAIL
band
The name fields could be formatted a lot more attractively
There is no sorting being done on the database; it would be nice if information is
sorted by last name
One of the Report Builders most attractive features is it's flexibility - you can change
ANYTHING you want to for your reporting needs. The problems identified above with
the first report are very easily fixed. We will be fixing these things in the next tutorial
step.
To recap: on this page you learned:
It's a good idea to draw a report on paper first during brainstorming sessions
How to add a DETAIL band
How to add a FRAME onto the band
How to select a database field from the dictionary that is printed from inside a
FRAME
How to align multiple FRAMES with minimal effort
How to print the new report to check for printing problems
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
3.5
53
Basics: Step 4 (Modifying Frame Contents)
Now it's time to clean up the report and make it more presentable for yourself and/or
your customers! Remember you can move FRAMES with either the keyboard OR the
mouse - the choice is yours. For moving a FRAMES in very small increments the
keyboard is more precise and easier to accomplish; use the mouse to select multiple
FRAMES (hold down the CTRL key, then left click on each desired frame to select
them individually), then use the keyboard to move the selected FRAMES (while
holding down the CTRL key, use the arrow keys to move the selected frame(s) up/
down/left/right) to where they need to go (yes, you can move multiple objects at one
time!). Also note that the TAB key on the keyboard will select the next FRAME for
you; shift-tab will select the previous FRAME (just as in other Windows programs that
you use).
Reopen the report that was just created from the Reports Manager by highlighting it
inside the Report Manager screen, then click the CHANGE button. This will display
the Report Formatter screen once again, with everything just as we saved it from the
previous session.
The first thing to change is the default font; some fonts used in Windows are more
attractive than others. The Verdana font was designed specifically for readability and
makes an excellent choice for reports. You can easily (and quickly) change the font
used inside ALL frames in the report by clicking FILE, then select the FONT menu
option. You will see a standard Windows font selection window onscreen that allows
you to select a desired font, it's style (e.g. BOLD, Italics), and size. Once you select
a font and click the OK button you will notice that all of the FRAMES in the DETAIL
band will change their font. Be aware that some fonts print larger than other fonts, so
if you are tight on space select a font that is narrower than other fonts. For now we'll
select Verdana-Regular-8.
Located on the Report Formatter toolbar is a button with a blue "A" inside it - this font
button will change the font ONLY for the currently selected FRAME (i.e. has the red
resizing boxes on the corners). It will NOT change the font used for the entire report!
Click the FRAME that contains the LAST NAME field previously selected from the
database - we want to make it stand out on the report. After left clicking that frame
click the blue "A" button, select Bold, then click OK. The contents of that frame will
now be boldfaced - you may need to resize this frame since bold text requires a little
more space (because each letter is now a little bit wider).
Each FRAME in a report can print in a different font; they can even print in different
colors! Try not to use too many different types of fonts in your report, as it can
become a distraction and make reading more difficult. Stick with common fonts that
are loaded on everyone's machine; otherwise Windows will substitute the font you
chose (but isn't installed on another computer) with a font that will cause printing
2005-2014 Scott Daughtry/Oleg Fomin
54
Fomin Report Builder
problems (such as a column bleeding into the next column, improper spacing, etc).
To recap: on this page you learned:
How to change the default font used in a report
How to change the font characteristics for a single frame
Each frame can be formatted with a different font
Choose a font that should be installed on everyone's computer
Changing a font/font's properties might require a frame to be widened
3.6
Basics: Step 5 (Resizing The Detail Band)
At current, the DETAIL band is wider than it should be, which is adding a lot of blank
space underneath each printed line. This is easily fixed, and there are two ways to do
it:
1. Resize with Mouse: Left click once on the DETAIL band border line (it should be
displayed as a light grey box) to make the resize boxes appear. Select the middle
resize box on the bottom of the DETAIL band, and drag it upwards until it is flush with
the bottom of the FRAMES. The report builder will not allow you to resize the DETAIL
band smaller than required, so you'll only be reduce it's size to a certain point.
2. Right click the DETAIL BAND; from the pop up menu select 'Band Properties'; click
the tab titled 'Position' and then make the value for the 'Height' spinbox a smaller
value:
This method of resizing a Report Band is often easier than resizing with a mouse 2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
55
especially if you have frame(s) placed at the bottom of the Report Band (because the
Report Formatter will usually shift the mouse's focus to a frame when you try to resize
the Report Band if a frame is located near the bottom of that Report Band.)
After resizing the Detail Band to the desired height save the report (click the floppy
disc on the toolbar), exit the Report Formatter window (FILE -> EXIT), and then test
print the report to see how it looks now. Here is what my sample report output now
looks like:
Notice that the last name is BOLD; the huge amounts of blank space after each line
are much smaller now, and the information on each line is aligned horizontally now.
But, there is still work to do on this report before calling it a day!
To recap: on this page you learned:
How to resize a DETAIL band (or any band, for that matter)
How to reduce the amount of blank space that is printed below a line
Two ways to resize a Detail Band and which one might produce easier results
3.7
Basics: Step 6 (Adding A Page Header)
Now we will add a Page Header to the report, which will print the title to our new
report and also print column header information at the top of each page. Open the
tutorial report to display it within the Report Formatter screen.
A Page Header is another type of REPORT BAND that is generated at the top of
each page. The report engine keeps track of how much data can be printed on a
page; when it's time for the printer to eject the page after printing as much information
as it can the Page Header report band is created and printed at the top of the report's
page.
To add a Page Header, select BAND from the Report Formatter pull down menu, then
NEW, then PAGE HEADER. A new empty band named Page Header is inserted
ABOVE the DETAIL band.
A report's title should be something that anyone reading the report will quickly
understand and accurately describes the report's contents. For this report title
example the title will be "Customer Database - ACME Sales". Remember that
everything with a report that is printed requires a FRAME, so create a new frame
inside of the new Page Header band. Add the report title inside of the new empty
2005-2014 Scott Daughtry/Oleg Fomin
56
Fomin Report Builder
frame placed inside of the Page Header band. Most reports have a centered, boldfaced title - here is an easy way of ensuring that the report title is always centered on
the report's printed page:
Place the mouse on the right middle resize box on the empty frame
Resize the box until you reach the right side of the report
Make sure the gaps are the same for the left and right sides of the frame
Type the title inside the FRAME characteristics box
Click the center align button on the toolbar
Click the blue "A" for font type. Select ARIAL, BOLD, 12, then OK
Easy! You now have a title that will always be properly centered, and slightly larger
than the rest of the report to make it stand out. You don't have to create your title like
this - if you want it left or right aligned, or a different size then feel free to do so! You
can also create multiple line titles if you want/need to - the choice is yours!
This report will be a columnar-style report, with frames placed within the Detail Band
side-by-side that will print database information. This style of report normally has a
text heading above each column (to inform the reader what that column of information
is). A column's header should only be printed once on each page - if the column
header frame(s) are placed inside of the Detail Band they will be printed every time a
new database record is retrieved/printed (which is not the desired result) - to print a
column header only once per printed page the Page Header Band is the easiest way
to achieve this effect.
Select the Page Header band. Create a new frame inside the Page Header band
directly above the leftmost frame displayed within the Detail Band and then type in the
header name (in this case, 'Last Name'). Repeat this process of adding a new Frame
and typing a descriptive text title within the new frame for each frame displayed within
the Detail Band until each horizontal Detail Band Frame has a Page Header Frame
associated with it.
After adding all the Page Header frames and their header text you will want to resize
their frames to be be the same width as their corresponding Detail Band frame. After
completing the frame resize each Page Header/Detail band frame "couple" should be
left aligned (to make the report more pleasing and professional looking). To align the
frames so they are even: Ctrl-Leftclick each frame to select them all, then right click
to display the alignment popup menu. then select Align Top. Now they are horizontally
aligned with each other. Go ahead and move the entire line of selected frames until
they are roughly 1/4 inch below the report title. Here is what we have so far:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
57
We can see from the above screen capture that the Page Header band needs to be
reduced in height (i.e. too much space between the frame bottoms and the bottom of
the Page Header band) - otherwise the printed output will have a huge gap between
the column headers and the database information printed in the DETAIL band. Resize
the Page Header band (left click-drag the center red resize box until it can't be
reduced in height anymore to remove that gap; here is the desired result:
Looking pretty good now! However, the column headers would look better if they
were BOLD and UNDERLINED, so go ahead and change each FRAME within the
Page Header band to achieve this effect. You may need to resize a frame if some of
the column's text is cut off when applying the BOLD font attribute.
Now we need to left align the column headers with the data information that is printed
beneath it. An easy way is to first click the header frame, then Ctrl-Leftclick the field
frame underneath it inside the DETAIL band. Once the two frames are selected click
the right mouse button, then select "Align Left" from the popup menu. Repeat this
process for each column until each Header/Detail pairing is left aligned. Remember
that you can move the two selected objects in case they overlap other information by
holding down the CTRL key, then tap the left or right arrow button to move the frames
horizontally. The final result now looks like this:
Once satisfied with the results save your work (click the blue floppy disc) then print a
sample report to the print preview to see how it looks:
Not bad! There is still room for improvement, but we are well on our way to a nice
report. Remember, the Report Builder will print information the way you tell it to YOU control how the reports look, so don't be afraid to experiment. Reports will
NEVER change information in your database file(s) - they are completely safe to
experiment with.
To recap: on this page you learned:
2005-2014 Scott Daughtry/Oleg Fomin
58
Fomin Report Builder
How
How
How
How
How
How
3.8
a Page Header is generated when a report is created
to add a Page Header at the top of each page
to add a report title at the top of each page
to center a Page Header easily
to add column headers in a Page Header band
to horizontally and vertically align column headers
Basics: Step 7 (Sorting Output)
Sorting information on a report is crucial for quickly locating information within the
report - can you imagine using a city phone book if the names of everyone inside it
weren't sorted by last name? The Report Builder allows you to sort information how
YOU want it to be sorted. Reopen the tutorial report so it is displayed in the Report
Formatter screen once again.
The Report Builder engine uses a Sorting Band to sort data the way that you want it
to. To add a Sort Band to your report to enable sorting on a database field (in this
example, the last name database field) select BAND, then NEW, then SORTING
BAND. You'll notice that the cursor changed to a pointed hand. Move the hand until
the tip of the finger is on top of the word DETAIL in the detail band, then left click the
mouse to add a new Sorting Band to the report. Your report will now look like this:
Notice that above the DETAIL band is a new Band entry titled "Sorting Band 1", and a
dialogue box titled "Sort Expression" is displayed below it; the Report Builder is asking
you how to sort the database information. You will be using the dictionary to select
the database field as the primary sort - click the button with the flashlight icon within it
to display the dictionary window onscreen:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
59
This report will be sorted on the Last Name field of the database; expand the "tree"
for the "Names Database" to display onscreen all of the database field names for the
database. Double left click on the Last Name database field entry to insert the NAM:
LastName field name into the entry field for the Sort Expression box:
Notice that the database field name is now entered into the entry field; click the SAVE
button. The information displayed in the Sorting Band detail is now changed to this:
..to let you know how this Sorting Band will be sorting information when the report is
generated. Go ahead and test the sort by saving the report, exit the Report Formatter
screen and then print a sample report to the print preview screen. Here is what the
report looks like now:
Notice that the Last Name field entries are now sorted alphabetically on the printed
page.
To recap: on this page you learned:
You control how database information is sorted on a report
The report engine uses the Sorting Band to perform sorting on a database
How to create a Sorting Band on a report
How to select a database field from the dictionary to sort on
2005-2014 Scott Daughtry/Oleg Fomin
60
3.9
Fomin Report Builder
Basics: Step 8 (Functions & Pictures)
The Report Builder allows you to manipulate database information in a variety of ways
before it is generated to a report's printed page - this capability enables the next
"trick" that will be used to make this report even more professional looking!
Our tutorial report thus far has three columns (aka: frames) that displays the three
components of a customer's name (last name, first name, middle initial) with spaces
between each database field. While this is acceptable, we can make it look much
better by formatting the database information before it is printed. Instead of printing
information inside 3 individual FRAMES we will instead print a formatted name inside
of one FRAME. Not only will this look better, but may also take up less space on that
line of the report! Here is an example of how the report currently prints a customer's
name on the printed page:
PRESLEY
ELVIS
A
and here is how we want it to look:
PRESLEY, ELVIS A
Open the report within the Report Formatter window. Delete the two frames that
currently display the First Name and Middle Initial database fields, and also delete the
paired frames for those two items displayed in the Page Header report band.
Left click the Last Name FRAME within the DETAIL band; the properties box for that
frame should look like this:
If you will recall, each of the three database fields (Last Name, First Name, Middle
Initial) has a lot of blank space after each of their database entries. Report Builder
has a way of removing these trailing spaces by using the CLIP () function with each of
the database fields - here is how to use it.
Open the Last Name frame within the Detail Band and remove the contents of the
frame's "Properties" box. Click the button with the flashlight icon to display the
Dictionary onscreen. Not only does the DICTIONARY maintain the database field
information for this software application but it is also a centralized location for
accessing/using the variety of built in functions to manipulate a Frame's contents. Here
is screen capture showing where the CLIP() function is located inside of the
DICTIONARY window:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
61
Double left click the CLIP(string) Dictionary entry which will insert it into the FRAME
properties window:
Obviously we aren't manipulating a database field called (string); this is simply telling
you that the CLIP() function is used to manipulate a text string (i.e. you can't use this
function on numeric fields). Remove the word "string" from inside the '()' symbols, thus
leaving you with = CLIP() inside the contents entry field. Left click once between the
'()' characters, then click the DICTIONARY button again to select the Last Name
database field from the dictionary. Double click the Last Name database field, which
changes the above screen to look like this:
What this Properties screen is telling you is that this Frame, at run time, will print the
contents of the NAM: Lastname database field after the CLIP() function has
processed it.
We've solved one piece of the puzzle (how to remove the blank spaces that are
stored at the end of a database field's stored content); now we need to combine the
last name database field with a comma character and a blank space after the comma.
To combine two or more strings together we use the Ampersand (&) character; any
text that we want to combine with a database field has to be enclosed in single
quotes. So, here is what the Frame Properties screen looks like now:
So far so good. We have the last name (with all blank spaces removed), and the
comma character added directly after it, with a blank space after the comma. Now it's
2005-2014 Scott Daughtry/Oleg Fomin
62
Fomin Report Builder
time to add the First Name database field; however, remember that the first name
field can also have blank spaces at the end, so we need to CLIP() that field also. We
are combining the First Name field to the existing information, so we also need the
Ampersand character to join them together. Go ahead and type in this information:
& clip()
and then click inside the '()' symbols where the First Name field will be inserted, then
click the DICTIONARY button to display the database fields. Here is our revised
screen:
Now for the last part - adding the Middle Initial database field. This database field is
only one position in length, so we don't need to CLIP() that field - we just need to
append it to the rest of the information. We do need a blank space after the last name
field though. So, go ahead and type in the ampersand (&) symbol at the end of the
Contents string, then add a blank space between two quotes, then click on the
DICTIONARY button; select the Middle Initial database field to make the Properties
Box contents resemble this:
Now we need to change the PICTURE for this FRAME; originally it was as long as the
Last Name database field allowed, which was 20 places. We want to extend this to
be as long as all the fields and blank spaces require for the 3 fields. To see how long
the database fields are you can use the DICTIONARY window:
You can use the right arrow to scroll the list to the right in case the PICTURE column
doesn't display on your screen. The number after the @S is the length of the field;
based on the above information we need to extend the frame to 20 + 2 + 20 + 1 + 1 =
44 spaces. It is doubtful that both the last name and first name would fully occupy 20
spaces apiece, so it is up to you if you want to make the picture shorter (which is
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
63
advisable).
Click on the tab titled 'Picture'; right now the picture is @S20; go ahead and type in
@S34 If you find that some names are being truncated you can increase the length of
the picture to accommodate the longer length.
Resize the last name FRAME to accommodate the increased picture length; you may
need to move some FRAMES to the right to accommodate the extra length of the
update name Frame. Don't forget to change the column header, since the Frame
below it within the Detail Band now displays a person's full name instead of just their
last name. Once you have the FRAMES properly aligned save the report and then run
it to see how it looks in the print preview screen. Here is what the sample report looks
like now:
Much better looking! To recap: on this page you learned:
How to remove blank spaces from the end of database field information using the
CLIP() function
How to format database fields and text information into one frame
Where to find the different functions in the dictionary to manipulate database
information
How and why you need to change the Picture for a frame when combining data
How and why you need to resize a frame when combining separate pieces of
information
3.10
Basics: Step 9 (Combining Info Inside A Frame)
Our sample report is shaping up nicely; how about we clean up the city, state and
zipcode information so it prints nicer on the printed page? We've opened up the
report so the Report Formatter is onscreen:
Notice that the two address lines are being truncated; the city field is also being cut
short. To combine the City/State/Zip code information we'll need to eliminate the blank
2005-2014 Scott Daughtry/Oleg Fomin
64
Fomin Report Builder
spaces after two of the fields (city and state), insert a comma between the City and
State fields, and a blank space before the zip code is printed. This will change the
output from:
TUCSON
AZ
85730
to:
TUCSON, AZ 85730
Remember that whenever you combine database fields within a Detail Band that the
Header Page column frame(s) need to be updated also!
Armed with the tricks presented on Page 8 of this tutorial these changes are easy to
achieve. Here is one way to produce the desired results:
Resize the DETAIL band to give yourself some room to maneuver in
Select the City/State/Zip Code FRAMES together and drag them downward to give
yourself room to maneuver within the Band
Create a new FRAME where the City/State/Zip Code FRAMES used to be
Click the Dictionary button to display all the functions for the Report Builder
Select CLIP() from the functions relating to Strings; this will insert '=CLIP(string)'
inside the Frame Properties Contents entry field; delete the word 'string' from inside
the '()' characters or make the word 'string' highlighted, then click on the Dictionary
button again
Select the City database field from the Dictionary; the Contents entry field now
shows =CLIP(NAM:City)
Add a comma character after the CLIPped City field; change the Contents entry
field to show:
=CLIP(NAM:City) & ', ' &
Click the Dictionary button again and select the CLIP() function again then remove
the word 'string' from inside the '()' characters.
Click on the Dictionary button and select the State database field.
Now the Contents entry field shows
=CLIP( NAM:city ) & ', ' & CLIP(NAM:state) &
We need to add a blank space after the State database field is printed; after the
last Ampersand (&) character add a single space surrounded by quote characters: '
'
Click on the Dictionary button and select the ZipCode database field. This
completes the act of combining the City/State/Zipcode information into one frame.
The FRAME contents look like this:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
65
Now we need to change the Picture to accommodate the combined length of the
three database fields plus the comma and space characters between the fields. If you
don't know the length of the fields you can click on the Dictionary button to retrieve
their lengths. For this example we have 30+2+2+1_10 = 45; chances are high that the
length will be MUCH shorter than this, so it is up to you if you want to shorten this up
to save space on the printed page. Click the Picture tab on the FRAME properties
box. Right now the picture entry field is completely blank:
Click on the button with the "face" icon to display the Picture Wizard. A pop up
window of picture types is shown onscreen:
The FRAME that we created for the 3 combined database fields contains String
values, so choose the String radio button and click NEXT. You are prompted for the
maximum length of this string:
The default starting value for a String is 20 positions; change this to 45 and then click
OK. Now the Picture entry field in the Frame Properties box looks like this:
You will also notice that the FRAME contents in the DETAIL band have changed to
2005-2014 Scott Daughtry/Oleg Fomin
66
Fomin Report Builder
dollar ($) signs. Resize the new FRAME to the correct length, then align it to be lined
up horizontally with the other FRAMES in the DETAIL band (i.e. Align Top).
Within the Page Header band delete the Frames previously used as column headers
for the Zip Code and State columns (right click the desired FRAME, then select
DELETE from the pop up menu to remove that header FRAME). Now we have one
header FRAME left for "City"; we can modify that Header to reflect a more fitting
description (City / State / Zip Code). We'll need to resize that header FRAME after
changing the text, then left align it with the associated FRAME in the DETAIL band so
everything lines up.
Delete the original City/State/Zip Code FRAMES that we moved downward inside the
DETAIL band since they are no longer needed. We'll also move the new FRAMES for
the combined City/State/Zip Code database fields as far to the right as possible - we
need to free up space for the Address lines that are being chopped off.
While we're at it, we can add back in the Country field that we originally didn't have
room for. We'll make the DETAIL band print 2 lines for each database entry. Here is
what the final DETAIL band looks like:
Save the changes and then print a sample report to the Print Preview screen to see
how everything looks:
Quite a visual difference! To recap, on this page you learned:
How to avoid truncating information when a FRAME is too small
How to combine separate database fields into one FRAME
How and why you need to change the PICTURE for a FRAME when combining text
& data
How to use the Picture Wizard dialogue box to change a FRAME Picture to print
longer text strings
That a detail band can contain multiple lines for the same database record to make
it more visually appealing
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
3.11
67
Basics: Step 10 (Multiple Sorting Levels)
Now that our sample report is looking pretty good let's explore some tricks that you
can use for your reports. A common reporting requirement is having multiple layers of
sorted information. In this module we are going to change the report from printing in
Last Name sequence to printing a report sorted first on the State, then the City, and
then the Last Name database fields.
Back on PAGE 7 of the tutorial we sorted the report on the Last Name field of the
report by creating a Sorting Band. We will still use a Sorting Band to perform the
sorting - we'll just be using more of them to perform the layered sorting that we need
for the report!
It is important to figure out the correct sequence of events BEFORE you start adding
Report Sorting bands to your report. Take a good look at your database information
and plan on paper how you want the report to be sorted. This will save you time in the
long run and prevent frustration later on. For the example above we want the report
sorted on three different database fields. The most important sort is on the STATE
database field; within the STATE information we want it to be sorted by the CITY.
Within the CITY we want the names sorted alphabetically by the LAST NAME.
The first order of business for this tutorial example is first deleting the existing Sorting
Band previously created in the sample report. To delete a Sorting Band you place the
mouse cursor directly over the words Sorting Band, then click the right mouse button.
From the pop up menu select 'Delete Band' - the sorting Band is now gone and the
report is unsorted for the moment.
NOTE
NOTE
NOTE
If you are modifying your report that already has a Sorting Band created, and have
also created associated Header and Footer bands for this Sorting Band you DO NOT
want to delete the band! If you want to change the existing sort for a Sorting Band
you only need to right click once on that Sorting Band, select PROPERTIES from the
popup menu, then modify the field to sort by!
NOTE
NOTE
NOTE
We will be adding Sorting Bands in the same sequence as their order of importance the primary sort on the STATE database field is first, then CITY, then LASTNAME.
From the Report Formatter menu select BAND, then NEW, and then SORTING
BAND. The mouse cursor changes to the hand cursor; place it inside the DETAIL
band and left click the mouse. Inside the Sort Expression box you click the Dictionary
button, then select the STATE database field from the Dictionary, then click SAVE.
Repeat the above steps two more times for the CITY and then the LAST NAME
2005-2014 Scott Daughtry/Oleg Fomin
68
Fomin Report Builder
database fields, adding a Sorting Band for each field. The final result will look like this:
You can continue adding more Sorting Bands if you need to; for example, if you
wanted the names to be sorted by Last Name, then the First Name you could add a
fourth Sorting Band with the database field NAM:firstname selected. Once you are
done adding Sorting Bands save the report and then print a sample report to the print
preview screen to see if the output is what you expected:
Looking at the information above we see four names of people living in FL; within
those 4 names it is sorted alphabetically by the City, and within the 2 people living in
Oakland, Fl the last names are sorted alphabetically. Perfect!
It may take some trial and error to get the information sorted exactly as you want it to
print. Remember that you can cause no damage to the database file(s) using the
Report Builder, so experiment as much as you want.
An important point to remember about multiple sorts - they will slow down the report
generation, as more work has to be done by the database engine and your computer
to sort the data as you want it to appear within the report. If you have fairly small
database file(s) you won't experience much (if any) of a delay; on large database file
(s) you will need some patience for the report to be created. To recap, on this page
you learned:
How to add additional Sorting Bands within a report to "nest" information through
multiple sort levels
How to delete a Sorting Band
The performance impact of multiple Sorting Bands in a report
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
3.12
69
Basics: Step 11 (Filters)
Depending on how the developer designed this software application, a Query Wizard
might be employed as a simple means to build/reuse a FILTER that will limit what
database record(s) are sent to the report (e.g. print only customers living in Florida;
print only part numbers that were sold between January and June). If a Query Wizard
module is displayed before the report is generated then use it (as it is simpler, and the
filters that you build using that module can also be used in the application's browse
screens).
If a Query Wizard module is not included in this software application you can still
create/use a FILTER within a Report Builder report!
A database FILTER is a means of extracting only a portion of information that you
want (and either display that filtered information onscreen or within the printed report).
For example, if you only want to know the names of people living in France in your
address book why would you print a list with EVERYONE's names? The list could be
huge, and take forever to read through and extract only the information you want.
A database FILTER can be very simple (ex: Color = 'blue'), or complex (ex: Race =
'Caucasion' AND Income > 25000 AND (Status = 'Single' OR Status = 'Divorced') - it
depends on what the filter situation requires. A FILTER is saved inside of the Report
Builder report, so you don't need to create it each time that you want to print the
report.
There are some basic concepts that you need to understand before creating a filter;
some knowledge of the Report Builder functions will prove handy for creating your
report filters.
A simple definition of a FILTER could be described as comparing database
information against something else. Some simple filter conditions:
STATE = 'Ca'
PRICE > $300
AGE < 30
As shown above there are 3 parts to a filter:
The database field starts the filter
An operator symbol that describes what is being done with the database field
A text string or number that the database field is being compared against
You can retrieve the database field name and different operators of the filter condition
from the Dictionary. The third part of the filter is up to you to decide - remember that if
you are comparing database information against textual information you need to make
it a string (enclosed in single quote symbols); if comparing database information
2005-2014 Scott Daughtry/Oleg Fomin
70
Fomin Report Builder
against a number then quote symbols are not used.
Report FILTERS are created by selecting FILE from the pull down menu; select
REPORT PROPERTIES from the menu to display the Report Properties screen:
On the bottom of the Report Properties window is an entry field titled Record Filter; to
the right of the entry field is the now-familiar Dictionary button (flashlight icon). The
record filter is typed/constructed in this entry field, and once the SAVE button is
clicked the FILTER is embedded with the report (NOTE: Don't forget to SAVE the
report after building/changing a filter!).
Until you learn the different functions and operators that are built into the Report
Builder you should use the Dictionary with creating a report filter (which is fine - I still
use it too!). Let's start with creating a simple filter to show how to use the Dictionary
to help build the filter condition:
With your report open, and the Report Properties window visible (as shown in the
above screen capture) click on the Dictionary button to display the list of database
fields. Select the STATE field in the dictionary to insert it into the Filter data entry
field above. This completes step one of the filter building process.
We now need to decide how we are going to compare the State field in the
database. For this example we want to print out database entries for only those
people living in Florida. To compare information we use an OPERATOR symbol
which tells the computer how to manipulate information. After inserting a blank
space after the field name we click on the Dictionary button again and then choose
the entry titled "Equal To" from the list of Standard Operators. This action inserts an
equal sign (=) after the field name, which completes step 2 of the filter.
Now we have to manually type in how we are going to compare the State database
field. We wanted to print only those entries for Florida; the state database field is 2
positions in length. We will be comparing "FL" against the database field. Add a
blank space after the '=' operator and type in (using single quote characters,
because this is a text value): 'FL'
Here is what the completed filter appears in the Report Properties screen:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
71
In theory this filter is 100% correct; structurally it IS correct, but there exists a
problem that could result in the report's contents not being 100% accurate. The
problem is how the State database field is stored in the database - when someone
inputs the State information it is capitalized as "Fl", with the "l" being lowercase. The
filter shown above (section 3 of the filter condition) is all uppercase 'FL'. Because
computers do EXACTLY what YOU tell them to do, the result will be that NO
database entries will be found, even though there are 4 entries in this database that
have people living in Florida!
Before throwing your hands in the air, take a minute to compose yourself while we dig
a little deeper into how filters work. The filter statement shown above is structurally
correct: we have a database field, an operator, and the text string for what it is being
compared against. The problem is that we are telling the computer to make sure that
the State field EXACTLY matches the text string "FL". Computers are stupid - they
don't understand that it should have checked for "Fl" instead. WE have to tell it to do
that!
There are several ways to fix this problem; the easiest way of ensuring that a filter
condition dealing with text strings will always work is to use either the lower() or upper
() function to convert the contents of a database field to a 100% consistent output
(either 'fl' or 'FL').
Armed with this knowledge we change the filter to look like this:
Now we can click the SAVE button, then run the report to see how the information
looks:
2005-2014 Scott Daughtry/Oleg Fomin
72
Fomin Report Builder
Perfect - all four people living in Florida now appear in the report!
As mentioned before there is another way of changing the report filter to make sure
that the data printed is correct. We would change the filter to perform two
comparisons of the State database field against "FL" AND "Fl". You would piece
together two different filters by using a CONDITIONAL OPERATOR out of the Report
Builders dictionary. Here is what the revised filter would look like:
A little more work, but it achieves the same result as using the lower() and upper()
function calls.
You may be asking yourself why even bother checking for database entries where the
State database field is "FL", since the database program is supposedly capitalizing
the information as the person types it in. The reason is simple - Murphy's law! Never
take for granted that information typed in by someone else is how you would type it in.
To recap, on this page you learned:
What a filter is, and why one would be used
How a filter is structured (what 3 components make up a filter)
How to use the Report Builder features to easily create a simple filter
How to create a filter that will work 100% of the time without worrying how the data
is stored inside of a database field (lowercase, uppercase, proper case)
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
3.13
73
Basics: Step 12 (Filters Continued)
The previous tutorial page got your feet wet on creating a filter; here we are going to
dig a bit deeper in creating some more filters. As mentioned before, you can use the
Dictionary (or this help file) to see what the different Report Builder functions and
operators are that can be used in a report filter. Some functions will be used more
often than others; here is a short list of the most popular ones:
Clip() - remove blank space from the end of text
Instring() - check for text inside a larger piece of text
Lower() - convert text to all lowercase
Sub() - retrieve a portion of a text string for comparison
Upper() - convert text to all uppercase
For example, let's say a report of only those customers having a last name that starts
with the letter "F" needs to be printed. You would use the sub() function to test the
value of the first letter of the last name; to be safe you would also use the upper()
function to make sure that letter was uppercase. Here is what that filter would look
like:
UPPER(SUB( NAM:state ,1,1 ) ) = 'F'
Notice that we used two functions at the same time, one inside the other, with the
database field in the middle.
Here's another good example; within the NOTES memo field of the database you
want to find/print those database records that contain the word 'SONY'. Remember
that you can't assume that people typed in SONY in capital letters; they may have
spelled it Sony or sony (or any other possible variation), so we have to convert the
memo field first to UPPER case, then check for the word SONY. Here is what the
filter would look like:
INSTRING( 'SONY', UPPER( NAM:Notes ) )
Again, we are using a function inside a function (the function UPPER() inside of the
function INSTRING()). To recap, on this page you learned:
A filter condition can contain multiple function calls - it all depends on what the
resulting report needs to extract from the database to make the report accurate.
To recap, in this tutorial lesson you learned:
How to create increasingly complex filters by using multiple function calls
The existence of the instring() and sub() functions
2005-2014 Scott Daughtry/Oleg Fomin
74
3.14
Fomin Report Builder
Basics: Step 13 (Adding Graphics)
A common reporting need is to include a company/agency logo in the Report Header
band for a letterhead document or corporate branding. An image is also a nice way of
sprucing up otherwise dull reports into a more eye-catching design. The Report
Builder makes it very easy to add graphic image file(s) to your report.
Image files are normally placed in the Report Header band, but you can placed in
other Report Bands as needed (e.g. Page Header, which will print the image on every
printed page of the report).
After opening the report into the Report Formatter screen create a new frame in the
desired location within the Report Header band. Right click on the new frame to
display it's Frame Properties window. Underneath the Contents entry field is a
checkbox titled 'Contents - image file name'. Go ahead and check this check box, then
click the Dictionary button (the icon that looks like a flashlight):
Because the 'Contents - image file name' is checked the Dictionary button now
operates like a standard windows file selection box instead of displaying the Report
Formatter Dictionary. From the pop up file selection box you can choose the desired
graphic image file from one of these file formats:
o *.Bmp
o *.Gif
o *.Jpg
o *.Pcx
o *.Wmf
Some image file formats lend themselves better to resizing (larger or smaller) than
others; if possible stick with .Wmf (Windows Meta Files), as they seem to resize with
the best image quality. After selecting the image file it's file name will be displayed
inside the new frame [NOTE: the image will NOT be displayed inside of the frame/
report band]:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
75
Save the report and then run it to see the result:
Remember that you can use the alignment buttons to define how the image will be
displayed inside of the frame (top / middle / bottom aligned). You can also choose to
place a visible frame around the image file (on one or more sides) and optionally
change the fill coloring used in the frame. To recap, on this page you learned:
That you can use image file(s) in your report
How to select an image file to print inside of a frame
That you can draw a frame around the image file (because it is stored inside of a
frame)
3.15
Basics: Step 14 (Records Printed Counter)
Knowing how many database records have been selected for printing can be a useful
addition to some report styles. The Report Builder makes it very easy to add this
information to a report; go ahead and open the tutorial report that you've been using
thus far and then:
Create a Report Footer band (from the main menu select BAND, then NEW, then
REPORT FOOTER). An empty Report Footer band is now displayed within the
Report Formatter screen.
Create an empty frame in the new Report Footer band in the desired location; with
the new frame selected click the Dictionary button on the Frame Properties box..
From the Dictionary pop up tree menu select the node titled 'OTHERS'; under this
entry expand the node titled "Built In Variables" and then select "Record Counter".
This will insert this information into the Frame Contents: =Record_Counter
That's it! You can also manually type in the (=Record_Counter) information without
having to go through the Dictionary.
You may choose to make this information print a little fancier by adding text to the left
of the Record Counter by replacing the '=Record_Counter' value with:
='Records Selected: ' & left(Record_Counter)
2005-2014 Scott Daughtry/Oleg Fomin
76
Fomin Report Builder
To recap, in this tutorial section you learned
How to print a counter of matching database record(s) for a group of related
information
3.16
Basics: Step 15 (Page Breaks)
Often times a report needs to eject a page whenever a database field value changes;
for example, a school teacher wants to print a list of students for each of their six
classes - when the CLASS NUMBER field changes from first period, then second
period, then third period (and so on) a forced page break would make sure that each
student roster is printed on a separate piece of paper (so the students can sign into
class before the bell rings on a unique printed roster). The Report Builder has several
ways of forcing a page break, and the page break feature centers on the Sorting
Band and how you configure that sorting band's options to determine how the page
break is carried out.
Using the above classroom report example, you want to create a report that performs
a page break whenever the Class Number changes value within the Class database;
the first Sorting Band will use the Class Number database field. Printed class sign-in
rosters always have student names sorted alphabetically by the student's last name,
so the second Sorting Band will use the Last Name database field to perform the
second level sort.
Here is what the printed page will look like, with comments added to the right of the
printed page that shows how each section of the report relates to a different Report
Writer band type:
A combination of static text and two databases (CLASS and STUDENT) that are
linked together (one class can have multiple students) are printed on the report. As
shown above, the report uses seven different bands to create the printed student
sign-in roster:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
77
Page Header - static text that is printed at the top of each report page
Sorting Band 1 - uses the COURSE SEQUENCE NUMBER field - when that value
changes (14-01-01 to 14-01-02) the page break is desired
Group Header 1 - contains the COURSE SEQUENCE NUMBER field that will force
the page break when that database field's value changes and static text
Sorting Band 2 - uses the LAST NAME field to sort the student's names
alphabetically in ascending (A-Z) sequence
Detail - nothing is placed inside of this report band, but it does play an important
role to cycle through the databases (explained below)
Group Footer 2 - prints the student's FIRST NAME and LAST NAME database
fields, along with other database fields
Group Footer 1 - prints database field values from the COURSE database that
should only print one time on the printed page
Page Footer - prints the page of pages value in the bottom right corner of each
page
Here is how the above report is displayed inside of the Report Builder:
The report bands properties are configured as such:
Page Header - default values
Sorting Band 1 - contains the COU:SeqNbr database field (aka: Class Number)
Group Header 1 - default values EXCEPT for one important setting:
2005-2014 Scott Daughtry/Oleg Fomin
78
Fomin Report Builder
This checkbox is required to force the page break after the COU:SeqNbr value
changes
Sorting Band 2 - Stu:lname database field
Detail - default values EXCEPT for one important setting:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
79
A Detail band is required for the Sorting Band(s) to be added to the report; for this
report, no data is being printed within the detail, so a value of zero is entered in the
'Print section, if expression evaluates TRUE' entry field knowing that it will never
happen - the result is that the COURSE database is forced to be cycled through,
from the first database record to the last, which 'pulls' in all of the information that
needs to be printed on the report.
Group Footer 2 - Default settings:
Group Footer 1 - Default settings except for one setting change:
2005-2014 Scott Daughtry/Oleg Fomin
80
Fomin Report Builder
For this particular report design, the Instructor information looked better at the
bottom of the printed page, so the checkbox for 'At the bottom of page' is clicked to
force it to be printed at the page bottom. This isn't a mandatory setting to use, but a
cool option to know of for other reports that you design for your particular reporting
needs!
Page Footer - default settings:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
81
To recap, on this page you learned:
How to force a page break when database field information changes for the current
database sort
How to make sure information is always printed at the bottom of the report page
How to 'skip' printing any information in a Detail band by creating a fake logical
condition that will never happen to force every database record to be evaluated
3.17
Basics: Step 16 (Using Total Fields)
A common requirement of some reports (especially financial reports) is printing total
fields (such as total sales) or the number of matching database entries for a group of
information. This information is normally placed within a Group Footer report band, so
it prints at the end of that related group of database information.
For this example let's assume that we want to print the total number of database
record(s) for each state. This information will print at the last page of that group of
information as a summary; here's how create this effect:
Create a Sorting Band on the STATE database field (if one doesn't already exist)
Create a Group Footer report band (if one doesn't already exist) on the STATE
database field
Add a new frame inside the new Group Footer report band
Click on the Dictionary button for the new Frame
Underneath the 'User Variables' section of the dictionary will be an entry labeled
'Gather Totals'. Each of the Group Header / Group Footer report bands that you
have defined will have an entry here titled 'Group Totals'. Highlight the entry for the
STATE database field:
2005-2014 Scott Daughtry/Oleg Fomin
82
Fomin Report Builder
Click the '+' button at the top of the Dictionary dialogue window
A new dialogue box appears to create a new variable based on the selected
database field:
As displayed above, there are many different ways of manipulating the information to
be stored in the new variable. Here is a breakdown of each item:
Assign Name: Enter the desired name of the variable here. This name MUST be
unique; do NOT use the same name as the database field! An easy way of keeping
the name unique is by using a prefix, such as LOC (which signifies 'Local'); for
example, for the database field NAM:STATE a good variable name would be LOC:
STATE
Field/expression to total: Use the Dictionary button to help select the database
field(s) that you want to manipulate here.
Picture: Define how the variable will be printed on your report by using the Picture
Wizard.
Total Type: Define how the selected database field(s) will be manipulated. From
the drop list you can select
o Sum
o Average
o Count
o Minimum
o Maximum
o Evaluate
Evaluate On: Define when the variable will be modified; from the drop list you can
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
83
select
o At Each Record Retrieve
o At The End Of The Group
o At The End Of The Report'
o At The End Of Every Page
Here is the dialogue box already filled out to build the new variable:
Here is how the dictionary appears after adding the new variable:
And here is the modified Group Footer report band to make use of the new variable
information:
And an example of what the report output will look like:
2005-2014 Scott Daughtry/Oleg Fomin
84
Fomin Report Builder
To recap: on this tutorial page you learned:
How to create a variable to be used within a Group Header / Group Footer band
How to manipulate the characteristics of this new variable (e.g. it's appearance,
how information is gathered from the database, etc)
How to combine the Group Header / Group Footer variable with text for printing
meaningful information in a report band
How to display a counter within a report band for the number of database records
that are printed while using a filter condition
3.18
Basics: Step 17 (Using Group Total Fields)
Printing dollar totals for a group of database information is very common in financial
reports (i.e. What are the total dollar sales for all customers in a state?). The
concepts described in the previous tutorial page are practically the same to satisfy
this requirement, with some slight changes to achieve the desired result:
Create the Sorting Band on the desired database field to perform the calculation
against (in this case, the STATE database field is used because we need to add the
total sales based upon a state)
Create a Group Footer band on this same database field
Create a new frame inside the Group Footer band
Click the Dictionary button for this newly added Frame
Click the '+' button at the top of the Dictionary dialogue box
Create a new variable to contain the dollar total value based on the database field
containing the dollar sales (for this example it is the database field NAM:Sales):
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
85
NOTE
NOTE
NOTE
Remember that the variable LOC:StateTotal will contain the SUM of the NAM:Sales
database field! This means that the variable will most likely be larger (potentially
MUCH larger) than the largest database entry; when assigning the Picture for the
variable MAKE SURE you increase it's length to accommodate this situation otherwise your data contained in the variable may be incorrect due to truncation!
NOTE
NOTE
NOTE
After saving the new variable the Dictionary screen will be updated to reflect that
addition:
And here is the Report Formatter screen after adding the variable to the report band
(and formatting some text for that variable to make it print nicely):
2005-2014 Scott Daughtry/Oleg Fomin
86
Fomin Report Builder
And some sample output:
Naturally the database field for sales for each customer could be added to the Detail
report band; one could also change the Picture for the "Total Sales" to include a
leading dollar sign symbol. In fact, let's also add some lines to this report band to
really spruce it up:
As shown above, the Sales information for each database record was added. Also
added were a top border for the first frame (Total Records For The State) and a
bottom border for the second frame (Total Sales For The State) located inside the
Group Footer report band.
To recap: on this tutorial page you learned:
How to create a Group Total variable within a Group Header / Group Footer report
band
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
87
How to use this variable style to store numeric information (such as sales
information)
How to combine this variable with text to print attractive and meaningful report
information
3.19
Basics: Step 18 (Using Grand Total Fields)
The topics covered in pages 16 and 17 in the Tutorial help topics can also be used to
print a Grand Total value on the last page of a report:
Add a new Report Footer band to the report (click on BAND, then NEW, then
Report Footer)
Create a new frame inside this new report band; click on the Dictionary button
Inside the Dictionary dialogue window left click the Grand Totals item; this is located
under the Gather Totals section of the User Variables section.
Click the '+' button to add a new variable
Assign a UNIQUE name for this new variable; select the database field containing
the dollar amount that you want added together. Change the picture length to a
longer length than what the selected database field is already set to, and add the '$'
character to the string. The "Total Type" will be "Sum", and it will be evaluated 'At
each record retrieve':
After clicking the save button the dictionary screen is updated:
2005-2014 Scott Daughtry/Oleg Fomin
88
Fomin Report Builder
Some sample output using the new Grand Total field on a report page:
If you wanted to put forth the effort, you could define variables for each of the
possible states that the database can have (50 states), then modify the Report Footer
detail band to print a state by state breakout of sales. To perform this neat trick you
would:
Create a variable in the Dictionary for all 50 state abbreviation codes in the Grand
Totals section of the dictionary. The variable would make use of 3 internal functions
of the Report Builder: Clip(), Upper() and Choose(). The first two functions are used
to convert the State database field into a consistent format for testing with the
Choose() function. The Choose() function is used to compare the current database
record against the known state abbreviation code; if it matches the database field
containing the total sales for this customer living in the state is added to the variable
(to keep a running total); otherwise it is skipped.
In the Report Footer report band a new frame is added. The Dictionary button is
clicked with the empty frame being highlighted. Under the Grand Totals section of
the User Variables a new variable is created by clicking the '+' button.
For this sample report a new variable is being created for state abbreviation code
"FL" (all customers living in Florida). Here is what the variable information looks like:
2005-2014 Scott Daughtry/Oleg Fomin
Basics You Need To Know (aka: The Tutorial)!
89
The Save button is clicked, which inserts the new variable into the selected frame:
Another trick being used is using the Center attribute for the frame contents for both
the text string "Florida" and the Loc:Florida variable. By using the border attributes a
table effect is achieved, which makes the summary page look very attractive.
The pattern of adding a new frame for the state abbreviation code, and another
frame for a new variable for that state abbreviation code is repeated. You can elect
to stack them any way you desire; the choice is yours! Here is how the report band
looks at the end:
As shown above, 4 different states are being tracked, with the total dollar sales
printed below. Here is the sample output:
2005-2014 Scott Daughtry/Oleg Fomin
90
Fomin Report Builder
To recap: on this tutorial page you learned:
How to use a Grand Total variable field on a report page
How to use multiple Grand Total variable fields on a report page
How to use frame borders to create attractive report output
2005-2014 Scott Daughtry/Oleg Fomin
91
4
Fomin Report Builder
"How To" Section
The hyperlinks below provide answers to common reporting situations:
Frame Tricks
Change default frame settings (border, fill color, etc)
Combine text and database field information onto a report page
Conditionally print information onto a report page
Date fields are printing five numbers - help!
Prevent truncation of a MEMO field during printing
Draw A Box Around A Frame
Header/Footer Tricks
Add page number counter to the report page
Add current date/time to the report page
Different header on page one than remaining report pages
Same footer text is printed until last report page is reached
Miscellaneous Topics
Save a Report
Report Variations
Labels
Mail merge formletters
Sorting Tricks
Multiple sort levels
Sorting in descending sequence
User-Defined Variables
Creating/saving user defined variables
4.1
Frame Tricks
1. Default Frame Settings
2. Combine text + database field content
3. Conditionally print text
4. Date field manipulation
5. Prevent memo field truncation on the printed page
6. How To: Change a Frame's Border/Fill Properties
2005-2014 Scott Daughtry/Oleg Fomin
"How To" Section
4.1.1
92
How To: Modify Default Frame Settings
Problem: Removing the border from every frame you add is becoming tedious.
Solution: You can modify the default settings for newly added frames very easily:
Open up a report (any saved file, or create a new file)
Select the menu item titled OPTIONS
Select the menu item tited DEFAULT FRAME
The FRAME PROPERTIES window will now appear onscreen:
By default the checkboxes for LEFT/RIGHT/TOP/BOTTOM will be check marked
(screen capture above shows only two of them are checked... this is from a different
example in this help file). Uncheck all of the desired Border check boxes (left, right,
top, bottom) to suit your needs and click the SAVE button. The next time you add a
frame to a report it will inherit the default frame border properties that you have
defined above!
4.1.2
How To: Combine Text And Database Fields
Problem: Your report page needs to combine freeform text and database field
information on the same line.
Solution: After adding a new frame to the report page double left click the frame to
display the Frame Properties window. Inside the Contents entry field you can add the
text that you want to display, a blank space after that text, an Ampersand (&)
character, another blank space, and then the desired database field.
Example 1
Combine the text "Vendor Name:" and the contents of the database field named INV:
Vendor. The Frame Properties Window entry field would resemble this:
'Vendor Name: ' & INV:Vendor
2005-2014 Scott Daughtry/Oleg Fomin
93
Fomin Report Builder
Example 2
Combine the text 'Vendor Name:' and the contents of two database fields (INV:
Lastname, INV:FirstName) that contain the first and last name of the vendor. You
want the output to be formatted as the last name and then the first name, separated
by a comma symbol. You also want to make sure that the database fields don't print
extra blank spaces to avoid the output from looking odd (ex: Washington , George).
The Frame Properties Window entry field would resemble this:
'Vendor Name: ' & clip(INV:LastName) & ', ' & CLIP(INV:FirstName)
4.1.3
How To: Conditionally Print Text
Problem: Some of the information inside the database, when printed, is empty due to
the way it was inputted by the user. When the report is printed this results in blank
spaces on the report where the information would/should have been printed. For
example, the fictional database program has a database field defined for the
customer's phone number - the customer either didn't have a telephone, didn't provide
the information to your sales clerk, or your sales clerk forgot to type it into the
application.
Solution: By using the CHOOSE() logical operator you can test for a condition and
tell the Report Builder how to handle the result.
Example 1
For the above problem (empty telephone number) you need to check the length of the
database field; if it is less than seven characters in length then you know the
telephone number is bad or empty. To check the length of a database field you need
the CLIP() and LEN() functions; CLIP() is used to remove any blank spaces from the
end of the database field value, and LEN() will return the exact number of characters
that contain an alphanumeric value (A-Z, 0-9). The Frame Properties Window entry
field would resemble this:
=CHOOSE( LEN(CLIP(INV:PhoneNumber)) < 7, 'Unknown', INV:PhoneNumber)
Example 2
If the database field named INV:VendorNumber contains a zero you want the text
"unknown" printed on the report page instead of the number zero; if the INV:
VendorNumber contained a value higher than zero you want to print the Vendor's
Name. The Frame Properties Window entry field would resemble this:
='TOTAL for vendor ' & CHOOSE(INV:VendorNumber=0,'unknown',VEN:
VendorName)
2005-2014 Scott Daughtry/Oleg Fomin
"How To" Section
4.1.4
94
How To: Date Fields
If your date fields are printing something like this on your report:
92716
there is no need for panic. Your database application is storing date field information
as a five digit number to avoid the dreaded Y2K problem that occurred in 2000 (i.e.
date fields were stored as a two digit year - when it became 2000 the database didn't
know if it was 1900 or 2000).
This is an easy problem to fix by using the FORMAT() function and the appropriate
Picture!
Let's assume that you have a database field named "CUS:BDATE", and it stores the
customer's birthday. When you print this database field onto a report page it prints
using the 5 digit number. The FORMAT() function is passed the database field that
needs manipulated (CUS:BDATE) and the type of Picture that you desire to change
it's output:
Desired Output Format
mm/dd/yy
mm/dd/yyyy
mm dd, yyyy
mmmmmmmmm dd, yyyy
dd/mm/yy
dd/mm/yyyy
dd mmm yy
dd mmm yyyy
yy/mm/dd
yyyy/mm/dd
yymmdd
yyyymmdd
mm/yy
mm/yyyy
yy/mm
yyyy/mm
Picture To Use
@D1
@D2
@D3
@D4
@D5
@D6
@D7
@D8
@D9
@D10
@D11
@D12
@D13
@D14
@D15
@D16
Example
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
format(CUS:BDATE,
@D1)
@D2)
@D3)
@D4)
@D5)
@D6)
@D7)
@D8)
@D9)
@D10)
@D11)
@D12)
@D13)
@D14)
@D15)
@D16)
The first nine examples above (@D1-@D9) will NOT print a leading zero if the day of
the month is 1-9, or when the month number is 1-9; for example, if the date is 1 Jan
2000 and the @D1 picture is used the output would be 1/1/00. To change the output
to 01/01/00 you would change the format string to this:
format(CUS:BDATE, @D01)
2005-2014 Scott Daughtry/Oleg Fomin
95
Fomin Report Builder
You would do likewise for the @D2-@D9 pictures (making them @D02, @D03, etc).
4.1.5
How To: Prevent MEMO Field Truncation
Problem: When a MEMO field is printed it is only partially printed...
Solution: Double left click the MEMO field frame in the report. In the Frame
Properties Window change the default picture (which may show up as @S255) to
nothing - the entry field should be BLANK. This will now print the entire contents of the
MEMO field onto the report.
4.1.6
How To: Change a Frame's Border/Fill Properties
Whenever a frame is added into a Band (regardless of the Band type), a box is
automatically added around the frame (as shown above).
In the toolbar area (highlighted, top row) are four buttons that toggle that Frame
"side" either on or off.
By manipulating these frame border "toggles", combined with the option to 'fill' a frame
with a color, you can create some interesting effects. For example, you can place
frames side by side within a band (e.g. Page Header Band), untoggle the top/left/right
frame sides for each of those frames to create an underlined effect to the text:
Using this method when a straight horizontal line is desired that runs the full width of a
Band is far easier than using the UNDERLINE EFFECT for that text Frame!
You can use the FILL feature of a Frame to create an interesting design effect;
usually the frame would have all four Frame borders toggled back to True status
again (i.e. the default Frame side value):
2005-2014 Scott Daughtry/Oleg Fomin
"How To" Section
96
Select the first Frame and then click the FILL button in the toolbar
; a popup window will appear onscreen to select the desired
color to fill that Frame with:
Select the desired color and click the OK button to fill the Frame with that desired
color; repeat for each of the Frames until completed (NOTE: You cannot select
multiple Frames and change their fill color at the same time - you must change each
frame individually). Here is an example of a Page Header band with each frame filled
with dark gray, and then the text contents of the Frame changed from black colored to
white colored text:
2005-2014 Scott Daughtry/Oleg Fomin
97
4.2
Fomin Report Builder
Header/Footer Tricks
1. Add the current date / time to a report page
2. Add a page number counter
3. Different page footers
4. Different page headers
4.2.1
How To: Add Date & Time To Report Page
The majority of reports that you create will require the date (and possibly time) the
report was generated to be printed on a report page. Here is how to do it:
Add the report band that will contain the date/time information. Typically, the top left
of the Page Header will display the date/time the report was generated.
Add a new frame onto the report band referenced in the previous step.
Double left click the newly added frame to display the properties for that frame and
type this information into it:
=FORMAT(TODAY(),@D17) &' '& FORMAT(CLOCK(),@T01)
Optionally remove the borders from the newly added frame (top/left/bottom/right)
Your report page will now print the text dd/mm/yyyy hh:mm onto the top left of the
report page. You can use different pictures to format the current date or time to suit
the report's needs.
4.2.2
How To: Add Page Number Counter
Most reports will display a page number counter printed within the Page Footer; here
is how to do it:
Add the Page Footer band.
Add a new frame onto the Page Footer band.
Double left click the newly added frame to display the properties for that frame and
type this information into it:
='Page '& Page_Counter &' of '& Total_Of_Pages
2005-2014 Scott Daughtry/Oleg Fomin
"How To" Section
98
Optionally remove the borders from the newly added frame (top/left/bottom/right)
Your report page will now print the text Page n of nn onto the bottom right of the
report page (n representing the current page number, as grabbed by the PAGE
COUNTER variable; the nn represents the total number of pages in the report, as
grabbed by the TOTAL_OF_PAGES variable)
4.2.3
How To: Different Page Footers
Sometimes a report will need a different report page footer on page one than on the
rest of the report pages. This is very easy to do:
Add a REPORT FOOTER band to the report.
Inside the newly added Report Footer report band add a frame; inside the frame
you'll add the text to be printed only on the final report page ONLY inside the Frame
Properties window.
Add a PAGE FOOTER report band to the report.
Double left click on the newly added Page Footer report band to display it's Band
Properties dialogue box; you'll insert the following text inside the 'Print section, if
expression evaluates TRUE' entry field:
NOT LastPage
The Band Properties dialogue box will look like this:
Click SAVE, and then save the report. When the report is generated anything you've
placed inside the Page Footer report band will be printed on all pages UNTIL the last
report page is reached - at that point, whatever you've placed inside the Report
Footer report band will be printed on the final report page instead of the Page Footer
band contents!
4.2.4
How To: Different Page Headers
Sometimes a report will require a different report page header on page one than on
the rest of the report page headers. This is very easy to do:
2005-2014 Scott Daughtry/Oleg Fomin
99
Fomin Report Builder
Add a REPORT HEADER report band to the report
Inside the newly added Report Header report band add a frame; inside the frame
add the text that will be printed only on page one inside the Frame Properties
window
Add a PAGE HEADER report band to the report
Double left click on the newly added Page Header report band to display it's Band
Properties dialogue box; insert the following text inside the 'Print section, if
expression evaluates TRUE' entry field:
Page_Counter > 1
When the report is generating it will print the Page Header report band ONLY after
page one has printed. You can place anything you wish inside the Page Header report
band that is needed (text, database fields, etc) to meet the report's output needs.
4.3
Report Variations
1. Create / print labels
2. Create a mail merge formletter
4.3.1
How To: Labels
Labels are a common report type that Report Builder can create, provided you have
some patience for some trial and error fiddling around with the Detail report band
width settings:
Create a new report
Add a Detail band to the newly created report
Resize the Detail band right margin by first selecting the Detail band (left click once
on the Detail band - eight red resize boxes will be displayed along the outer edges
of the band) and then moving the right side of the Detail band inward to the desired
label width:
Obviously it would be extremely handy to have a blank sheet of labels that you can
measure for the desired label height/width. Remember that the Detail band needs to
be large enough to cover the blank space that SURROUNDS each label and not just
the printable area of the label itself!
The screen cap above shows the resized Detail band. After you've resized the
Detail band you can add the desired text/database field information by adding a
Frame, and then add the text or database field information. Clean up the information
(e.g. remove the frame borders, align the frames into neat columns, etc) and then
2005-2014 Scott Daughtry/Oleg Fomin
"How To" Section
100
save the report.
Generate the report and print it to a blank piece of paper; place a blank sheet of
labels on top of the printed output and hold both sheets together against an
overhead light to see if the Detail band needs to be reduced/enlarged in size to
properly print onto the label stock. It will take a few tries to get it right, so be
patient!
A sample output from the screen cap shown above (with text and database field
information added to the Detail report band) looked like this in the Print Preview
screen:
If more space is needed between the labels I would move the right side of the Detail
band slightly to the right. If more space is needed horizontally between the labels I
would move the bottom side of the Detail band slightly downward, and so on.
* NOTE * * NOTE * * NOTE *
This type of report would not have any other type of Report Bands added to the
report; you will be working with only ONE Detail band!
* NOTE * * NOTE * * NOTE *
4.3.2
How To: Mail Merge Report
Mail Merge form letters use a combination of database field information and hardcoded text (that you define) to print a formatted report - you probably receive a Mail
Merge form letter in your mailbox from solicitors every week! This type of report is
easy to create within Report Builder:
Create a new report file
Add a Detail report band to the report page
Double left click the newly added Detail report band to display the Band Detail
Properties dialogue box
Make sure a check mark is displayed inside the Mail Merge check box and then
click the EDIT TEXT button:
2005-2014 Scott Daughtry/Oleg Fomin
101
Fomin Report Builder
After you've clicked the EDIT TEXT button a pop up window is displayed to enter your
form letter's text:
The window is resizable (drag the bottom right corner of the window to make it
larger); the screen capture above shows a combination of text and database fields.
The top of the window has a small toolbar with six icons; from left to right their
functionality is:
o Save changes and return to the Report Formatter window
o Cut selected text to the Windows clipboard
o Copy selected text to the Windows clipboard
o Paste Windows clipboard information to the EDIT TEXT dialogue box
o Display the Font selection dialogue box
o Display the Dictionary
To insert the contents of a database field into the form letter click the Dictionary
button to select the desired (fields) within the sentence where it should be printed.
The example above shows that every time a database field was added to the text that
double quotation marks and arrows are needed; the sequence is:
Double Quote + Less Than Arrow + Database Field/Variable + Greater Than Arrow +
2005-2014 Scott Daughtry/Oleg Fomin
"How To" Section
102
Double Quote
When the Dictionary adds a database field/variable to the EDIT TEXT window it will
AUTOMATICALLY add the arrow symbols for you; however, it WILL NOT add the
double quote symbols (leading and trailing), so YOU MUST DO IT! If you fail to add
the double quotes your report will probably fail when it is executed. The fix is easy
(find where you failed to add the double quote symbols) - just irritating.
* NOTE * * NOTE * * NOTE * * NOTE *
You can use the Dictionary to access all of the internal Report Builder functions to
modify the database information to suit your needs; examples of what you can do
would include:
Combining multiple database fields into one formatted text string (e.g. First Name,
Last Name) by using the CLIP() function and the Ampersand (&) symbol
Use the CHOOSE() function to evaluate a database field and generate the
appropriate text field; for example, you have a database field that stores the
customer's gender as M or F; you can use the CHOOSE function to instead print
Mister or Misses onto the form letter
Evaluate the last time the customer was contacted against the current computer
date to generate a text string like "it has been 14 months since we last contacted
you regarding your policy."
* NOTE * * NOTE * * NOTE * * NOTE *
The Font Dialogue Box won't allow you to use multiple font types/sizes/styles on the
form letter - you can only use one font type/style/size for the form letter!
After you have entered the Mail Merge letter information click the OK button to save
the text and return to the Report Formatter window. Save the report and run it to see
what needs revised/tweaked.
4.4
Sorting Tricks
1. Sort output in descending sort sequence
2. Multiple sort levels within a report
4.4.1
How To: Descending Sort Sequence
By default a Sorting Band assumes you want to print database information in
ascending sequence (0-9, A-Z); there may be times where you need descending
sequence (Z-A, 9-0), especially when dates are involved (e.g. print the most recent
transactions first, and then go backwards in time). This is very easy to do:
Add a Sorting Band to the report (it is assumed you've already added the Detail
2005-2014 Scott Daughtry/Oleg Fomin
103
Fomin Report Builder
band to this report - you can't add a Sorting Band with a Detail band already being
defined in the report)
Double left click on the Sorting Band to display the Sort Expression dialogue box
Click the Dictionary button to select the database field that you want to use to sort
the information; after it is inserted into the Sort Expression entry field you need to
add a dash character (-) in front of the database field:
As shown in the above screen capture, the database field INV:Date was selected
from the dictionary; a dash character (-) was added to the first position of the entry
field
Click the SAVE button to return back to the Report Formatter window; in this
example, there were three Sorting Bands for the report (and I modified the third
Sorting Band); the Report Formatter window now reflects the changed information,
as confirmed by the -INV:Date information:
4.4.2
How To: Multiple Sort Levels
See this help topic (link) for instructions how to sort a report using multiple layers
4.5
User-Defined Variables
1. Creating / implementing user variables on a report page
4.5.1
How To: Creating User Variables
Creating reusable variables that contain a database field and/or text information can
be a time saver if you create a lot of reports:
Open the desired report (or create a new report)
Open the Dictionary (by creating a new empty frame or an existing frame placed on
the report)
Click on USER VARIABLES, and then left click on CALCULATED FIELDS:
2005-2014 Scott Daughtry/Oleg Fomin
"How To" Section
104
Click the + icon on the Dictionary toolbar to display the Properties window:
The screen capture above shows an example of a user variable titled "CityState",
with the "Field/Expression To Total" information already filled in. Two different
functions (clip and upper) have been used to remove trailing empty spaces and
ensure the State database field is printed as upper case on the report page.
The "Picture" entry field has been left blank on purpose - this ensures that the
information isn't truncated when printed on the report page
The "Evaluate On" drop list is left with the default setting of "At Each Record
Retrieve" - this setting is EXTREMELY important, because if you change it your
output will be very erratic (i.e. the information you thought would print for every
database record only prints every 5, or 10, database records, or only once per
printed page). If your report output is "goofy" for this user variable, chances are this
setting is incorrect!
You can combine text with database field information; make sure that you enclose
the text with double quotation marks (otherwise a run time error will occur when the
report is executed). For example, if you want the text "Location is" printed before
the City database field your "Field/expression to total" entry field would resemble
this:
'Location is: ' & clip(ZIP:CITY) & ', ' & upper(clip(ZIP:STATE))
Click the SAVE button to save the variable - it will now show up in the Dictionary and
can be used in ANY report for that report category!
4.6
Misc Topics
2005-2014 Scott Daughtry/Oleg Fomin
105
4.6.1
Fomin Report Builder
Help File Modification History
May 2014
Added topic 'How To: Change a Frame's Border/Fill Properties'
Moved Band Properties information from the Page Break help topic to the Band
Properties Window help topic and fixed some of it's outdated text
Fixed the topic 'Basics: Step 15 (Page Breaks)' that contained incomplete
instructions on how to force a page break in a report
Recompiled into the Windows 7/Windows 8 help file format (*.CHM)
Fixed grammatical mistakes in all help topics!
4 Aug 2013
Minor content changes
8 Aug 2005
Content expanded
30 Aug 1996
First version created
4.6.2
How To: Save A Report
Step 1: Define the Report Title (that will be displayed within the Report Manager
window)
Click FILE from the Report Builder Main Menu
Select REPORT PROPERTIES from the list of choices
Enter text inside the Report Title entry field of the Report Properties pop up
window; try to use a short name that accurately describes the report's purpose
Step 2: Save the report
If saving a BRAND NEW report that you've just created:
o Click FILE from the Main Menu
o Select SAVE AS from the list of choices
o A popup window will appear to enter the file name.
o Do NOT use an existing file name! This will permanently overwrite that existing
report!
o Do NOT change the file extension from the default of .RPT!
o After typing in the report name click the SAVE button and wait for the popup
window to disappear on it's own (1-5 seconds)
o If saving an existing report
Using the Main Menu
o Click FILE From the Main Menu
o Select SAVE from the list of choices
2005-2014 Scott Daughtry/Oleg Fomin