[AccessD] Watching data

John W. Colby jwcolby at colbyconsulting.com
Sun Feb 29 19:58:51 CST 2004


Tony,

The following is what I ended up with:

'
'This function iterates the mfrm's control collection looking up the
control's table and field names
'
'Since I sometimes open the form unbound, I need to do all this in a
separate function after binding the form
'to a table.
'
Public Function CtlDataSrc()
On Error GoTo Err_CtlDataSrc
Dim rst As DAO.Recordset
Dim ctl As Control
Dim strSrcTbl As String
Dim strSrcFld As String

    'Get a copy of the form's Recordset
    Set rst = mfrm.RecordsetClone
    'Iterate the controls collection for the form
    For Each ctl In mfrm.Controls
        Debug.Print ctl.Name
        'attempt tp get the source table name for the field the control is
bound to.
        err.Clear
        On Error Resume Next
        strSrcTbl = rst(ctl.ControlSource).SourceTable
        If err = 0 Then 'If there is no error (the field is bound to a field
and the source table is found)
            mobjChildren(ctl.Name).BoundTbl = strSrcTbl 'look up the class
in mobjChildren collection and pass the class the table name
        End If
        'Do the same stuff for the source field name
        strSrcFld = rst(ctl.ControlSource).SourceField
        If err = 0 Then
            mobjChildren(ctl.Name).BoundFld = strSrcFld
        End If
    Next ctl

Exit_CtlDataSrc:
On Error Resume Next
    If Not (rst Is Nothing) Then rst.Close: Set rst = Nothing
Exit Function
Err_CtlDataSrc:
        MsgBox err.Description, , "Error in Function dclsFrm.CtlDataSrc"
        Resume Exit_CtlDataSrc
    Resume 0    '.FOR TROUBLESHOOTING
End Function

This assumes a pair of private string variables in each data aware class:

'
'Used for change logging
'
Private mstrBoundTbl As String              'The Table that this control is
bound to
Private mstrBoundFld As String              'The field in the table that
this control is bound to

and corresponding property get/let statements to access the variables:

'
'Properties for the bound field / table (properties of the control class)
'
Public Property Get BoundTbl() As String
    BoundTbl = mstrBoundTbl
End Property
Public Property Let BoundTbl(strTblName As String)
    mstrBoundTbl = strTblName
End Property
Public Property Get BoundFld() As String
    BoundFld = mstrBoundFld
End Property
Public Property Let BoundFld(strFldName As String)
    mstrBoundFld = strFldName
End Property

So far it all appears to be working flawlessly.  I added the variables and
properties to all of my control classes that are for bound controls and I'm
off and running.

That takes care of each control knowing it's table / field.

Next I have to do the code to tell each such control to store the old value
and return the various old / new  values.  I do think I'll write a
DataLogger class to handle the issue of storing sets of controls to log data
for as well as the logic of when to save the old values, when to return the
various pieces for logging, handling the log table etc.

I think this is going to work nicely though.

John W. Colby
www.ColbyConsulting.com

-----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.





More information about the AccessD mailing list