DAO TableDef

Tabel creëren.

In bepaalde gevallen kan het handig zijn om in een database toepassing via code aan te maken.
Men volgt daarbij best een aantal stappen:

  1. Controleren indien de tabel reeds niet bestaat.
  2. De tabel aan maken met de CreateTableDef van het database object.
  3. De velden, met vereiste attributen, van de tabel aanmaken met de CreateFiled methode van het TableDef object.
  4. Ieder veld toevoegen aan de Field's collectie van de TableDef.
  5. Het nieuw gecreëerde tabel TableDef toevoegen aan de TableDefs collectie van het database object
  6. De TableDefs collection actualiseren.
Function fMaakTabel() As Boolean
            Dim dbLokaal As DAO.Database
            Dim tdf As DAO.TableDef
            Dim strNaamTabel As String
            Dim fldIDPersoon As DAO.Field
            Dim fldPersoonNaam As DAO.Field
            Dim fldPersoonVNaam As DAO.Field
            Dim fldPersoonGesl  As DAO.Field
            Dim fldPersoonGebDat As DAO.Field
            
            fMaakTabel = False
            Set dbLokaal = CurrentDb
            strNaamTabel = "tblPersonen"
            
            Set tdf = dbLokaal.CreateTableDef(strNaamTabel)
            
            'hiermee is de tabel tblPersonen gemaakt, maar is nog niet toegevoegd aan de collectie
            'dan de TableDefs van de database, ze bestaat enkel in het geheugen van het systeem.
            'Daar men een tabel zonder velden niet kan bewaren moet men nu de velden toevoegen.
            
            
            Set fldIDPersoon = tdf.CreateField()
                With fldIDPersoon
                    .Name = "IDPersoon"
                    .Type = dbLong
                    .Attributes = dbAutoIncrField + dbFixedField
                    .Required = True
                End With
            Set fldPersoonNaam = tdf.CreateField
                With fldPersoonNaam
                    .Name = "PersoonNaam"
                    .Type = dbText
                    .Size = 50
                    .AllowZeroLength = False
                    .Required = True
                End With
            Set fldPersoonVNaam = tdf.CreateField
                With fldPersoonVNaam
                    .Name = "PersoonVNaam"
                    .Type = dbText
                    .Size = 30
                    .AllowZeroLength = False
                    .Required = True
                End With
            Set fldPersoonGesl = tdf.CreateField
                With fldPersoonGesl
                    .Name = "PersoonGeslacht"
                    .Type = dbText
                    .Size = 1
                    .AllowZeroLength = False
                    .Required = True
                End With
            Set fldPersoonGebDat = tdf.CreateField
                With fldPersoonGebDat
                    .Name = "PersoonGebDat"
                    .Type = dbDate
                    .Required = False
                End With
            'nu moeten de velden toegevoegd worden aan de Fields collection van de TableDef
            tdf.Fields.Append fldIDPersoon
            tdf.Fields.Append fldPersoonNaam
            tdf.Fields.Append fldPersoonVNaam
            tdf.Fields.Append fldPersoonGesl
            tdf.Fields.Append fldPersoonGebDat
            
            'pas nu kan en moet de tabel toegevoegd worden aan de collectie van de TableDefs
            'dan moet de collectie van de TableDefs geactualiseerd worden zodat deze in een
            'meergebruikers omgeving onmiddellijk zichtbaar zou zijn
            
            
            dbLokaal.TableDefs.Append tdf
            dbLokaal.TableDefs.Refresh
            
            Application.RefreshDatabaseWindow
            
            fMaakTabel = True
            Set fldIDPersoon = Nothing
            Set fldPersoonNaam = Nothing
            Set fldPersoonVNaam = Nothing
            Set fldPersoonGesl = Nothing
            Set fldPersoonGebDat = Nothing
            Set tdf = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            
            End Function
            
Top

Datatypes Constanten.

  • dbByte
  • dbInteger
  • dbLong mogelijke attributen : dbAutoIncrField
  • dbSingle
  • dbDouble
  • dbCurrency
  • dbBoolean
  • dbDate
  • dbText
  • dbMemo mogelijke attributen : dbHyperlinkField + dbVariableField
Top

Indexes

Wij hebben reeds een tabel gecreëerd, maar zonder primaire sleutel, noch vreemde sleutel (foreign key), noch indexen. Uit de normalisatieleer weten wij dat iedere tabel een primaire sleutel moet hebben, en bij voorkeur ook geïndexeerde velden, vooral de velden waar op gezocht wordt.
Onderstaande code creëert een primaire sleutel voor het veld IDPersoon, en een index voor het veld PersoonNaam waarbij dubbele waarden toegelaten zijn.
Ook hier worden de indexen eerst in het geheugen gecreëerd en dan fysiek toegevoegd aan de tabel.

Function fToevoegenIndex() As Boolean
            Dim dbLokaal As DAO.Database
            Dim tdf As DAO.TableDef
            Dim idx As DAO.Index
            Dim strNaamTabel As String
            fToevoegenIndex = False
            strNaamTabel = "tblPersonen"
            
            Set dbLokaal = CurrentDb
            Set tdf = dbLokaal.TableDefs(strNaamTabel)
            'primaire sleutel aanmaken
            Set idx = tdf.CreateIndex("PrimaryKey")
                idx.Fields.Append idx.CreateField("IDPersoon")
                idx.Primary = True
                idx.Required = True
                idx.Unique = True
            'fysiek toevoegen
            tdf.Indexes.Append idx
            Set idx = Nothing
            'index aanmaken
            Set idx = tdf.CreateIndex("PersoonNaam")
                idx.Fields.Append idx.CreateField("PersoonNaam")
                idx.Required = True
                idx.Unique = False
            'fysiek toevoegen
            tdf.Indexes.Append idx
            
            tdf.Indexes.Refresh
            fToevoegenIndex = True
            Set tdf = Nothing
            Set idx = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing            
            End Function            
            
Top

Heeft een tabel een primaire sleutel ?

Function fBestaatPK(strNaamTabel As String) As String
            Dim dbLokaal As DAO.Database
            Dim tdf As DAO.TableDef
            Dim idx As DAO.Index
            Dim fld As DAO.Field
            Dim strResultaat As String

            strResultaat = ""
            Set dbLokaal = CurrentDb
            Set tdf = dbLokaal.TableDefs(strNaamTabel)
            'indien geen primaire sleutel wordt een fout gegenereerd
            
            On Error GoTo Verlaten
            Set idx = tdf.Indexes("primarykey")

                For Each fld In idx.Fields
                    strResultaat = strResultaat & "|" & fld.Name
                Next
            strResultaat = Right(strResultaat, Len(strResultaat) - 1)

                fBestaatPK = strResultaat
            Exit Function
            Verlaten:
                fBestaatPK = "Geen primaire sleutel"
            End Function
            
Top

Bestaat een tabel ?

Function fBestaatTabel(strTabel As String) As Boolean
            'Omschrijving : Deze functie gaat na indien een tabel
            'opgenomen is in de tabel collecties
            'Omschrijving : Deze functie gaat na indien een tabel
            'opgenomen is in de tabel collecties
            
            Dim intI As Integer
            Dim db As DAO.Database
            Dim tbf As TableDef
            fBestaatTabel = False
            Set db = CurrentDb()

                For intI = 0 To db.TableDefs.Count - 1
                    On Error Resume Next
                        If db.TableDefs(intI).Name = strTabel Then
                            fBestaatTabel = True
                        Exit For
                    End If
                Next intI
            End Function
            
Top

Veldnamen en hun type weergeven.

'voorzie eerst de volgende functie in een gewone module

            Function fVertaalVldtype(lngType As Long) As Variant
            Select Case lngType
                Case 1
                    fVertaalVldtype = lngType
                Case 2
                    fVertaalVldtype = "Byte"
                Case 3
                    fVertaalVldtype = "Integer"
                Case 4
                    fVertaalVldtype = "long integer"
                Case 5
                    fVertaalVldtype = lngType
                Case 6
                    fVertaalVldtype = "single"
                Case 7
                    fVertaalVldtype = lngType
                Case 8
                    fVertaalVldtype = "Date"
                Case 9
                    fVertaalVldtype = lngType
                Case 10
                    fVertaalVldtype = "text"
                Case Else
                    fVertaalVldtype = lngType
            End Select

            End Function

            

'en dan de routine -Sub sVeldNamen(strTabelNaam As String)-

            Sub sVeldNamen(strTabelNaam As String)
            Dim tblDef As DAO.TableDef
            Dim fld As DAO.Field
            Dim db As DAO.Database
            Set db = CurrentDb
            For Each tblDef In db.TableDefs
                If tblDef.Name = strTabelNaam Then

                    For Each fld In tblDef.Fields

                        Debug.Print fld.Name & " Type: " & fVertaalVldtype(fld.Type) & "

            Groote: " & fld.Size
                    Next
                End If
            Next
            End Sub
            
Top

Een tabel verwijderen.

Function fVerwijderTabel(strTabelNaam As String) As Boolean
            'best eerst controleren indien de tabel bestaat zie fBestaatTabel
            fVerwijderTabel = False
                If fBestaatTabel(strTabelNaam) = True Then
                    If MsgBox("Tabel " & strTabelNaam & " verwijderen", vbCritical + vbYesNo, "Tabel verwijdern...") = vbYes Then
                        DBEngine(0)(0).TableDefs.Delete strTabelNaam
                    End If
                End If
            Application.RefreshDatabaseWindow
            fVerwijderTabel = True
            End Function
            
Top
Begin