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.