[AccessD] Watching data

Tony Septav iggy at nanaimo.ark.com
Mon Mar 1 08:16:40 CST 2004


Hey Jim
There are a lot of little gems buried in Access, it is just being able to find
them when you need them.
That is what makes this list so valuable.

Jim Dettman wrote:

> Tony,
>
> <<      STable = Rst(Me(MyCtl).ControlSource).SourceTable
>       SField = Rst(Me(MyCtl).ControlSource).SourceField
> >>
>
>   Been a long time since I found something in Access that I didn't know
> existed!  I was shocked to realize this has been in DAO since version 2.0!
>
>   That really makes what John is trying to do super easy.
>
>   Good job!
>
> Jim Dettman
> President,
> Online Computer Services of WNY, Inc.
> (315) 699-3443
> jimdettman at earthlink.net
>
> -----Original Message-----
> From: accessd-bounces at databaseadvisors.com
> [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Tony Septav
> Sent: Sunday, February 29, 2004 3:22 PM
> To: Access Developers discussion and problem solving
> Subject: Re: [AccessD] Watching data
>
> Hey John
>
> Tried a quick test with a bound form to a query.
> Query contained 2 tables. My test field in the query had an alias
> eg. Tblname Account_Number, Qryname AcctNum
> For the sake of the test the text box on the form was named with an alias
> ActNo, control source from query Acctnum
>
> In Before Update
>
> Dim Db As Database, Rst As Recordset
> Dim Rst2 As Recordset
> Dim MyCtl As String
> Dim STable As String, SField As String
> Dim Ctl As Control
>
> Set Ctl = Me.ActiveControl
> MyCtl = Ctl.Name
>
> 'check to see if value has changed (variable HasChng assigned OnEnter)
> 'if changed
>
>  Set Db = CurrentDb()
>  Set Rst = Db.OpenRecordset(Me.RecordSource, dbOpenDynaset)
>       STable = Rst(Me(MyCtl).ControlSource).SourceTable
>       SField = Rst(Me(MyCtl).ControlSource).SourceField
>
>       'Assumes all tables have a Logger field
>   '    Find the record and tag it
>
>       Set Rst2 = Db.OpenRecordset("select Logger from " & STable & " where "
> &
> SField & " = " & HasChng & ";", dbOpenDynaset)
>       Rst2.Edit
>        Rst2!Logger = "Yes"
>       Rst2.Update
>   rst2.close
>   set Rst2=nothing
>  Rst.Close
>  set Rst=nothing
> 'endif
> As I say this was a quick test but "Yes" did appear in the appropriate table
> and
> record.
>
> "John W. Colby" wrote:
>
> > >I just thought of another one; what if you assign the forms recordsource
> to
> > a recordset variable in code so you can do transactions?  I've never
> looked
> > at runtime to see what that looks like to a form object.
> >
> > AFAIK this isn't possible in A2K.
> >
> > John W. Colby
> > www.ColbyConsulting.com
> >
> > -----Original Message-----
> > From: accessd-bounces at databaseadvisors.com
> > [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Jim Dettman
> > Sent: Sunday, February 29, 2004 2:37 PM
> > To: Access Developers discussion and problem solving
> > Subject: RE: [AccessD] Watching data
> >
> > John,
> >
> > <<No, by "drilling down" I mean discovering what the SOURCE of the data is
> > by
> > (I think) opening the query that the form is bound to, looking up the
> field
> > that the control is bound to, and looking at the properties of that field
> in
> > the query to discover what table / field the data comes from.>>
> >
> >   Thought I had missed the boat on that one<g>.
> >
> > <<Thus when it's time to log data and we want "table / field name / oldval
> /
> > new val" how do we discover the Tablename / Fieldname portion?>>
> >
> >   I used the brute force approach in the past; I coded the table and field
> > name that I wanted logged in the tag property for each control.
> >
> >   Without doing that, you'd need to grab the form's recordsource and
> figure
> > out what it is.  It could be a table name, query def, or SQL statement.
> The
> > first would be easy, as from that point you'd only need the controls
> record
> > source.  The second you can figure out easy enough, but parsing it would
> be
> > a problem, especially if it in itself is based on sub queries.  That
> applies
> > to querydef's as well.
> >
> >   I'm not sure what Drew was thinking of, but I don't see any easy answers
> > there.
> >
> >   I just thought of another one; what if you assign the forms recordsource
> > to a recordset variable in code so you can do transactions?  I've never
> > looked at runtime to see what that looks like to a form object.
> >
> > Jim Dettman
> > President,
> > Online Computer Services of WNY, Inc.
> > (315) 699-3443
> > jimdettman at earthlink.net
> >
> > -----Original Message-----
> > From: accessd-bounces at databaseadvisors.com
> > [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of John W. Colby
> > Sent: Sunday, February 29, 2004 12:38 PM
> > To: Access Developers discussion and problem solving
> > Subject: RE: [AccessD] Watching data
> >
> > >but I'm assuming what you mean by "drilling down" is looping through all
> > the controls
> >
> > I do control collection iteration collection all the time, starting with
> my
> > form class which has a control scanner (as I call it) which iterates the
> > controls collection loading classes for each control found.
> >
> > No, by "drilling down" I mean discovering what the SOURCE of the data is
> by
> > (I think) opening the query that the form is bound to, looking up the
> field
> > that the control is bound to, and looking at the properties of that field
> in
> > the query to discover what table / field the data comes from.
> >
> > When a form / field is bound to data, what the data is can be non-trivial
> to
> > discover.  For example the form could be bound to a query.  The developer
> > decides that rather than leaving the field names of that query alone, he
> is
> > going to rename CL_Addr1 to Address1 using field name aliases.  Further
> the
> > query could be two or more tables linked together in the query (and still
> > editable) so that fields from the  claimant and a specific claim are all
> > bound to controls on a form.  Now when the data logger tries to log the
> > data, what table is the data coming from, the claimant or the claim?
> > Further is Address1 the actual field name in the table or is it an alias?
> >
> > Thus when it's time to log data and we want "table / field name / oldval /
> > new val" how do we discover the Tablename / Fieldname portion?
> >
> > John W. Colby
> > www.ColbyConsulting.com
> >
> > -----Original Message-----
> > From: accessd-bounces at databaseadvisors.com
> > [mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Jim Dettman
> > Sent: Sunday, February 29, 2004 11:15 AM
> > To: Access Developers discussion and problem solving
> > Subject: RE: [AccessD] Watching data
> >
> > John,
> >
> > <<In order to do that I need to figure out the "drill down" thing - I
> > believe
> > that Drew was the one that assured me that it is possible.  I just have to
> > see if I can find the hints of how.  It had to do with opening the query
> and
> > inspecting the properties of the fields.>>
> >
> >   I missed earlier parts of this discussion, but I'm assuming what you
> mean
> > by "drilling down" is looping through all the controls, then yes it
> > certainly can be done.  Any of the code floating out there to resize forms
> > contains the logic required.   If you don't have access to something like
> > that, it's a pretty straight forward matter.
> >
> >   Starting at the form level, you'd use the controls collection to iterate
> > through all the controls for an object.  Just be aware that you'll need to
> > handle container controls (i.e. page frames and subforms), so it will be a
> > series of nested loops.  You might want to try and make it a recursive
> > procedure.  Performance wise, you also might want to restrict which
> controls
> > are looked at.  For example, if you don't place controls in anything other
> > then the detail section of forms, then no need to check the header and
> > footer.
> >
> >   Once you locate a control, you use the TypeOf function to figure out
> what
> > it is and if you need to deal with it. I would not bother checking the
> > .enabled or .locked properties, but simply check .oldvalue vs .value, as
> it
> > should be faster that way.
> >
> >   This would all be done in the BeforeUpdate event after your sure your
> not
> > going to cancel for any reason.
> >
> >   As far as the change log, I've always used the approach of one record
> per
> > field change:
> >
> > tblLogID  - Autonumber -PK
> > LogDateTime - D/T
> > LogType   - String - "A"dd, "D"elete, "U"pdate
> > TableName - String
> > RecordPK  - String
> > FieldName - String
> > TypeOf    - Numeric - Indicates where "NewValue" is stored
> > NewValue1 - String
> > NewValue2 - Integer
> > NewValue3 - Long
> > NewValue4 - Single
> > etc....
> >
> >   I don't bother to hold the .oldvalue because you'd be duplicating it in
> > the table.  You can also see that I don't bother to try and convert the
> > .oldvalue into a common type (i.e. a string), but rather store the actual
> > value.   If I had access to the raw binary data, then I'd do so, but
> without
> > that, this seemed to be the cleanest way.
> >
> > I've used two different types of logic in working with the log file:
> >
> > Roll forward - used to recreate a database at a specific point in time.
> > 1. Check point (backup)
> > 2. Apply log changes in a "roll forward" to a specific date and time.
> >
> > Auditing:
> > 1. Log file records are maintained as long as possible.
> >
> >   I've primarily used this in HR type apps or others where it was required
> > to recreate the data at a specific point in time.  I haven't had to use
> > logging/auditing in quite some time, but it was workable.  I went with
> > strings for the table name and field names, but I suppose you could come
> up
> > with some type of internal tracking system to use a numeric ID of some
> type,
> > but that is probably overkill. The only gotcha there is if you rename a
> > table or field.  Generally, that doesn't happen too often for me.
> >
> > HTH,
> > Jim Dettman
> > President,
> > Online Computer Services of WNY, Inc.
> > (315) 699-3443
> > jimdettman at earthlink.net
> >
> > --
> > _______________________________________________
> > AccessD mailing list
> > AccessD at databaseadvisors.com
> > http://databaseadvisors.com/mailman/listinfo/accessd
> > Website: http://www.databaseadvisors.com
> >
> > --
> > _______________________________________________
> > AccessD mailing list
> > AccessD at databaseadvisors.com
> > http://databaseadvisors.com/mailman/listinfo/accessd
> > Website: http://www.databaseadvisors.com
> >
> > --
> > _______________________________________________
> > AccessD mailing list
> > AccessD at databaseadvisors.com
> > http://databaseadvisors.com/mailman/listinfo/accessd
> > Website: http://www.databaseadvisors.com
>
> --
> _______________________________________________
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
>
> --
> _______________________________________________
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com




More information about the AccessD mailing list