Hi John,
I see your issue. Here's the way I would look at it:
Who's responsibility is it to compare the fields?
I would answer it's the current DS, or perhaps as Hilmer sees it the Database itself. Once the comparison is done, the Auditlog can be sent the information about what to log. All it knows about is creating, saving, perhaps retrieving a auditlog. It doesn't do the comparison work. You could certainly create a function or object whose job it is to do the comparison. It's only task is to walk through the fields and look for changes. This comparison object might have a Fields2Ignore property to account for things you don't wish to track.
Example:
In your form when you are ready to save:
oComparer = NEWOBJECT("comparer")
oComparer.Alias2Compare = "SomeBufferedAlias"
oComparer.Fields2Ignore = "Stamp, User"
oComparer.Do()
goAuditlog.RecordUpdate(oComparer.ComparisonTextorXML)
Now you have a AuditLog object that can be used for many logging issues. Your comparison object is able to compare any buffered table, and yet can be flexible--but it must live in the DS that has the work to do.
Charlie