(Updated 2010-09-27)
| 
			
 
  | 
		
Lately I've been using the
Compare'EM utility to do the grunt work of figuring out what was changed 
from one update of the backend to the next.  It's not perfect but it is a 
good utility.  (
2007-11-23)
Below is some sample VBA code which checks a stored version number in the BE and adds the tables, fields, indexes and relationships and then updates that stored version. Hmm, ok so it doesn't add tables. See the Temp Tables MDB for that code. I haven't extensively tested this code so there may very well be some missing error handling.
This code only illustrates the basics. Allen Browne mentions a much more complete set of objects and other things you need to watch out for in "back end question". You may also find you need to run update/insert/delete queries to move data from one table to another and clean things up.
Also consider the scenario where one user has your new updated front end which has update the backend logic but other users are still running the old FE.
As always when cutting and pasting code compile after you paste to see if there are any compile errors. These will likely be caused by lines wrapping to the next line unexpectedly. I will frequently cut and paste to Notepad just to ensure there is no extraneous garbage or weird formatting. Paste Special, if available on your right click menu, may also help.
It has been suggested that I could use subroutine/function calls to replace the create fields and properties and create index lines. Thus simplifying the main stream of code.
Function UpdateTableFieldDefns() As Boolean
Dim dbsUpdate As Database, wrkDefault As Workspace
Dim tdfUpdate As TableDef, tdfField As Field
Dim strMsg As String, intResponse As Integer, strSQL As String
Dim idxUpdate As Index, idxField As Field
Dim prpNew As Property, relNew As Relation
Dim tdfTable1 As TableDef, tdfTable2 As TableDef
On Error GoTo tagError
UpdateTableFieldDefns = False
Set wrkDefault = DBEngine.Workspaces(0)
' Add new fields and tables to backend
'   You will need to use 
your own method of determining the backend version number
If Forms![Global 
Options]!zVersionNumberData = 1.33 Then
    '  You will 
need to use your own method of determining the backend path and file name
    See
Tables: Retrieve linked database namepath for some sample code.
    Set dbsUpdate = 
wrkDefault.OpenDatabase(<backend path and file name>, True)
    ' Update the Mailings table
    Set tdfUpdate = dbsUpdate.TableDefs("Mailings")
    With tdfUpdate
        Set tdfField = .CreateField("mType", 
dbLong)
        .Fields.Append tdfField
        tdfField.Properties.Append 
tdfField.CreateProperty("Caption", dbText, "Mailing Type")
        tdfField.Properties.Append 
tdfField.CreateProperty("Description", dbText, _
            "Null/1 
Label/Mailing Label, 2-Excel")
    End With
' Update the Mailing Labels Header table
    Set tdfUpdate = dbsUpdate.TableDefs("Mailing Headers")
    With tdfUpdate
        Set tdfField = .CreateField("mhSequenceNbr", 
dbLong)
        .Fields.Append tdfField
        tdfField.Properties.Append 
tdfField.CreateProperty("Caption", dbText, "Sequence Nbr")
        Set tdfField = .CreateField("mhCommitteeID", 
dbLong)
        .Fields.Append tdfField
        tdfField.Properties.Append 
tdfField.CreateProperty("Caption", dbText, "Committee ID")
        Set idxUpdate = .CreateIndex("mhSequenceNbr")
        idxUpdate.Fields.Append 
idxUpdate.CreateField("mhMailingID")
        idxUpdate.Fields.Append 
idxUpdate.CreateField("mhSequenceNbr")
        idxUpdate.Unique = True
        .Indexes.Append idxUpdate
        Set idxUpdate = .CreateIndex("mhCommitteeID")
        idxUpdate.Fields.Append 
idxUpdate.CreateField("mhMailingID")
        idxUpdate.Fields.Append 
idxUpdate.CreateField("mhCommitteeID")
        .Indexes.Append idxUpdate
    End With
    ' Setup Mailing label and Committee ID relationship
    Set relNew = dbsUpdate.CreateRelation("MailingLabelCommittee", 
_
        "Committee", "Mailing Headers")
    relNew.Fields.Append relNew.CreateField("cID")
    relNew.Fields!cID.ForeignName = "mhCommitteeID"
    dbsUpdate.Relations.Append relNew
    '  You will 
need to update your version number schema somehow
    strSQL = "UPDATE 
zVersionNumberData SET zVersionNumberData = 1.34;"
    CurrentDb.Execute strSQL, dbFailOnError
End If
UpdateTableFieldDefns = True
Exit Function
tagError:
Select Case Err.Number
    Case 3262 ' Couldn't lock table '...'; currently in use by 
user '...' on machine '...'
        strMsg = "As the table or MDB is in 
use the new tables/fields can't be added." & vbCrLf & vbCrLf & _
        Err.Description & vbCrLf & vbCrLf & _
        "Click OK to try again or Cancel to 
exit the program."
        intResponse = MsgBox(strMsg, 
vbExclamation + vbOKCancel + vbDefaultButton2)
        If intResponse = vbOK Then
            Resume
        Else
            Exit Function
        End If
    Case 3191 ' Can't define field more than once.
        Resume Next
    Case 3219 ' Invalid operation. Happens when adding captions
        Resume Next
    Case 3284 ' Index already exists.
        Resume Next
    Case 3012 ' Object '...' already exists. Happens when adding 
indexes
        Resume Next
    Case Else
        MsgBox Err.Description
End Select
Exit Function
Resume
End Function
  
Auto FE Updater 
distribute new and updated Front End databases to your users with several mouse 
clicks.
Granite Fleet Manager
- the best designed fleet maintenance tracking and 
management system available
| Comments email Tony | Search | Contact | Tony's Blog | Privacy Policy | Table of Contents | 
       Website copyright © 1995-2013 Tony Toews  |