Each Dataset counts as a qualified scope and the fields within them are fully qualified by their Dataset (or record set) name and Field name, using dot syntax (dataset.field). Similarly, the result set of the TABLE built-in function (see the TABLE keyword) also acts as a qualified scope. The name of the record set to which a field belongs is the object name:
Young := YearOf(Person.per_dbrth) < 1950; MySet := Person(Young);
When naming a Dataset as part of a definition, the fields of that Definition (or record set) come into scope. If Parameterized Definitions (functions) are nested, only the innermost scope is available. That is, all the fields of a Dataset (or derived record set) are in scope in the filter expression. This is also true for expressions parameters of any built-in function that names a Dataset or derived record set as a parameter.
MySet1 := Person(YearOf(dbrth) < 1950); // MySet1 is the set of Person records who were born before 1950
MySet2 := Person(EXISTS(OpenTrades(AgeOf(trd_dla) < AgeOf(Person.per_dbrth))));
// OpenTrades is a pre-defined record set. //All Trades fields are in scope in the OpenTrades record set filter //expression, but Person is required here to bring Person.per_dbrth // into scope //This example compares each trades' Date of Last Activity to the // related person's Date Of Birth
Any field in a Record Set can be qualified with either the Dataset name the Record Set is based on, or any other Record Set name based on the same base dataset. For example:
memtrade.trd_drpt nondup_trades.trd_drpt trades.trd_drpt
all refer to the same field in the memtrade dataset.
For consistency, you should typically use the base dataset name for qualification. You can also use the current Record Set's name in any context where the base dataset name would be confusing.