Good,
I just would never advise not to call an event, but for sake of simplicity if your save button calls the form.error() code then you don't have an actual error triggered. In that case AERROR will have the direct result 0, as it generates no error rows. It could also just repoort the last errror that happend anytie before. So there you have another reason to split this up into two form methods, one - the error event- with code thaat only gets triggered by error events, one that's for the lgging purpoose and can be called from error handling or when tableupdate() returns .f.
Notice tableupdate returning .f. just reports a proble of storing the buffered data, in detail that doesn't need to be a dbf corruption, it could be a broken field or table rule, it could be due to a confliict tableupdate detects. For example if you make the update type keyfield and modified fields, the original record is searched by all those fields old value, not just the key. If anything changed - the key shouldn't - then this points out fields you modified were modified by another client, too, and that client already saved before you. You need to handle this, but not with error handlling and logging, you need to inform the user that someone else made a change of the same fields and you could let them decide what new value is actually the better new value.
Also with other reasons tbleupdate fails and returns .f. ,it's not an error and things like AERROR then don't work as expected. So you shouldn't call the error handler that expects AERROR to create an error array row, or more. Or you have to program it, so the case with no actual error also is covered.
Chriss