The help file for TABLEUPDATE specifically says, "If table buffering is used and multiple records are updated, TABLEUPDATE( ) moves the record pointer to the last record updated." So it would seem you're updaing more than one record at a time and that's why the record pointer is moved.
I don't see any code that indicates that you're check that the TABLEUPDATE was successful. I usually send a 1 as the first parameter, but check the value returned from TABLEUPDATE. If it's .F., then I use AERROR() to find out what the problem was.
By using 2 as the first parameter, you're telling VFP not to generate an error, but to store any errors in an array passed as the 4th parameter...but you don't pass an array. So it would seem to me that your TABLEUPDATE is failing, but you don't know it.