I've tried moving the record pointer in the underlying free table and it does work - that would be a workaround if you're running with row buffering. My concern is with table buffering - there's no way to guarantee that every modified record is going to make it.
So far, the only way I've seen that works 100% is to pull the table name out fo the view with a DBGETPROP() and issue a USE IN SELECT(cTableName) on the line before the TableUpdate(.T.,.F.) - Since views take care of opening their underlying data source, the TableUpdate will open a fresh updated copy of the file and compare fields against the fresh copy. It does seem like a non-sequiter, but the rule appears to be: If you want to update the file, close it before you update! :)
Thanks for you efforts!
~Erik Folley