Identifiers are looked up in the following order:
1. The currently active dataset, if any
2. The current definition being defined, and any parameters it is based on
3. Any definitions or parameters of any MODULE or FUNCTION structure that contains the current definition
This might mean that the definition or parameter you want to access isn't picked because it is hidden as in a parameter or private definition name clashing with the name of a dataset field.
It would be better to rename the parameter or private definition so the name clash cannot occur, but sometimes this is not possible.
You may direct access to a different match by qualifying the field name with the scope resolution operator (the carat (^) character), using it once for each step in the order listed above that you need to skip.
This example shows the qualification order necessary to reach a specific definition/parameter:
ds := DATASET([1], { INTEGER SomeValue }); INTEGER SomeValue := 10; //local definition myModule(INTEGER SomeValue) := MODULE EXPORT anotherFunction(INTEGER SomeValue) := FUNCTION tbl := TABLE(ds,{SUM(GROUP, someValue), // 1 - DATASET field SUM(GROUP, ^.someValue), // 84 - FUNCTION parameter SUM(GROUP, ^^.someValue), // 42 - MODULE parameter SUM(GROUP, ^^^.someValue), // 10 - local definition 0}); RETURN tbl; END; EXPORT result := anotherFunction(84); END; OUTPUT(myModule(42).result);
In this example there are four instances of the name "SomeValue":
a field in a DATASET.
a local definition
a parameter to a MODULE structure
a parameter to a FUNCTION structure
The code in the TABLE function shows how to reference each separate instance.
While this syntax allows exceptions where you need it, creating another definition with a different name is the preferred solution.