""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
NUMBERING THE TIERS -- SUBNUMBERS IN FORM REGIONS
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
PRODUCT : R:BASE VERSION : 3.1
CATEGORY : PROGRAMMING SUBCATEGORY : TOOLS
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
From Gail Coverdell, 155 Good Country Road, Kalispell, MT 59901. Gail
is a science teacher and small business application developer. You can
reach her at 406-752-4435.
Often it's convenient to have R:BASE automatically number the tiers
(lines) in a region.
When to Use Subnumbers
""""""""""""""""""""""
Typically, the form looks like TRANFORM in the CONCOMP database with
one or more autonumber columns such as CUSTID or TRANSID at the top
part of the form to identify it and a subnumber column such as LINENUM
or DETAIL# in the form's region to number the tiers (lines).
Below are examples of items that you might want to number in a region:
o Line items in a customer's order
o Tasks under a unique objective
o To-do list items for a specific date
o Chapters under a book name
o Symptoms for a patient on a specific visit to the doctor.
Numbering Automatically
"""""""""""""""""""""""
R:BASE automatically numbers autonumber columns, assigning the next
number when you move to a new row. But you don't want a subnumber
column to be an autonumber column because you want subnumbers to start
over for each new region (group of rows).
To number subnumbers automatically, use the following technique. But
first check the "Guidelines and Restrictions" section below to make
sure your form is a good candidate for automatic subnumbers.
Creating a Subnumber Form
"""""""""""""""""""""""""
Complete the following steps to make an ordinary form region into one
that automatically numbers its lines (tiers). In order for this to
work, the table associated with the region must not contain a computed
column.
The following explanation assumes that the subnumber column is an
INTEGER named LINENUM. If your subnumber column has some other name,
change all the occurrences of LINENUM to the correct name. This
technique also assumes that you have set ZERO ON.
+------------+
| STEP 1 |
+------------+
Start Forms and create or modify the form region where you want to
number the tiers. Locate a single-character TEXT variable named VNEW
in the leftmost spot of the region. Then locate the subnumber column
(LINENUM in this example) immediately to the right of VNEW. VNEW must
come before LINENUM in the field list.
Customize the field settings for VNEW to answer "Yes" to the first two
questions. Then give VNEW a default value of a pound sign (#). Next,
customize the field settings for LINENUM to answer "No" to the first
two questions.
Locate any other fields you want to have in the tier, and duplicate
the tier for the region.
+------------+
| STEP 2 |
+------------+
Choose "Define..." under Variables, and enter the following six
expressions in this exact order:
vnew TEXT = '#'
vcan INTEGER = (IFEQ(.vnew,'#',1,0))
vnewnum INTEGER = (INT(.vnew))
vtest INTEGER = (IFEQ(.vnew,'#',0,.vnewnum))
vseq INTEGER = (.vcan*(.vseq+1)+.vtest)
linenum = (IFEQ(.vnew,'#',(.vseq+1),(.vseq)))
+------------+
| STEP 3 |
+------------+
Each time you use the form, you must define VSEQ as an INTEGER and set
it to zero as shown in this example:
SET VAR vseq INTEGER = 0
ENTER formname.
Now the R:BASE form will automatically number the tiers in the region.
All you need to do is enter the starting number when the cursor is on
the pound sign (#).
Example of How to Use the Form
""""""""""""""""""""""""""""""
When you use the modified form, enter the starting subnumber for the
region when the cursor is sitting on the pound sign in the VNEW field.
After you enter the first number, the form expressions take over to
number the rest of the lines automatically.
The cursor never enters the subnumber field. It moves up and down the
rows in the VNEW field that's located immediately to the left of the
subnumber field. VNEW has a pound sign (#) default. For example, when
you use the form to edit data, the left side of the tiers in the
region might look like this:
# 1 Suit...
# 2 Shirt...
# 3 Shoes...
# 4 Blouse...
The cursor skips over the number, going from the pound sign to the
item. To change a line number, enter the new number while the cursor
is sitting on the pound sign. As soon as you press [Enter], R:BASE
will move the number to the number column and put a pound sign back in
the pound-sign column.
When you use the form as a data entry form, the first line number will
be wrong. Change it to whatever beginning number (usually 1) you want.
Then as you move to subsequent rows, the form expressions will
automatically number the rest of the lines in the region by using the
increment (usually 1) specified in the expressions.
Guidelines & Restrictions
"""""""""""""""""""""""""
Here are some general guidelines and restrictions:
o You must change the first number in the series. Then the form
will take over from there. You can change a subnumber at any
time.
o You may need to change the subnumber again if, for example, you
enter five rows, and then press [F7] a number of times to go back
and make changes to previous rows. When you press [F8] to move
forward again to enter another detail number, the subnumber in
the next new row will be too high. Change it to the next number
in the series. Then the expressions will again take over to
number the subsequent new rows.
o This technique may not work correctly if the table that contains
the subnumber column also contains a computed column. For
example, this technique won't work with TRANFORM in the CONCOMP
database because the region's table has a computed column.
Expressions Explained
"""""""""""""""""""""
Here's what each expression does:
o VNEW sets the variable VNEW to a pound sign (#). VNEW is located
in the region immediately preceding the subnumber. When you enter
a new value into the VNEW field, VNEW momentarily changes to that
value, but as soon as you press [Enter], the form evaluates the
expressions and sets VNEW back to a pound sign (#).
o VCAN uses the IFEQ (if equal) logical function to check and see
if you just entered a number in VNEW. If you did, the expression
sets VCAN to zero to cancel subnumber autonumbering. The
cancellation occurs in VSEQ, which multiplies the result by VCAN.
o VNEWNUM uses the INT (convert to INTEGER) function, added in
R:BASE 3.1A, to convert any number entered in the VNEW field
from a TEXT data type to INTEGER. The result is a null value if
you use INT on a non-numeric TEXT value.
o VTEST uses the IFEQ logical function to again test the value of
VNEW. If VNEW contains a number, the form needs to restart the
sequence with that number, so it sets VTEST equal to the number
stored as an INTEGER in VNEWNUM. If VNEW contains a pound sign,
sequencing should proceed normally, so it sets VTEST to zero.
o VSEQ adds one to itself to increment the subnumber. But if you
just entered a new beginning number into VNEW, VCAN is zero, so
it cancels the addition, and VTEST has the new number in it so it
sets VSEQ to the new number.
o LINENUM is the INTEGER subnumber column. This expression again
uses IFEQ to test the value of VNEW. If VNEW is a pound sign, the
expression sets LINENUM to VSEQ plus one. But if you just entered
a new starting number, the expression sets LINENUM to that
number. The value of LINENUM appears in the field on the form and
is loaded into the table.
At first glance, you may think the last two expressions will increment
LINENUM twice, (once in VSEQ and again in LINENUM). But actually
LINENUM only adds one to the previous value of VSEQ. R:BASE doesn't
write the new global variable value computed in VSEQ until you save
the form.
The value of VSEQ has changed in the form but the dotted global
variable value has not changed yet. When you use a dotted global
variable to the right of an equal sign, R:BASE reads the old dotted
global variable value, not the form expression value. Both the VSEQ
and the LINENUM expressions read the same old global variable value
for .VSEQ, so you need to increase both VSEQ and LINENUM for each row
in the region.
The VSEQ expression ensures that once you save that row, the VSEQ
global variable will be increased by the increment in the VSEQ
expression making it ready for the next row.
Changing the Increment
""""""""""""""""""""""
To use an increment larger than one, change the VSEQ and LINENUM
expressions. For example, to increment by five instead of one, define
the two expressions this way:
vseq INTEGER = (.vcan * (.vseq + 5) + .vtest)
linenum = (IFEQ(.vnew,'#',(.vseq+5),(.vseq)))
Expression Processing Examples
""""""""""""""""""""""""""""""
Here's an example to show you how the expression values change. Say
you are moving from the fourth to the fifth line in the region. The
last row you saved changed both LINENUM and VSEQ to 4. Here's how the
expressions evaluate in the fifth row:
o vnew = #
o vcan = 1
o vnewnum is null because
o vtest = 0
o vseq = (1 * (4 + 1) + 0) = 5
o linenum = (4 + 1) = 5
Now, say you move on to the sixth row in the region. Here's how the
expressions evaluate:
o vnew = #
o vcan = 1
o vnewnum is null
o vtest = 0
o vseq = (1 * (5 + 1) + 0) = 6
o linenum = (5 + 1) = 6
Next, say you enter a new number in VNEW (the pound sign) to make the
next row 8 instead of 7. Here's what happens in the expressions:
o vnew = 8
o vcan = 0
o vnewnum = 8
o vtest = 8
o vseq = (0 * (6 + 1) + 8) = 8
o linenum = 8
Here's the next record:
o vnew = #
o vcan = 1
o vnewnum is null
o vtest = 0
o vseq = (1 * (8 + 1) + 0) = 9
o linenum = (8 + 1) = 9