Home
FrontPage Hosting
mySQL Hosting
Dedicated Servers
Managed Services
Domain Parking
|
Search our FrontPage Support Area
FrontPage Support Area Site Map
The following documents are geared towards using VirtuFlex
with Microsoft FrontPage.
Three Examples of Getting VirtuFlex's
Interface to Get the Job Done
December 4, 1997
W. Curtiss Priest, Ph.D.
The beginner often runs into what appears to be a serious limitation with VirtuFlex,
but often the situation simply requires another approach or just thinking ahead.
When an HTML page is constructed by VirtuFlex, most of the "macro" commands are
executed prior to data being returned by a "DBASE:SELECT" command. This means
that one may not use "if tests" on these values (such as the use of
"EVAL:IF").
Yet three approaches to the apparent limitation usually makes it possible to "get the
job done."
We use some examples to illustrate three basic ways to proceed. First, we take advantage
of VirtuFlex's post-database reading, processing involving functions "applied
to" the returned value. While an "if test" can't be used to determine the
contents of a returned field, one can use a series of "CONVERT" statements to
process the contents, and achieve a satisfactory result.
Secondly, we take advantage of HTML's ability to pass parameters between pages to make the
content of the database available later. Often it is only necessary to extract a required
piece if information on the page before the one you need it for, to process further.
Thirdly, we employ the ability for the database language to return information from fields
processed by aggregate, number, and character functions.
CLASS I of SOLUTIONS: Use of PREPEND, POSTPEND and CONVERT
The first example of this involves a simple matter of going from Microsoft Access' format
of "Yes/No" data to the format for HTML checkboxes.
When Access returns Yes or No for a field it is passed by ODBC as 1 for "Yes"
and 0 for "No." But HTML uses an optional "CHECKED" attribute in the
<FORM.... .
While one might be tempted to use an EVAL:IF to test for a 1, and insert the needed
attribute, it is just as easy to use CONVERT:
<input type="checkbox" name="Inactive"
{inactive|convert=1=checked}>Inactive</p>
The Access field name is "Inactive" and the HTML name is also
"Inactive."
When the box is checked, the HTML form will return "on" (This is the default
return value if no value attribute is specified.)
The convention for whether the box is "pre-checked" is presence off the optional
attribute "CHECKED." So, the convert function in VirtuFlex takes the presence of
a "1" and converts it to the word "checked." If the value were 0, we
are left with a lonely 0 in the input statement which the browser ignores.
However, if you wish to be neater, you can use convert a second time as:
... |convert=1=checked|convert=0= }
This way a zero becomes a space and is fully transparent to the browser.
Note: In FrontPage most interlaced fields may be inserted without HTML markup comments
around them. In WYSIWYG, the fields, with their curly braces appear as if they were form
values. However, when you introduce the equal sign, FrontPage will want to change the
first example to:
{inactive|="1=checked}"
with equal signs around what it thinks is an unquoted string value belonging to inactive|.
So, when using conversions insert this part of the form as an "HTMLMarkup"
Later we want to do an SQL Update based on the value of the check box. The code for this
looks like:
Inactive=
[[EVAL:IF:[[GETDATA:Inactive]]=on:
-1
:
0
]]
Here we can use an EVAL:IF, since we are not reading from an "interlace" field
value. If the returned HTML value for Inactive is "on" we assign the field value
"Inactive" to "-1" (an Access "Yes"); otherwise we assign a
0 (an Access "No").
Notice the use of a "structured" EVAL:IF. See our paper "Structured
"EVAL:IF"s in VirtuFlex" for more information on structuring VirtuFlex
code.
Second Example of Class I Solutions:
Considerable discussion was held on the VirtuFlex developers' list
(virtuflex-dev@virtuflex.com) about how to solve the problem of "not labeling data in
the browser" when that data was absent.
The problem:
In a database there may or may not be people's first names. You want not to have the label
"First Name" appear if the first name is absent.
The solution:
By combining PREPEND, POSTPEND and CONVERT the desired output is acheived. The macro looks
like this:
[[DBASE:SELECT:[Name Table]:item like %:
{name|PREPEND=First Name |POSTPEND=$|CONVERT=First
Name$=|CONVERT=$=}]]
In this example, the "SELECT" function extracts fields from the [Name Table]
database. Recall that it is the ODBC convention to enclose table names within brackets
that contain spaces.
Since the "SELECT" function requires a conditional, we ask for all records using
the % sign.
The field either contains characters (a first name) or is a null string (no
characters). We "prepend" our label "First Name" to the first name
that was returned. This places that label in front of the string. We then put a $ sign on
the end of the string with "postpend."
Now we either have:
First Name$
or something like:
First Name Joe$
If we examine the two conversions for the first case, the first conversion will convert
"First Name$" to a null string and nothing will appear in the browser.
If we examine the second case, the first conversion does nothing to the string, and the
second conversion removes the $ from the end. (Jason Turim of VirtuFlex devised this
clever solution.)
In summary, languages like VirtuFlex are great in their simplicity but that sometimes
comes with the need to know "tricks" to deal with certain situations.
CLASS II of SOLUTIONS: Use of Posting Interlace variables
A common practice in examining database information is to provide some data from a table,
and then provide the user with the option to display more detailed data.
Sometimes the more detailed data requires reading data from more than one table at a time.
But, if the key field of the second table is contained in the first table, and these keys
are not the same some planning is required.
In this last example, we examine a "Member Table" of organizations. These
organizations also belong to a geographical site. This information is contained in the
"Site Table."
We design one HTML page to allow the user to search for a particular member. When that
member is located, the user can double-click on any line from the search (an href tag
"click to view" appears on each line.)
The same page is refreshed and as it is, detailed information from the Member Table is
used to fill in an area of the screen that was previously blocked out by a transparent gif
image. (We simply test for the presence of a posted variable using a VirtuFlex IF test to
change the display behavior of the same page.)
A button that was blank before, now has the words "SHOW" and if the user presses
this button, a new page appears with considerably more detail. Some of this information
comes from the Member Table but some comes from a corresponding Site Table. Yet, on a
single page, VirtuFlex cannot read from one table and substitute the field value in a
"SELECT" for another table. A "SET:VAR" won't work because those
functions are evaluated BEFORE the SELECT returns any field data.
How can data from two or more tables be displayed on the same page when they are
dependent?
The answer is to use HTML's hidden fields that are passed from the PRIOR page. When the
first page was loaded with detailed information about the organization, it also had access
to the key field value for the corresponding Site Table that is to be displayed on the
detailed page.
Here are some code snippets to show how this is done:
Step one: Getting the second key field while processing Page One
<a href=/cgi-bin/virtuflex.exe?template=/td/organiza.htm&organ=
[[GETDATA:organ]]&organid=[[GETDATA:organid]]&MemID={MemID}&SiteID=
{Site}>View</a></td>]]
As mentioned above, we give the user the ability to reload the page with more detailed
information. this is done by embedding this href. The href reloads the same page, and a
VirtuFlex "if test" determines that "MemID" is no longer zero length
(it exists) and so displays the more detailed information.
At this time, we also take the "SiteID" out of the database. We have no use for
it with Page One. We simply want to pass it along. So &SiteID={Site} now ensures that
the reloaded page contains this "POST"ed information.
Step Two: Passing the second key field to Page Two
We will use VirtuFlex's ability to read a variable from Page One using GETDATA. And we use
HTML's ability to pass "hidden" variables when a form is processed. Contained on
Page One, this looks like:
<input type="hidden" name="template"
value="/td/oneorg.htm">
<input type="hidden" name="MemID"
value="[[GETDATA:MemID]]">
<input type="hidden" name="SiteID"
value="[[GETDATA:SiteID]]">
Here we tell VirtuFlex to load Page Two (called oneorg.htm). We pass the TWO key fields,
the Member ID (MemID) and the Site ID (SiteID) as in the hidden INPUT element of the form.
Step Three: Using the second key field to display the data on Page Two
In the first part of Page Two, information is displayed by a "DBASE:SELECT" on
the "Member Table" In the lower right of the page (as part of a table embedded
within a table), detailed information about the Site is displayed. We access this
information using:
[[DBASE:SELECT:[Site Table]:SiteID=[[GETDATA:SiteID]]:
We are able to use a GETDATA on SiteID because it was obtained and passed via steps one
and two above.
Step Four: Page Two -- refreshing and retaining the field value
Page Two in this example displays values in form boxes that may be changed. After the
first load of the page, each reload processes the values from the forms and reloads the
same page again. An "EVAL:IF" determines if we are reloading the page, and if
so, does an SQL update. This permits the user to make changes to the database fields, and
the fields are redisplayed. (And the database fields that don't change are updated with
exactly the same values, but this is fine, and we don't have to bother with testing for
changed lines of field data.)
The site data (which is not editable on this page) is simply rewritten to the form again.
But, we need to pass the Site ID from one refresh of the page to the next. This is done by
hidden values again as:
<input type="hidden" name="template"
value="/td/oneorg.htm">
<input type="hidden" name="MemID"
value="[[GETDATA:MemID]]">
<input type="hidden" name="SiteID"
value="[[GETDATA:SiteID]]">
Notice that these three lines are identical to the ones we used above in step two. The
only difference is that these lines are contained on a page that recalls itself, rather
than in calling a second page (Page Two).
CLASS III of SOLUTIONS: Use of Database functions (using Access)
One useful piece of information is to know the length of the string being returned for a
field. Another useful thing to do is to force all characters to upper case.
While VirtuFlex has both of these functions (LENGTH & CAPS), they cannot be applied
directly to the field value.
In a DBASE:SELECT
this DOESN'T WORK -- [[GETDATA:{Lastname}:LENGTH]]
but
this WORKS -- {len(LastName)}
See "Introduction to Access Functions" for a listing of all Access functions
that are available via ODBC and VirtuFlex.
There are also ODBC functions which are universal across different SQL databases, but
these are not currently implemented in VirtuFlex
There is also a technique by which you can define a query in Microsoft Access which
includes not only the use of Access functions but full computations as well. The details
of this technique are described in "Using ODBC to return
a Microsoft Access Query"
|