globaldictionarybuild
DICTIONARY
,
DATABASE
,
KEY
,
VALUE
,
Subset

The globaldictionarybuild statement builds a global dictionary by scanning a database.


Parameters

This statement has five parameters:

dictionary – is the name of the dictionary to be created/modified. If the dictionary doesn’t already exist, it will be created. If the dictionary does already exist, it will be emptied (all values cleared) before the database information is added.

database – the database to be scanned.

key – is a formula used to calculate the keys in the global dictionary. Normally this formula will include one or more fields from the database being scanned. The result of this formula must be text. Note: This formula is NOT quoted.

value – is a formula used to calculate the values associated with each key in the global dictionary. Normally this formula will include one or more fields from the database being scanned. The result of this formula can be any data type. Note: This formula is NOT quoted.

subset – is a formula used to determine which records should be included in the global dictionary. Normally this formula will include one or more fields from the database being scanned. The result of this formula must be boolean (true/false). If the formula is omitted, all records will be included (including invisible records). Note: This formula is NOT quoted.


Description

This statement builds a global dictionary by scanning a database. It’s similar to the arraybuild statement, but builds a global dictionary instead of an array. See Global Dictionaries to learn the basics of creating and accessing a global dictionary.

The primary purpose of this statement is that once the global dictionary is built, you can look up values in it with the globaldictionaryvalue( function. Because global dictionaries use a structure that is very efficient for searching, lookups performed this way can be hundreds of times faster than looking up directly from the database with the lookup( function. However, this speed increase is only practical if you plan to do many lookups without ever modifying the data. If you just plan to do a single lookup, or if the data is modified frequently (every time the data is modified you would have to use the globaldictionarybuild statement again), just using a regular lookup( statement is better.

For example, suppose you have a database named Contacts that contains names and email addresses. You can build a global dictionary with this information with a single line of code:

globaldictionarybuild "ContactEmails","Contacts",Name,Email

Now suppose you have another database that also contains names and email addresses, and you wish to update the email addresses with the email addresses from the Contacts database. This database has fields named FullName and E-mail. This code will fill the E-mail field with the latest email addresses gleaned from the Contacts database.

field "E-mail"
formulafill catcherror(«E-mail»,globaldictionaryvalue("ContactEmails",FullName))

We tested this code on two databases with 20,000 records of data, the entire process (first building the global dictionary and then doing the formula fill) took about 3 seconds. We then tried this same operation using the lookup( function, like this:

field "E-mail"
formulafill lookup("Contacts",Name,FullName,Email,«E-mail»)

With the same 20,000 record databases, this operation took almost 7 minutes! Using globaldictionarybuild was 134 times faster. In our tests, the speed difference was larger as the databases got larger.

If you are considering using globaldictionarybuild with formulafill, however, you should probably take a close look at the join statement. Using the join statement, you can update the email addresses with a single line of code.

join "Database","Contacts","Key","Name","SourceKey","FullName","«E-mail»",{Email}

The join statement uses the same high performance internal structure used by global dictionaries, so the perfomance is also very fast – about 3 seconds for our 20,000 record test databases.


See Also


History

VersionStatusNotes
10.2NewNew in this version.