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