fld1 = "fld2"
@fld1 = "Test"
if ( fld2 = "Test" )
;this will be true
endif
In this example, using the "@" character to indicate indirection, it's the field which is referenced by "fld1" and not "fld1" itself which is updated.
You can even do recursive indirection, which is very cool! Not something I've had a need for myself, but very clever all the same.
However, today I was trying to populate a register the same way, using code something like this...
reg50 = "$50"
@reg50 = "Test"
if ( $50 = "Test" )
;this will be false!
endif
In this example, the register was still blank (or whatever the register was before hitting this code).
To be fair, this is clearly stated in the Uniface manuals...
Only fields can be referenced indirectly; the name reached by the indirect reference cannot be a variable. The following example is incorrect because the indirection refers to a general variable rather than to a field:
$1 = "$99"
@$1 = "This string does not go to $99."
But I still wanted to be able to set registers in an indirect way, so I came up with this alternative...
putitem/id list,"$50","Test"
getlistitems/id list
if ( $50 = "Test" )
;this will be true
endif
This works by populating a list with the register and the value, and then uses getlistitems to populate them. The "/id" mode copies items from the associative list into one or more fields, or registers in this case.
For example, you could use a simple for loop to clear out all of the dollar registers...
for count = 1 to 99
putitem/id list,"$%%count%%%",""
endfor
getlistitems/id list
This would set each of the 99 dollar registers to blank.
Summary: Indirection works great for fields, but not for registers - however, you can use getlistitems to achieve the same outcome.