Gustav Brock
Gustav at cactus.dk
Wed Jan 12 06:38:55 CST 2005
Hi John & Mark Another option: Investigate using CRC (cyclic redundancy checksum) algorithms to quickly tell if a complex record has changed. /gustav >>> Gustav at cactus.dk 11-01-2005 18:03:43 >>> Hi John I guess you are right (haven't tested it). But couldn't you create a "true" copy: Set rstClone = Me.RecordsetClone Set rstCopy = rstClone.OpenRecordset() /gustav >>> jwcolby at colbyconsulting.com 11-01-2005 16:48:22 >>> Gustav, I just tried than and it doesn't appear to work. It appears that the original RecordsetClone is a live dataset, not a snapshot. Even at BeforeUpdate update, the changes to the recordset filter down to the recordsetclone. Further I cannot use the .OriginalValue property, I get an error "doesn't support this ...". I am using the following code to look at and test this: Private Function DisplayRecordData(rst As DAO.Recordset) On Error GoTo Err_DisplayRecordData Dim fld As DAO.Field Dim strData As String Dim varValOrig As Variant For Each fld In rst.Fields With fld strData = strData & .SourceTable & "." & .SourceField & ":" & .Value On Error Resume Next varValOrig = fld.OriginalValue If Err = 0 Then strData = strData & ":" & fld.OriginalValue & "; " Else Err.Clear On Error GoTo Err_DisplayRecordData strData = strData & "; " End If End With Next fld Debug.Print strData Exit_DisplayRecordData: Exit Function Err_DisplayRecordData: MsgBox Err.Description, , "Error in Function clsAudTrailRstMethod.DisplayRecordData" Resume Exit_DisplayRecordData Resume 0 '.FOR TROUBLESHOOTING End Function The code simply cycles through all of the fields and builds up a string of the SourceTable name, the SourceFieldName and the value. The line immediately following OnError resume next allways throws an error, whether editing the record or not. John W. Colby www.ColbyConsulting.com Contribute your unused CPU cycles to a good cause: http://folding.stanford.edu/ -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Gustav Brock Sent: Tuesday, January 11, 2005 4:07 AM To: accessd at databaseadvisors.com Subject: RE: [AccessD] Tracking real edits Hi Mark & John Wouldn't it be easier to create a RecordsetClone at the OnCurrent event, then at BeforeUpdate compare all fields of the current record with the clone and cancel if they match? /gustav >>> lists at theopg.com 11-01-2005 00:37:38 >>> John Dunno if either of these would be appropriate... In some cases I store all the values in a two simple delimited strings, create a function which concatenates all the values and call it first on form load (or current) to populate oldString and then on save / exit (or whatever) to populate newString and then compare the two... It works pretty good but could (possibly?) be problematic where the contents of the form include memo fields. I have also done the same with arrays (containing controlName and controlValue), one for the old values and one for the new then loop through doing comparisons and whatever actions appropriate. Do the comparisons on save / exit as appropriate and stuff the access update events :@) Both methods work pretty good in the right place... Generally, where control specific audits have been required I found it less problematic to use unbound forms... In fact, recently I have wanted to kick myself for using bound forms at all coz it's such a pain. Hth Mark -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of John W. Colby Sent: 10 January 2005 05:42 To: 'Access Developers discussion and problem solving' Subject: RE: [AccessD] Tracking real edits I could do that. If it comes down to that I am examining a class for each control being tracked, with an Old/Newvalue property. If I want to use WithEvents to trigger the save of the data only when there is a modification to the control's data, then I have to have a class for each control type being tracked since a control object type cannot source events (it must be a specific type - combo, text etc). Doing it that way allows it to work for A2K (or even A97) as well as WinXP and beyond. I have toyed with that idea for logging the actual data changes which is a subject that comes up often on this list. I was really hoping to just use built in events to tell me that data changed, and if the data changes were undone. Sometimes Access can be so frustrating. Something like this should just already be there in the control class. If the undo events triggered correctly and reliably I would be done right now. Each control MUST know that it's data changes are undone, why doesn't it fire the event each and every time? John W. Colby www.ColbyConsulting.com Contribute your unused CPU cycles to a good cause: http://folding.stanford.edu/ -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Jim Lawrence Sent: Sunday, January 09, 2005 11:43 PM To: 'Access Developers discussion and problem solving' Subject: RE: [AccessD] Tracking real edits Hi John: Would it work if you took control yourself but simply saving the initial data settings, of the current record....then comparing for any differences. I use a similar technical, storing all the fields in a matching TYPE record and compare when moving or exiting. (It an old unbound habit....) HTH Jim -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of John W. Colby Sent: Sunday, January 09, 2005 6:14 PM To: 'Access Developers discussion and problem solving' Subject: [AccessD] Tracking real edits I have wondered for a long time how to track real edits. Issues: User starts to edit a field, hits the escape key and undoes edit. The AfterUpdate of a given control tells me the user started an edit. In Access XP the Escape causes OnUndo to fire, I can determine that the undo happened. Notice that A2K and previous do not even have OnUndo. However, if the user edits a control and leaves that control, then the AfterUpdate fires, I know the control was edited, but if they then hit Escape, the control edit is undone, but OnUndo DOES NOT FIRE, thus I incorrectly think that the control is still edited. My client wants to create date stamp fields for groups of fields, i.e. a NameDateStamp, AddressDateStamp, PhoneDateStamp etc. Thus I need to know that an edit happened and that the edit actually stored. I've never really figured out a satisfactory way to do this. Does anyone have a method that they use that appears to correctly handle all the nefarious things that a user can do?