Em DBF fácil:
o registro está disponÃvel antes de alterar, só salvar o conteúdo em array.
aRegistro := {}
FOR nCont = 1 TO FCount()
AAdd( aRegistro, FieldGet( nCont ) )
NEXT
Depois de salvo, só comparar com o array que foi obtido antes da gravação.
FOR nCont = 1 TO FCount()
IF FieldGet( nCont ) != aRegistro[ nCont ]
? "campo alterado"
ENDIF
NEXT
Mas e em MySQL?
O registro não está disponÃvel a não ser que se faça uma nova requisição.
E aà tem a checagem de NIL, e outras coisas mais....
Tem alguma coisa que possa ser feita automaticamente?
Por enquanto só resta fazer a requisição do recordset, o que vai levar um tempinho extra.