A GLOBAL table is immensely useful in keeping clutter down in your relationships. Global fields are accessible anyplace in the solution.
However, IF you are using the global for say, a MATCH condition in a relationship, that global must exist in the parent table so as to be available to the relationship.
Naming conventions are really useful in this (and all through FM). For my purposes (and preference) all global fields in the global table start with a "g_: then "fieldname". That way, where ever they appear in a solution, I know where to find them.
Globals used as constants start with "gk_"; if in a data table, "zgk_"
Globals used as a relationship match start with "zgm_"
..... and so on. The preface starting with z in a data table, takes the fields out of the alpha sorted list of data, and places them at the end. Global "zg....." tells me the field are in a data table, NOT a globals table.
And of note: Global fields (and $$Global variables) are persistent only for the duration of a given user session. They do not persist outside of a login.... with one exception. Globals set in a file upon upload to a server, default to those global values with the start of each user session, which has its' pros and cons (mostly cons).
There are also a bunch of rules on the use of globals, best articulated by the esteemed FileMaker expert, Dr. Ray Cologon, shown in the following bullet points. It is worthwhile to copy and retain these points, as they are invaluable learnings.........
-
A global calc will update automatically if it references a global field that is located in the same table and that field is edited by the current user.
-
A global calc will update automatically if it references a regular field that is located in the same table (and referenced directly) when that field is edited on any record by the current user. In this instance, the value of the global calc will depend on the value of the referenced field in the record in which that field has most recently been edited. When the global calc references multiple regular fields, its value will depend on the values in the instances of those fields located on the particular record where the most recently edited (by the current user) of any of those fields resides.
-
A global calc will NOT update if it references a global field that is located in another table, if that field is edited by the current user.
-
A global calc will NOT update if it references a global field (in the same table and referenced directly, or in another table) that is edited by different user (users see their own separate global values...).
-
A global calc will NOT update automatically if it references a regular field that is located in the same table (and referenced directly) when that field is edited on any record by another user.
-
A global calc will NOT update automatically if it references a regular field that is located in a related table (even if a self-relation) if that field is edited on any record by the current user or by another user.
-
If a global calc references one or more related fields (as per 3 and 6 above) and ALSO directly references a local field, either global or regular, the value of the global calc will depend on the related values which are current (for the current user) at the time when the local (to the table in which the global calc resides) value/s are edited.
-
The value of a global calc when a solution is opened remotely will be the value that it had on the host when last closed (sound familiar?!).
-
The values of global calcs in a hosted solution can be 'tickled' at login by changing a local field which they reference. Eg if there are several dozen global calcs with formulae constructed along the lines of:
If(not IsEmpty(GlobalsTable::RegularTriggerField); RelatedTable::dataField)
then they will all update to reflect the current (related) values at start-up if the start-up script includes the command:
Set Field [GlobalsTable::RegularTriggerField; "1"]
- Changes made to referenced regular fields on another workstation will not appear in global calc results until a refresh event (eg as per 9 above) has occurred on the current workstation - eg the next time the start-up script runs. If there is no triggering mechanism (as per point 9) then the changes will not appear at all until the solution is taken offline, updated in a client session, closed and reopened on the server, as is the case with non-calc globals.
As usual, you can take information like this from Dr. Ray to the bank.