August 2002

Get Extra Columns in

Your Lookup Table









Lookup commands are a valuable tool that can enhance and streamline your data entry. Most often, they’re used to standardize and automate entries made in database fields, thus minimizing errors while maximizing efficiency.

The Lookup commands find and retrieve information contained in the database’s Lookup Table, which you can access in Q&A for DOS by following the File / Design a file / Program a file / Edit Lookup Table path, and in

Q&A for Windows by opening a database, then selecting File / Edit Lookup

Table. The Table consists of a Key or Key value column and four lookup value columns.

The Key column is designed to contain a number, code or abbreviation that corresponds to lookup data contained in the four adjacent columns on the same row. (They’re numbered 1 through 4 at the top.) The four lookup columns enable one Key column value to perform as many as four different lookups. (See the Sidebar on page 3 for a simple example.)

When just four isn’t enough

But what if you need more than four columns of lookup data? A common example might be any database using an ID number to lookup name, address, and phone information. This type of data might easily require at least six fields in the database: First name, Last name, Street, City, State,


, and Phone. Of course, with only four Lookup columns, a lookup like this is not readily possible.

My workaround involves storing two or more lookup values in one column, separated by something unique, like “///”. Then, during the lookup, special programming is used that recognizes only the data to the left or right of the separators.




The Do-It-Yourself Guide to Q&A

August 2002

Volume 13 Number 8

1 Extra Lookup Table Columns

Jon McLaughlin

2 Editorial

2 Tip—Retrieve Every Nth Record

4 Sesame Seeds—New Programming

Features in Sesame

6 @Help—Edited by Bill Halpern

• Memory Error Printing Expanded Fields

• Multiple Selections from Pick Lists

• Q&A Win—Adding New Fields/Forms

• System Error in Q&A 3.0

• Duplicate ‘Records’ a Misnomer

• Same Printer in Windows and Q&A?

8 Review—A Convenient Utility—


9 Tip—Easier-to-Manage Pick-lists



Figure 1. This Lookup Table contains a header row (to identify the data) and one lookup data row with the Key value “502.” Notice how the data values are separated by “///”.


For example, I’ll use column 1 in the

Lookup Table to contain the First and

Last name, formatted this way:


Column 2 will contain the street address.

Column 3 will contain the City and

State, like this:

My Town///WA

Finally, column 4 will contain the

ZipCode and Phone, like this:


Continues on page 3


Sesame In Beta Testing



Sesame having recently entered the inital phase of beta testing, now’s a good time to reiterate our plans for The Quick Answer and the new monthly guide we intend to launch in support of the coming Q&A replacement product.

We will continue to publish The Quick Answer as long as it is self­ supporting—in other words, until our subscribers evaporate (hopefully by migrating to our new publication on Sesame). After more than 12 years of publication, it will sadden us to see it go. But the parting will be “sweet sorrow” since we’ll be launching the new publication for a product that will enable Q&A users (or anyone) to enjoy new levels of power, flexibility, and ease of use in meeting their data management needs.

If you are a current subscriber to The Quick Answer when we retire it, you’ll have two choices: “roll over” your remaining issues to the new Sesame publication on a straight one-for-one basis, or receive a full refund on any remaining unpublished Quick Answer issues to which you’re entitled. In the meantime, we will continue to bring you The Quick Answer each month with the same high level of quality content you’ve come to expect.

It’s too early to predict when the Sesame beta testing program will be completed and the product released. Keep in mind that this is version 1.0, and the Lantica team will see that the testing program takes as long as it takes to ensure a solid product.

We are getting close.



How to Retrieve Every

Nth Record

In any database with a number field, there are several ways to retrieve every nth record. These types of retrieves can be used to get a more “random” sampling of a database. The following programmed record retrieval specs must be typed in the NUMBER field (or its equivalent) in the

Retrieve Spec)



4)+0.2 =



For all odd numbers:

For every 4th record starting at 1 (1, 5, 9, 13, and so on):


For all even numbers:


For every 5th record:

In the last example, the value 0.2 is the decimal value of 1/4, 5/4, 9/4, and so forth. This value will be different based on how many

“skips” you want in the retrieval.


Tom Marcellus

Jon McLaughlin





Editor / Publisher

Tom Marcellus

The Quick Answer (ISSN 1052-3820) is published monthly in a downloadable “electronic” (Acrobat PDF) edition by Marble Publications, Inc., 1927A Harbor Blvd.,

Costa Mesa, CA 92627 USA. A Subscriber ID is required to download each issue.

Cost of subscriptions: 12 issues, $89 anywhere in the world. Single copy price: $9. All funds must be in U.S. currency. Back issues available upon request for the same price as a single copy. Back issues from 1990 through 2001 available in printed format. Back issues from 1995 onward available in Acrobat PDF files.

Copyright © 2002 by Marble Publications, Inc. All rights reserved. No part of this periodical may be used or reproduced in any fashion (except in the case of brief quotations embodied in articles and reviews) without the prior written consent of Marble Publications, Inc.

Address editorial correspondence, @HELP questions, or requests for special permission to: Marble Publications,

Inc., The Quick Answer, 1927A Harbor Blvd., Costa Mesa,

CA 92627 Phone 800-780-5474 or 949-722-9127.

Fax 949-722-9127, [email protected]

On the Web at

Q&A is a trademark owned by Symantec Corp. Other brand and product names are trademarks or registered trademarks of their respective holders.

This publication is intended as a general guide. It covers a highly technical and complex subject and should not be used for making decisions concerning specific products or applications. This publication is sold as is, without warranty of any kind, either express or implied, including but not limited to implied warranties for the publication, quality, performance, merchantability, or fitness for any particular purpose.

Marble Publications, Inc., shall not be liable to the purchaser or any other person or entity with respect to any liability, loss, or damage caused or alleged to be caused directly or indirectly by this publication. Articles published in The Quick Answer do not necessarily reflect the viewpoint of Marble Publications, Inc.

Reach Us

Phone 800-780-5474 / 949-722-9127

Fax 949-722-9127

Email [email protected]


Mail Marble Publications

The Quick Answer

1927A Harbor Blvd.

Costa Mesa, CA 92627 USA

The Quick Answer

August 2002

Figure 1 on page 1 shows how this data looks in a

Q&A for DOS Lookup Table.

In the next step of the workaround, we will add programming statements using the @Lookup Function.

The function looks like this:

@Lookup(key, column)

For example, the statement #2 = @LOOKUP(ID number, 3) tells Q&A to match the value entered in the ID


with a Key column value in the Lookup Table, and then return the value from column 3. @Lookup can be abbreviated to @LU.

Go to the Program Spec, and in the ID number field, enter these statements:

ID number: > #1:

First name = @LEFT(@LU(ID number,1),@INSTR(@LU(ID number,1),”///”)-1);

Last name = @MID(@LU(ID number,1),@INSTR(@LU(ID number,1),”///”) + 3, 200);

Street = @LU(ID number,2);

City = @LEFT(@LU(ID number,3),@INSTR(@LU(ID number,3),”///”) -1);

State = @MID(@LU(ID number,3),@INSTR(@LU(ID number,3),”///”) + 3, 200);

Zip = @LEFT(@LU(ID number,4),@INSTR(@LU(ID number,4),”///”) - 1);

Phone = @MID(@LU(ID number,4),@INSTR(@LU(ID number,4),”///”) + 3, 200)

You have now created extra “columns” from the existing four. It is also possible to have three or more lookup values in one column by using the @Mid function and a second unique separator such as “!!!”.

For information on how the @Mid, @Left, and @Instr functions work, see the Application Programming Tools

Manual that comes with Q&A. I have included a simple

Q&A 4.0 database (Lookup.dtf) in this month’s download file with the above programming and Lookup Table already built in.

Jon McLaughlin is a professional musician and piano teacher living in

Vancouver, Washington. He designs Q&A applications for himself and others. He can be reached at (360) 694-6869 or via email at [email protected]

A Simple Lookup Example

Suppose you want to have Q&A fill several fields when you type an abbreviation (or code) into a field. You might want to have the Company, Buyer and Phone fields auto-filled when you type an abbreviation into the Company field.

In this case, you might have “ABC” in the Lookup

Table’s Key column,“Alpha Beta Corp” in column 1

(immediately to the right of the Key column),“Jim Smith” in column 2, and 212-324-8877 in column 3—all on the same row. Column 4 is blank in this case. (See Figure 2.)

With this data in the Lookup Table, and fields in the database named Company, Buyer, and Phone, you could use a simple program like the following in the Company field to auto-fill these three fields in a database record:

> If Company <> “” Then {

Lookup(Company, 3, Phone);

Lookup(Company, 2, Buyer);

Lookup(Company, 1, Company)


This way, if you typed “abc” (or “ABC”) into the

Company field and pressed Tab or Enter, Q&A would automatically fill the Phone, Buyer and Company fields in that order. In this case, since you’re having Q&A auto-fill the field that contains the Key value (“ABC” in the Company field), you’d need to fill the Company field last. Otherwise,

“ABC” would initially be overwritten with “Alpha Beta Corp” and there would be no Key column match in the Lookup

Table for the other two lookups.

In this example, once the Company field is auto-filled, the programming would not then change it (or the related fields) when you moved in and out of it during the normal course of working in the record. That’s because there would be no Key value in the Lookup Table that matched

“Alpha Beta Corp.”


Lookup Table Tips

1. Make sure all Key column values are unique.

2. Each entry in the lookup columns is limited to 240 characters maximum.

3. If a column is too narrow for the information, press F6 to use the Expand Field Editor.

4. You must have values on the last line of the current page before you can enter values on the next page.

Figure 2. The Lookup Table with the Key column and three adjacent lookup columns filled.

The Quick Answer

August 2002 3




New Programming

Features in Sesame









month I’d like to introduce you to some of the new programming features in Sesame. “Oh”, I hear you ask, “I thought that Sesame programming was going to be the same as Q&A’s.” Absolutely correct. It will be almost completely backward compatible with Q&A.

The changes are mainly in the form of programming


Powerful enhancements

How important are these additions? Immensely. There are certain facets of Sesame that make it a much more powerful, far more flexible database manager than Q&A.

None of these is more important in this respect than

Sesame’s programming language called SBasic (Sesame

Basic). SBasic was designed from the ground up as a complete self-contained programming language. It incorporates all the familiar Q&A functions and commands and adds quite a few new ones. These features address all the shortcomings of Q&A’s highly useful but too limited programming language. Developers will find that they have all the tools they need to create more powerful database applications—and easier than in Q&A.

When you think about it, a large proportion of the articles in The Quick Answer over the years have been about the ingenious ways that developers such as Tom Marcellus and Bill Halpern have found to work around the limitations of Q&A. With Sesame, I’m sure the same process of extending what can be done with the product will occur. The difference is that Sesame is far richer and more flexible than Q&A to begin with, so the bar is raised quite considerably.

Let’s take a look at these new features individually.

I’m not going to attempt here to cover them in detail with their full syntax and detailed examples. This will be done in future articles.


For many, this easily accessible new feature will be the first they’ll use. It has long topped the list of features requested by Q&A power users. Within programming you can define a variable, which is like a temporary “field” of a particular type that exists strictly in memory and automatically goes away when you are finished using it.

Many Q&A developers have used variables countless times without realising it! How many times have you added fields—”programming use only” fields—to the last page of your database form? Each of these is likely to be used to store a value that’s calculated or derived by programming and referred to elsewhere in programming.

This is exactly how variables are used in Sesame. But instead of using a field, you simply assign a name to the variable and give it an initial value if you want. You can then refer to it by name in subsequent programming.

Here are a few examples:

Constructing a full name by stringing together a person’s first name and family name.

Calculating a value to be posted, such as a bonus amount.

A “flag” that determines whether a record is new, ready to be finalised, posted or whatever.

Any intermediate calculation results. I sometimes see a whole page of such fields in Q&A databases.

For these kinds of temporary storage needs you will no longer have to add a field to the database to store temporary or calculation-only data. You will only need fields to store data that you want to keep in that record.

This is quite powerful since almost anything you can do with a field you can also do with a variable. For example, where in Q&A you might read a text file into a field to be parsed, then throw it away, like this:

TempField = @Insert(“companies.txt”);

RealField = @Left(TempField,25);

TempField = “”

In Sesame you can do the same thing without the overhead of an additional, always otherwise empty, database field:

var InsertCompany as String

InsertCompany = @Insert("companies.txt")

RealField = @Left(InsertCompany,25)

In this same vein—and this is not strictly a programming change—Sesame will also offer command buttons you can customize to activate programming or a macro. In Q&A for DOS, some people have done this by creating a “button” or “activation” field just for the purpose of having something to click on. A good example is the field you might use to activate the “WinClip” utility.

The Quick Answer

August 2002

Global variables

Variables are extremely useful, but by their nature they are volatile. They can be considered “short-term” storage containers. But some variables need to have a longer life.

You might want to store something for reference from any part of your application on an ongoing basis. An example might be a tax rate that rarely changes.

Throughout Europe we have a tax called VAT (Value

Added Tax) applied to all transactions—business as well as consumer—and it rarely changes. This is an example of a variable that you want to have global “scope.” In other words, you want to put it in memory where it is available to any number of applications.

Another example is where you are sharing the same application among two or more company names you own. For a particular data entry session, you might want to be doing something for “Company A,” while in another session you might want to be doing work for “Company

B.” At some point when starting your session, you could

“declare” that you are working on “Company B” and have Sesame read “Company B’s” variables into memory in a way that would make them available for use throughout the application.

You might need to create multiple @Number sequences, instead of only one per database.

For all these you would use Global Static variables.

Global Statics retain their values even if the database is closed and reopened. They sound complicated, but in reality they are very simple and can be tremendously useful. (See the sidebar on page 11 for examples.)


Arrays are completely new in Sesame, though the concept is not new to Q&A. Imagine a Q&A Lookup Table you use with a database. You have a Key column and four available data columns you can use to retrieve information based on a field value that matches an entry in the Key column. One example of where a Lookup Table might be used would be to enter each of the 50 state abbreviations in the Key column, the corresponding full state names in Column 1, then use a Lookup programming command to lookup a given state’s full name based on entering just the abbreviation. A second column of the Lookup Table could be used to retrieve the sales tax rate for that state, a third for the shipping cost to that state, and so on.

Well, this is a true, even if static, array. In Q&A, you have to create the table in advance of using the database.

In Sesame, you can create it (as an array in memory) onthe-fly with programming, or by reading it into memory from a delimited text file or other source. The advantages in Sesame are that there is no limit to the number of columns, no limit to the number of rows, you can update and otherwise manipulate the array values with programming commands, and it is very fast.

Don’t for a minute think that I am saying that you have to use arrays instead of lookup tables. No. All of these new features are in addition to the established and supported Q&A techniques. You pick up on these new

Sesame features as and when you want to—just like you used more and more advanced Q&A techniques as you grew in confidence.


Whenever you want to do something a certain number of times or until some condition is met (or no longer met), you create a loop. In Q&A this, again, is done by adding a field, setting a value, and using a subroutine to repeat an action, change the value in the counter field, and check this field to determine when to stop the action. One example would be when referring to (looping though) line-items in a database record that contains invoice-like lines, each of which contain a product code, description, price, quantity, and extended amount. Another example is incrementing a date to the next business day—adding a day to the delivery date until the delivery date is not a

Saturday or Sunday.


Q&A supports subroutines via the Gosub/Return commands, but they are inflexible because you need to use a field and the programming in this field needs to be on-field-entry. Then, you need to ensure that users can’t enter this field by accident, generating the “Too many returns” error message. In Sesame, subroutines are much more straightforward: you simply write your subroutine program in-place, without the imposed complications of involving trigger fields and field navigation.

In all these examples, in Q&A, there will never be anything you want to actually save in these programming only fields, but you need them nonetheless. This is clearly a waste of storage space. For a database of 1,000 records you have 1,000 storage units that will never store anything. In Sesame you use variables in memory, actual command buttons, loops and subroutines—a far more efficient solution.

Unbound fields

When you want to see a calculated field such as an amount including tax, or the extended price of a sales item

(price multiplied by quantity), you don’t actually need to

store that value in a predefined database field in Sesame as you have to in Q&A. It is more efficient to only calculate it as required, such as when a particular record is viewed in a form, or printed in a report.

In Sesame you can create unbound fields on forms or reports to show any such derived data. By unbound, I mean that the data is not stored in or part of the definition of the data record itself. It’s a little like a report derived column where you have Q&A calculate a value and include it in the report, but that value is not saved in the database.

Continues on page 10

The Quick Answer

August 2002 5









Memory Error When Printing Expanded Fields

I just set up my new Dell Optiplex 1.7 Ghz computer with

Windows 2000 installed, and I can no longer print anything from an Expanded Field. I get the message “Not enough memory to complete your request.” I am using Q&A 4.0 for

DOS and the task is very simple: Go to any field, press F6 to open the field editor, press F2 for the Print Options screen and then press F10 to print. At this point the error message appears. I used to do this all the time. Is this a problem with my new computer, with Windows 2000, or both?


Write / Utilities / Set Global Options / Change Print Defaults

screen (see Figures 1 and 2), the F6 expanded field printing option “Out of Memory” error message will appear. Blanking out this line makes Q&A whole again and the issue goes away! What are you losing here?

Nothing! Without specifying a database as a default merge file, you will simply have to select the database you want the first time you press Alt-F7 when setting up a merge document. This is a very small price to pay to recover the ability to print expanded fields.

Well, Monique almost had stumped me with this one. We went round and round and she finally sent me the offending computer to check it out (because we could not duplicate the problem on any combination of PCs or operating systems we had). The good news is that the problem is not with the computer nor with Windows 2000.

(After determining the cause, we managed to duplicate the problem on Windows XP, 2000, and 9X). Nor is the problem limited to Q&A 4.0. (Q&A 5.0 will produce the same error.) Have I piqued your curiosity?

The bug is connected to a setting in Q&A Write’s

(word processor) global options area. It appears that if you enter a default Merge File name on the last line of the

Make Multiple Selections from Pop-Up Lists

I have been using Q&A 5.0 for DOS since it came out. I love the ability it has to present my data entry people with popup lists that essentially eliminate data entry errors. However,

I have recently come across the need to be able to select

multiple entries from the same list and add them to a

Keyword field separated by semicolons. But there is one thing I can’t seem to figure: Every time an item is selected from the list, it replaces the existing entry in the target field.

What I really want to do is be able to select multiple insurance companies who are accepted by some of my clients. Is this possible?



Figure 1. Changing the print defaults for new Write documents.. Figure 2. Leave the “Name of Merge File” line empty.


Send your Q&A questions to @Help, The Quick Answer, Marble

Publications, Inc., 1927A Harbor Blvd, Costa Mesa, CA 92627 or email to

[email protected]. Include your name, address, phone, and your

Q&A version number (and whether DOS or Windows) and a detailed description of the problem. We’ll publish those questions we feel are of general reader interest; individual responses aren’t possible.

The Quick Answer

August 2002

It sure is. The trick is to place the results of the selection from the Userselect list in a temporary field and then use programming to append it to what’s already in the field.

You will also want the list to keep displaying until you tell

Q&A that you are finished making selections. Here’s one way to do the trick:

Make two fields. Leave the first one unnamed and name the second one Insurance:

< > Insurance< >

In the unnamed field, place the following programming statement:

Q&A for Windows—Adding New Fields/Forms

We recently purchased Q&A for Windows to upgrade from

Q&A 4.0 for DOS. I have inherited the job of changing Q&A as needed. The person who originally set up the database used the Master Form as the one and only input form. We have about 8,000 records, each with about 300 fields. The boss wants me to add some new fields. I can’t add to the

Master Form, so, is there a way to save the master form (with all its formulas, etc.) as a new form, with a different name that is editable?


<#100: If #100=”” Then {

Usl(“ — Insurance —; — Done —

;Medicare;Medicaid;Blue Cross;Blue Shield;Aetna/

USHC;Other-Fill In”, #100)


If #100=”— Insurance —” Then {#100 = “”; Goto


If #100=”— Done —” Then {#100 = “”; Goto #120};

Goto #110

In the Insurance field, add this statement. (In this case, field #120 follows the Insurance field):

<#110: If #100 <> “” then {

#110 = #110 + #100 + “;” ;

#110 = @Replace(#110, “ ;”, “; “);

#100 = “”; Goto #100


Goto #120

This way, when you navigate to the unnamed field,

Q&A will display a pop-up list that looks like this:

Many people using Q&A for Windows make this mistake.

The Master Form is where your entire database design and structure is maintained. It is also the place that Q&A stores all of the fields in the design and should not be used as a structured input form.

The way you add new fields is not on the Master Form, but from the Select / Database Structure / Database / Add &

Delete Fields menu. Here, you can add or delete fields and the results will automatically be reflected in the Master

Form. Additional input forms can only be designed as

subforms of the Master Form. That is, they can have some or all of the fields available on the Master Form, but cannot have fields that do not appear somewhere on the

Master Form.

As far as the Master Form is concerned, select Select /

Design Input Forms from the menus, and then Save As the master form to a new name. From then on, any fields added to the database will appear at the bottom of the master form but will have to be Added to any other forms you have saved. You can also set up Q&A to open a particular form when you open the database by using the

File / Preferences menu after opening a database.



— Done —

— Insurance —


Blue Cross

Blue Shield



Other-Fill In

System Error in Q&A 3.0

I am having a problem locating the user manual for my Q&A

3.0. While sifting through my data, I get this message:

System error, please try again. See Appendix F. Ref #: 06D7

I was wondering if you can help me out here.

When you select a company, it will be added to the

Insurance field with a trailing semicolon, and the pop-up list will reappear for the next selection. This will continue until you select “Done” from the list. You will then be placed in the field following the Insurance field. Make sure to make the Insurance field a legitimate Keyword field (File / Design / Customize / Format values) so that you can use it to perform Keyword searches and reports.

A word of caution: Without some rather sophisticated additional programming, this method will allow the user to enter the same selection over and over. But by playing with the @Instr function (which you can use to find the occurrence of an insurance company that’s already in the field), you should be able to prevent this—as well as build another pop-up list to remove existing entries.


We do not normally support Q&A 3.0. After all, that version is more than 13 years old and is incompatible with some newer computers and drives. We focus on Q&A 4.0 and 5.0 which can still be made to run perfectly on all new computers. That being said, an 06D7 error indicates that you have a corrupted database index file. The problem is that you are probably running Q&A on a hard drive partition that’s larger than 2G. (Some versions of Q&A 3.0 were actually limited to 32M hard drives!) The best way to try and fix the problem yourself is to do the following:

Concludes on page 12

The Quick Answer

August 2002 7





A Convenient Utility









most computer programmers and consultants, I make extensive use of tricks and shortcuts to make my life and the lives of clients easier. I recently unearthed a convenient utility called Bat2Exec, which might help you save time and make your daily tasks go more smoothly.

Batch files to executables

Bat2Exec compiles batch files into executable programs.

The utility almost seems misnamed, as it does not create

.exe files. It creates .com files. The difference is that .exe files can be of nearly any size, while .com files have a limit of about 64K. If you’ve got batch files that won’t convert to a .com file of less than 64K, then you’re probably working with a huge, slow batch file right now, and

Bat2Exec won’t help you. gets run on the computer. Many users know how to change batch files, and might be tempted to remove a time-consuming backup routine, for example. They can’t do that if the program they run is compiled.

An even stronger advantage is the ability to change the memory settings that your program lives in when it is run. Here’s an example. Drag a shortcut of your qastart.bat batch file to the desktop (which I typically call qa-bat.bat). When you check the properties of that shortcut (see Figure 1), you have several options, but not the ability to change the memory space the program runs in. Now see the options available from the compiled version of your batch file (Figure 2). Memory settings, which help many programs like Q&A run perfectly, are at your disposal.

Got security?

Bat2Exec shines in two ways. First, it gives you security. It lets you as a programmer take control over exactly what

Using Bat2Exec

To use Bat2Exec, first unzip the Bat2Exe.ZIP file (included in this month’s download file). Place the files you just expanded in the same directory as the batch file(s) you wish to compile.*

When you run

Bat2Exec, don’t forget to use the

.bat extension on the batch file you wish to compile. Just open a command line window, run the simple one line command. It should lookvery similar to this:

Figure 1. Properties of a shortcut for a batch file in Windows

XP. Notice that there are no memory setting facilities.

Figure 2. Properties of a shortcut to a .com file in Windows XP, showing the Memory tab.

The Quick Answer

August 2002

bat2exec qastart.bat

This compiles the batch file qastart.bat into

and saves it in the same directory as Bat2Exec and the batch files (I tried this command with Bat2Exec in one directory on one drive and the batch file on another drive, and it did not work).

The document file that accompanies Bat2Exec states that you should not include TSR (terminate and stay resident) programs, like, which many of us use. This warning does not hold true in Windows 2000 and Windows XP when running either batch files or the compiled programs that Bat2Exec creates. That’s because when the program closes, the “virtual DOS session” that it worked in closes too. So all of your computer’s memory is again available. distributed with PC Magazine. It is available in this month’s Quick Answer download file and at

Jeff Jeff Noreman has been in the computer industry since 1981. He is a database programmer (with expertise in several applications), a network engineer, a trainer, and a security consultant with expertise on Windows and Macintosh platforms. He is the president and founder of Nexus

Unlimited, Inc., an IT consulting firm that also builds computers, serving clients from home users to Fortune 500 firms all over the world. Jeff also heads, a provider of web & e-mail hosting, as well as dialup and broadband internet access. He has spoken at many conferences, including the most recent Quick Answer seminar. Jeff has been a Symantec Premier-Level Q&A Consultant since 1990, and a Q&A user since it was released.

* While proofreading this issue, T.J. Shuflin made the following observation and suggestion:

Bat2Exe and @Shell

If you make extensive use of the @Shell command in

Q&A, I would not run these compiled files from @Shell. In

Windows XP, calling executable programs from @Shell can cause NTDVM (DOS Virtual Machine) errors. However, running these compiled executables to start Q&A is perfectly fine.

Bat2Exec can be used for any Windows or DOS-based program that can be run from a batch file (and that’s pretty much any program). Using Bat2Exec to start your programs is a great way to be certain that your program is running the way you intended, in the memory space it needs to run freely.

Bat2Exec was written in 1990 by Ray Bolling, and was

Jeff mentions placing the files that are expanded from the zip file into the same directory as the batch file(s) you wish to compile. Wouldn't it be better to (1) set up a folder with the Bat2Exec program in it, (2) copy the batch file that you want to convert to that folder, (3) perform the conversion on it, (4) copy the newly created

.com file to where it needs to be, (5) delete the .bat file and .com files from the BAT2EXEC folder, then (6) repeat this process for other batch file conversions?

Otherwise, you'd be copying all the expanded files from the zip file into (possibly) several folders, doing the conversion, and leaving all those extraneous files all over the computer in numerous folders.

Quick Easier-to-Manage Pick-Lists


There are a number of “tweaks” you can

Color = @Replace(Color, "

perform to make your Userselect pick-lists

", ",");

Color = @Userselect(Color);

easier to deploy and manage. Here’s how I recently designed a

@Color(Color, 7, 1)


“color” list for a client’s database.

First, I saved the list of colors in a Q&A Write document named Colors.doc. The list simply runs down the page in any order, as shown below—the Userselect command takes care of alphabetizing the selections:








In the database, I programmed the Color field this way:

> If Color = "" Then {

@Color(Color, 1, 1);

Color = @Insert("Docs\Colors.doc");

The advantages here are that the manager can easily update the color list simply by editing and resaving Colors.doc.

(No trips to the Program Spec are necessary. And no locking users out of the database while program edits are made.) What’s more, no additional “temporary” field is required.

The program colors the Color field’s text in a way that hides the unsightly inserted string from the Colors.doc file. ( This assumes the “Q&A Standard” default color scheme.) The carriage returns are replaced by commas, and then the colors appear on the Userselect pick-list. The selected color is placed in the field and the field color is changed back, revealing the selection.

Colors.dtf/idx and Colors.doc are included in this month’s download file.

Tom Marcellus

The Quick Answer

August 2002 9

Sesame Programming

cont’d from page 5

GUI functions

GUI stands for "Graphical User Interface," a term that describes, for example, all Windows programs. GUI functions in Sesame allow programmers to alter the appearance of the form being viewed. One obvious use of this is to change the colour of a field, to show negative balances in red text or with a distinctive field background colour. This can be done in Q&A 5.0 by using the @Color programming command. But in Sesame you can do far more. You can make a field visible or invisible via programming. Likewise a picture field. You can even control the size and position of any fields and change their labels.

Right now you might struggle to find uses for some of these features, but take it from me—in a not too distant future you will see some imaginative and essential techniques described in the successor publication to The

Quick Answer!

Notify form

In Q&A it is common to add programming to validate a record. This might consist of checking that certain fields have been filled, and maybe checking the values in one field against those in others in this record or even in another database using XLookup. This programming is typically on-record-exit programming. All very well, except for one thing: the programming is literally on record exit— you’ve already left that record by the time the validation has been performed. So, in a way, it’s too late!

In Sesame you can set a flag to permit the record to be advanceable, or not. This way, your form programming validations can control whether you can save the data in the record or block saving it. In other words, you can prevent a user from saving incomplete or incorrect data.


WriteLn (write line) is essentially a diagnostic tool. You can program Sesame to “write” whatever you want (text, field values, variables, or a combination of these) and display this in a pop-up window. This can be useful as a window into what’s going on at a particular stage in your programming. The WriteLn buffer is cleared on closing the window, but if you leave the window open then the contents of it are cumulative—that is, subsequent WriteLn writes are shown in the window, too. This makes it more versatile.

Though designed to serve as a diagnostic tool during development of your Sesame applications, WriteLn can also be used as an ongoing window to show results or otherwise convey meaningful context-sensitive messages to the user.

Subform access

As you are probably aware by now, in Sesame you can place subforms on your form. The subform shows child records, such as line-items for an invoice or sales order, individual donations from a donor, parts that make up an assembly, or tracks on a music album—the examples are limitless.

Now, wouldn’t it be nice if you could add up the value of the line-items (see Figure

1), or total the donations, or count the subrecords? In

Sesame, you can. It has programming functions that give you access to the subform data records, and all the tasks you’re likely to want to do such as the above examples can be done.

What about Q&A compatibility?

As I said earlier, virtually all

Q&A programming is compatible with Sesame. So, not only will it convert to

Sesame, but you can carry on using Q&A programming techniques and syntax, virtually unchanged in

Figure 1. Main form (Sales Order) and subform (Line Items) with the subform total shown.


The Quick Answer

August 2002

Sesame. Many of the Q&A techniques can be replaced by superior Sesame methods, but as with so many things in the new program, you don’t have to use them!

There will be some changes that need to be made, and these will be covered in more detail in forthcoming articles here in The Quick Answer. For example, field names that equate to, or include, a reserved Sesame word are not permissible in Sesame programming. The foremost example is a field name “Date.” This is the name for a data type in Sesame and so is not allowed—you’ll have to change it to “Sales_Date” or something similar.

You will need to use field names in programming instead of LFN’s (Logical Field Numbers) commonly used in Q&A. Once you get used to this, you’ll find that it is actually far easier to use field names. Not only will you be able to read your own programming (you can’t—and neither can anyone else read “#330 = #420 + #180”), but it often overcomes the common problem of sequencing— that is, wrong values being used because the field referred to hasn’t yet been calculated.

The Sesame translation process will convert field numbers in your Q&A programming to field names.

Also there are a few syntax changes—but very few.

The most notable is that the construction whereby you perform multiple XLookups in one XLookup statement will need to be replaced by separate statements.

For example, you would change this:


“Account Code”, ACCOUNT,


“Address1”, ADDRESS1,...)

To this:

XLU(“ADDRESS”, ADNO, “ADNO”, “Account Code”,



XLU(“ADDRESS”, ADNO, “ADNO”, “Address1”,


Notice that in Sesame you don’t need a semicolon to separate the programming statements.


Sesame offers not only superb compatibility with Q&A, but greatly augments Q&A's programming language, turning it into a rich development environment.

Furthermore, inconsistencies between Q&A's various multiple programming languages (Program Spec, Mass

Update Spec, Navigation Spec) are removed, so that there is one universal programming language.

Alec Mulvey is a director of Lantica Software, LLC and also owns Keyword

Software & Consultancy in Ascot, near London, England. Alec has been building Q&A applications and training clients for 12 years. Keyword

Software is the UK distributor for the International English edition of

Q&A. [email protected],

A Few Sesame Programming

Tricks with Variables & Loops

In this article you’ve read about some of the new Sesame programming features such as variables and loops. Here are a few brief programs (courtesy of the Sesame development team) that will give you some hints about how you might use them in a Sesame application.

Creating a variable with the full name from data in the

FirstName and FamilyName fields, then finding the length

(number of characters) of that full name:

var FullName as String

FullName = FirstName + " " + FamilyName

FullNameLength = @Len(FullName)

Calculating a bonus amount for the BonusAmount field:

var Bonus as Int

If Salary < 80000 Then

Bonus = Salary * 0.02


Bonus = Salary * 0.035

BonusAmount = @ToMoney(Bonus)

Using a "While" loop to find the date of the next business day when the ShipDate is a Saturday or Sunday:

ShipDate = OrderDate + 7

While((@DOW$(ShipDate) = "Saturday") Or

(@DOW$(ShipDate) = "Sunday"))


ShipDate = ShipDate + 1


Assigning a Global Static variable then changing it:

GlobalValue("gsCompanyName", "ABC Corporation")

@MsgBox("You are working with",


GlobalValue("gsCompanyName", "XYZ Corporation")

@MsgBox("Now you are working with",


Notice in the above example that the Global Static

CompanyName is prefixed with a “gs”. This is entirely optional. When creating variables and Global Statics, it’s a good practice to prefix them with a “code” that tells you that they’re variables, such as vBonus for a bonus variable and

gsCompanyName for CompanyName as a Global Static. This way, if you also had a regular local variable named

vCompanyName along with a field named CompanyName, there would be no confusion as to which was which.

Sesame requires you to “declare” your variables in advance of using them and say what type of data they are to contain. This helps you (and Sesame) keep track of them as distinct from other named elements such as fields.

The Quick Answer

August 2002 11

@Help. . .

cont’d from page 7

1. Make a backup of the database before attempting any repair!

2. Copy the design of the database to a new name.

3. Copy all of the records to that new design.

1. Utilizing the sort and programming capabilities in the report module. (See “How to Create a Duplicate Record

Report,” February 1997. Also see “A Quick Check for

Duplicate Records,” August 1999, “Identify Near-

Duplicate Records,” May 1993 and “Isolating and

Marking Duplicate Records,” May 2000.)

4. If successful, download and use the Lesspace program to protect against the large hard drive issue. (You can download a working evaluation copy of Lesspace from the Free Downloads page at

If you have one of the later versions of Q&A 3.0, dated 10/26/1989, and this fix works, then you should be able to keep it going as long as you use Lesspace or partition your drive.

2. Or, you can have Q&A export the “dupes” to an ASCII file (Remove, Duplicate records to ASCII) and then use the resulting ASCII file to import them into a copy of the database for later comparison and/or correction by looking at both of the files simultaneously with two running copies of Q&A.

Duplicate ‘Records’ a Misnomer

Will I be able to check for duplicate records without removing them in the forthcoming new Sesame product?

With Q&A 4.0 I have to use the Remove Duplicate Records feature and write down the ones Q&A shows as dupes and not remove them until I can see which of the two (or more) I can safely remove. I may have to transfer data from one

“duplicate” record to the other before I remove the one(s) I no longer need.


Same Printer in Windows and Q&A?

Does Windows have to recognize a new printer in order for

Q&A for DOS to print to it? Or is it only necessary that Q&A recognize this new printer on it's own? In other words, do both Windows and Q&A have to have the same printer installed? Or can you have a certain printer installed in one, and a different printer installed in the other?


In Q&A, removing duplicate records is actually a misnomer. Q&A does not search for “Duplicate Records.”

It looks for records where certain fields, specified by the user, contain duplicate data. A true duplicate record is one in which all of the data is exactly the same in more than one record. Sesame treats duplicates in the latter manner and allows for removal of these records. It does not look for partial duplicates.

However, if all you want to do is look at records where some fields are the same as fields in other records, you can do this in Q&A by:

Your printer must be installed in Windows in order for the computer to print to it. This install has to be for the actual printer model using the software (driver) supplied by the printer’s manufacturer. In contrast, the “printer” you

“install” in Q&A is not the actual printer. It is a set of control codes that will be sent to the printer you have installed in Windows. So, for example (my setup), you could have an Okidata OL14EX laser printer installed in

Windows and, since it emulates the HP LaserJet, you could install it in Q&A as an HP LaserJet IV.

Bill Halpern is co-owner of Professional Computer Technology Associates

(PCTA) in Newtown, Pennsylvania and is President and CEO of Lantica

Software, LLC. 215-598-8440. [email protected],





o n l i n e

Visit Our Web Site at

Complete Back Issue Index 1990 to date

Comprehensive Topic Index 1990 to date

Info on Online Subscription Benefits

Info on the Q&A successor product

Q&A Tips and Ideas

Searchable Solutions Database

Dozens of Free Files to Download

Full Database Applications

Q&A Consultants Directory

Links to Useful Web Sites & More!

The Quick Answer

August 2002

Was this manual useful for you? yes no
Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Download PDF