Microsoft Access code samples

Click Here to return to the main MVCT page.

Bookmark and Share


Two ways to create a new database containing the same tables as a template database. Insert the following code into an Access 97/2000/2003/2007 module.



Function CloneTableDefs(ByVal strTemplateDatabase As String, ByVal strNewDatabase As String)

    On Error Resume Next

    Dim myDB As Database
    Dim myTDF As TableDef
    Dim myField As Field
    Dim myIndex As Index
    Dim lngTDFCount As Long
    Dim TDFs As TableDefs
    Dim a As Long, b As Long, c As Long
    Dim lngFieldCount As Long
    Dim lngIndexCount As Long
    Dim lngPropCount As Long
    Dim myProperty As Property
    Dim TemplateDB As Database

    Set myDB = DAO.DBEngine.CreateDatabase(strNewDatabase, dbLangGeneral, dbVersion30)
    Set TemplateDB = DAO.DBEngine.OpenDatabase(strTemplateDatabase, , True)
    Set TDFs = TemplateDB.TableDefs
    lngTDFCount = TDFs.Count - 1
    For a = 0 To lngTDFCount
        If (TDFs(a).Attributes And dbSystemObject) = False And (TDFs(a).Attributes And dbHiddenObject) = False And (TDFs(a).Attributes And 2) = False Then
            Set myTDF = myDB.CreateTableDef(TDFs(a).Name)
            lngFieldCount = TDFs(a).Fields.Count - 1
            For b = 0 To lngFieldCount
                Set myField = myTDF.CreateField(TDFs(a).Fields(b).Name, TDFs(a).Fields(b).Type)
                lngPropCount = TDFs(a).Fields(b).Properties.Count - 1
                For c = 0 To lngPropCount
                    Err.Clear
                    myField.Properties(TDFs(a).Fields(b).Properties(c).Name).Value = TDFs(a).Fields(b).Properties(c).Value
                    If Err.Number <> 0 Then
                        Err.Clear
                        Set myProperty = myField.CreateProperty(TDFs(a).Fields(b).Properties(c).Name, TDFs(a).Fields(b).Properties(c).Type, TDFs(a).Fields(b).Properties(c))
                        myField.Properties.Append myProperty
                    End If
                Next c
                myTDF.Fields.Append myField
            Next b
            Err.Clear
            lngIndexCount = TDFs(a).Indexes.Count - 1
            For b = 0 To lngIndexCount
                Set myIndex = myTDF.CreateIndex(TDFs(a).Indexes(b).Name)
                lngPropCount = TDFs(a).Indexes(b).Properties.Count - 1
                For c = 0 To lngPropCount
                    myIndex.Properties(TDFs(a).Indexes(b).Properties(c).Name) = TDFs(a).Indexes(b).Properties(c)
                    Err.Clear
                Next c
                lngFieldCount = TDFs(a).Indexes(b).Fields.Count - 1
                For c = 0 To lngFieldCount
                    Set myField = myIndex.CreateField(TDFs(a).Indexes(b).Fields(c).Name)
                    Err.Clear
                Next c
                myIndex.Fields.Append myField
                myTDF.Indexes.Append myIndex
            Next b
            myDB.TableDefs.Append myTDF
        End If
    Next a
    myDB.Close
    Set myDB = Nothing

End Function

Function CreateDBCreateFunction(ByVal strModuleName As String, ByVal strFunctionName As String, ByVal strTemplateDatabase As String)

    On Error Resume Next

    Dim myDB As Database
    Dim lngTDFCount As Long
    Dim TDFs As TableDefs
    Dim a As Long, b As Long, c As Long
    Dim lngFieldCount As Long
    Dim lngIndexCount As Long
    Dim lngPropCount As Long
    Dim myProperty As Property
    Dim strTempFolder As String
    Dim strData As String
    Dim strTableArray() As String
    Dim lngCount As Long
    Dim TemplateDatabase As Database
    Dim strTemp As String
    
    strTempFolder = Environ$("TEMP")
    If Dir$(strTempFolder, vbDirectory) = "" Then
        strTempFolder = "C:"
    End If
    strTempFolder = strTempFolder & "\"
    Kill strTempFolder & strModuleName
    Open strTempFolder & strModuleName For Binary As #1
    strData = "Option Explicit" & vbCrLf & "Option Compare Database" & vbCrLf
    Put 1, , strData
    strData = "Public myDB As Database" & vbCrLf
    Put 1, , strData
    
    ' Function AppendProperty()
    strData = vbCrLf
    Put 1, , strData
    strData = "Private Function AppendProperty(ByRef myField As Field, ByVal strPropertyName as String, ByVal lngPropertyType as long, ByVal strPropertyValue as string)" & vbCrLf
    Put 1, , strData
    strData = vbTab & "Dim myProperty as Property" & vbCrLf
    Put 1, , strData
    strData = vbTab & "On Error Resume Next" & vbCrLf
    Put 1, , strData
    strData = vbTab & "myField.Properties(strPropertyName).Value = strPropertyValue" & vbCrLf
    Put 1, , strData
    strData = vbTab & "If Err.Number <> 0 Then" & vbCrLf & _
             vbTab & vbTab & "Err.Clear" & vbCrLf & _
             vbTab & vbTab & "Set myProperty = myField.CreateProperty(strPropertyName, lngPropertyType, strPropertyValue)" & vbCrLf & _
             vbTab & vbTab & "myField.Properties.Append myProperty" & vbCrLf & _
             vbTab & "End If" & vbCrLf
    Put 1, , strData
    strData = "End Function" & vbCrLf
    Put 1, , strData
    
    Set TemplateDatabase = DAO.DBEngine.OpenDatabase(strTemplateDatabase, , True)
    Set TDFs = TemplateDatabase.TableDefs
    lngTDFCount = TDFs.Count - 1
    For a = 0 To lngTDFCount
        If (TDFs(a).Attributes And dbSystemObject) = False And (TDFs(a).Attributes And dbHiddenObject) = False And (TDFs(a).Attributes And 2) = False Then
            ReDim Preserve strTableArray(lngCount)
            strTableArray(lngCount) = "Fun" & lngCount
            strData = vbCrLf
            Put 1, , strData
            strData = "Private Function fun" & strTableArray(lngCount) & "()" & vbCrLf
            Put 1, , strData
            strData = vbTab & "On Error Resume Next" & vbCrLf
            Put 1, , strData
            strData = vbTab & "Dim myTDF As TableDef" & vbCrLf
            Put 1, , strData
            strData = vbTab & "Dim myField As Field" & vbCrLf
            Put 1, , strData
            strData = vbTab & "Dim myIndex As Index" & vbCrLf
            Put 1, , strData
            strData = vbTab & "Set myTDF = myDB.CreateTableDef(" & Chr$(34) & TDFs(a).Name & Chr$(34) & ")" & vbCrLf
            Put 1, , strData
            lngFieldCount = TDFs(a).Fields.Count - 1
            For b = 0 To lngFieldCount
                strData = vbTab & vbTab & "Set myField = myTDF.CreateField(" & Chr$(34) & TDFs(a).Fields(b).Name & Chr$(34) & ", " & TDFs(a).Fields(b).Type & ")" & vbCrLf
                Put 1, , strData
                lngPropCount = TDFs(a).Fields(b).Properties.Count - 1
                For c = 0 To lngPropCount
                    Err.Clear
                    strTemp = ""
                    strTemp = RemoveQuotes(TDFs(a).Fields(b).Properties(c).Value)
                    If strTemp <> "" Then
                        If TDFs(a).Fields(b).Properties(c).Type = dbText Or TDFs(a).Fields(b).Properties(c).Type = dbMemo Then
                            strData = vbTab & vbTab & vbTab & "AppendProperty myField, " & Chr$(34) & TDFs(a).Fields(b).Properties(c).Name & Chr$(34) & ", " & TDFs(a).Fields(b).Properties(c).Type & ", " & Chr$(34) & strTemp & Chr$(34) & vbCrLf
                        Else
                            strData = vbTab & vbTab & vbTab & "AppendProperty myField, " & Chr$(34) & TDFs(a).Fields(b).Properties(c).Name & Chr$(34) & ", " & TDFs(a).Fields(b).Properties(c).Type & ", " & strTemp & vbCrLf
                        End If

                        Put 1, , strData
                    End If
                Next c
                strData = vbTab & vbTab & "myTDF.Fields.Append myField" & vbCrLf
                Put 1, , strData
            Next b
            Err.Clear
            lngIndexCount = TDFs(a).Indexes.Count - 1
            For b = 0 To lngIndexCount
                strData = vbTab & vbTab & "Set myIndex = myTDF.CreateIndex(" & Chr$(34) & TDFs(a).Indexes(b).Name & Chr$(34) & ")" & vbCrLf
                Put 1, , strData
                lngPropCount = TDFs(a).Indexes(b).Properties.Count - 1
                For c = 0 To lngPropCount
                    strTemp = ""
                    strTemp = RemoveQuotes(TDFs(a).Indexes(b).Properties(c))
                    If strTemp <> "" Then
                        If TDFs(a).Indexes(b).Properties(c).Type = dbText Or TDFs(a).Indexes(b).Properties(c).Type = dbMemo Then
                            strData = vbTab & vbTab & vbTab & "myIndex.Properties(" & Chr$(34) & TDFs(a).Indexes(b).Properties(c).Name & Chr$(34) & ") = " & Chr$(34) & strTemp & Chr$(34) & vbCrLf & vbTab & vbTab & vbTab & "Err.Clear" & vbCrLf
                        Else
                            strData = vbTab & vbTab & vbTab & "myIndex.Properties(" & Chr$(34) & TDFs(a).Indexes(b).Properties(c).Name & Chr$(34) & ") = " & strTemp & vbCrLf & vbTab & vbTab & vbTab & "Err.Clear" & vbCrLf
                        End If
                        Put 1, , strData
                    End If
                Next c
                lngFieldCount = TDFs(a).Indexes(b).Fields.Count - 1
                For c = 0 To lngFieldCount
                    strData = vbTab & vbTab & "Set myField = myIndex.CreateField(" & Chr$(34) & TDFs(a).Indexes(b).Fields(c).Name & Chr$(34) & ")" & vbCrLf & _
                    vbTab & vbTab & "Err.Clear" & vbCrLf
                    Put 1, , strData
                    strData = vbTab & vbTab & "myIndex.Fields.Append myField" & vbCrLf
                    Put 1, , strData
                Next c
                strData = vbTab & vbTab & "myTDF.Indexes.Append myIndex" & vbCrLf
                Put 1, , strData
            Next b
            strData = vbTab & "myDB.TableDefs.Append myTDF" & vbCrLf
            Put 1, , strData
            strData = "End Function" & vbCrLf
            Put 1, , strData
        lngCount = lngCount + 1
        End If
    Next a
    myDB.Close
    Set myDB = Nothing
    lngCount = lngCount - 1
    
    'Main Function
    strData = "Function " & strFunctionName & "(ByVal strDBName As String)" & vbCrLf
    Put 1, , strData
    strData = vbTab & "Set myDB = DAO.DBEngine.CreateDatabase(strDBName, dbLangGeneral, dbVersion30)" & vbCrLf
    Put 1, , strData
    strData = vbTab & "Access.SysCmd AcSysCmdInitMeter," & Chr$(34) & "Creating " & Chr$(34) & " & strDBName & " & Chr$(34) & ":" & Chr$(34) & ", " & CStr(lngCount + 1) & vbCrLf
    Put 1, , strData
    For a = 0 To lngCount
        strData = vbTab & "Access.SysCmd AcSysCmdUpdateMeter, " & CStr(a + 1) & vbCrLf
        Put 1, , strData
        strData = vbTab & "fun" & strTableArray(a) & vbCrLf
        Put 1, , strData
    Next a
    strData = vbTab & "Access.SysCmd AcSysCmdRemoveMeter" & vbCrLf
    Put 1, , strData
    strData = vbTab & "myDB.Close" & vbCrLf & vbTab & "Set myDB = Nothing" & vbCrLf
    Put 1, , strData
    strData = "End Function" & vbCrLf
    Put 1, , strData
    
    Close 1
    MSAccess.LoadFromText acModule, strModuleName, strTempFolder & strModuleName

End Function

By downloading this code, you agree to use it solely at your own risk. I provide no warranty express or implied for this code.



I can be reached via email to mvernon@mvct.ca. If I don't reply it's because either my spam filter took care of you, or I'm really busy. Either way, please accept my apologies in advance.


Dose computations using MVCT images


 



You are visitor 426 of 426. Your IP Address is 38.107.191.112
This is your first visit!