Just keep a few things in mind, when you work with a function or alo a query that has an array as its result, you see phrasing like this in all documentation.
a) VFP creates an array, if it doesn't exist and fills it with the data depending on query or function (ALINES, AUSED, etc.)
b) VFP extends an array, if it exists but is too small, so the result data can fit int
But that's it. VFP does NOT release an array if there is no result, so cehcking whether the array is not "U", which means checking whether the array is not undefined, means have the prerequisite the array is not existing before the query, if it did already exist it still exists when the result is empty, because VFP does not destroy an array just because there was no result, the old array is then kept. And that's where you can easily fail.
To query INTO CURSOR differs in that aspect, as VFP then always first creates an empty cursor, it even overrides and thus destroys a cursor of the same name. So that differs from querying into an array and one thing is completely right about Steves usage of reccount() in that case. It will just also be a number of some workarea when you query into an array and will have no connection to the result size. That's where _TALLY is always working, as already explained.
One more thing VFP does not do: When an array is sufficiently large it's used to store the query result and any additional array elements stay untouched, so you can't even use ALEN to determine the _tally of the query. An array as a result of a query has one major use case: When your query should produce exactly one field result, when the result array size is 1 only. Then both array[1] and array without the element index will be that one single value. such queries are things like SELECT COUNT(*) or other aggregation functions.
I won't dictate you what to use, if the array reuslt is convenient for some reason, I'm fine, but you need to know that in this case _TALLY can differ from ALEN, because the array was already larger than necessary for the result and the arrray can exist even though _tally is 0, so you are in the danger zone.
There are obviously two easy ways out of the danger zone: RELEASE the array before the query, or just use _tally. I'd neglect the report of a single case where _tally supposedly didn't give the result record count. It's really deep in the foundation of all commands having a result count.
Even not considering all these specialties, I'd find using _TALLY far easier and more elegant than checking the existance of the result array with VARTYPE.
Chriss