I use the PICK format for the LOCATE statement in UniBasic.

But, this time, I could not understand why the statement would not find a value in a record.

Eventually, it dawned on me that I had used the dynamic notation for the multivalue element rather than the field and value expressions:


LOCATE(SEARCH.VALUE, RECORD<12>;; FOUND.POS) THEN...

instead of the correct statement:


LOCATE(SEARCH.VALUE, RECORD, 12; FOUND.POS) THEN...

Wakey wakey boy…

This got me thinking about what the LOCATE does as there are a number parameters to the statement and there are also similar functioning statements of FIND and FINDSTR.

Most of the time, I use the LOCATE with the SEQ parameter to create and maintain ordered lists (multivalue and multisubvalue). But it works equally well on non-ordered lists. What differentiates the LOCATE from the FIND statement is the LOCATE has the ability to restrict searching to a field, value and/or subvalue element of the record.

So, my first LOCATE code above will do a field search in the 12th field of the record looking for the SEARCH.VALUE as a field.

The 2nd LOCATE code above will do a value search in the 12th field of the record looking for the SEARCH.VALUE as a value.

The FIND statement does a search thoughout all fields, values and subvalues within the record setting found field, value and subvalue elements. It is not possible to localise the search to a field or value.

This does have it’s uses as I have used the FIND and FINDSTR statements for doing text find and replacement in free-form text records (think mail merge functionality).