PDA

Vollständige Version anzeigen : DAO:Tabellen anhand von Templates erstellen


Karlo Karacho
20.06.2008, 11:27
Prozedur zum Erstellen von Tabellen anhand einer Templatetabelle, die die Definitionen enthält.
Die Prozedur erwartet im Template allerdings einige Angaben:
[ID] als Ordnungskriterium und Reihenfolge
[Feldname]
[F_Type] als Feldtyp (String, Integer, etc.
[F_len] als Feldlänge (nur für Felder vom Typ String
[Key] für die Erzeugung eines Index

Im Feld [Key] können die Werte 'k' (für Key) und 'f' (für Feld) vermerkt werden, obwohl die Prozedur nur auf 'k' reagiert.

Alle mit 'k' markierten Felder werden beim Erstellen der Zieltabelle zu einem eindeutigen Index gebündelt (clustered) sofern mehr als ein Key vorhanden ist. !! Access lässt aber nur max. 10 Felder für Bündelungen zu !!

Per Parameter lässt sich ein Autowertfeld mit anlegen, der dann zu einem Index wird, wenn kein anderes Feld im Template den Wert 'k' besitzt.

Viel Spaß
Karlo

==================================================

Sub CreateTab(NewTab, Template As String, AutoIdx As Boolean)
' Erstellen eine Tabelle mit Feldern anhand einer in einer Tabelle abgelegten Felddefinition.
' in NewTab wird der Name der neuen Tabelle übergeben
' in Template wird der Name der Parametertabelle übergeben
' in AutoIdx wird ein Flag übergeben, um ggf. ein Autoindexfeld zu erstellen (true)

Dim DB As Database
Dim T As TableDef
Dim F As Field
Dim IndexF As Field
Dim I As Index
Dim Muster, Keys As Recordset
Dim Feldname As Variant ' Feldname
Dim Feldlänge As Integer ' Feldlänge
Dim Feldtyp As Integer ' Feldtyp
Dim Schlüssel As Variant 'Key oder Feld
Dim AnzSchlüssel As Integer
Dim SQL As String ' Aus der Mustertabelle wird eine neue, damit die Sortorder eingehalten wird

Set DB = CurrentDb
Del_Table "t_Template"
Del_Table (NewTab)
SQL = "SELECT * INTO t_Template FROM [" & Template & "] ORDER BY " & " ID;"
DB.Execute SQL

' Anzahl der als Schlüssel vorgesehenen Felder feststellen
SQL = "SELECT Count([Key]) AS AnzSchlüssel FROM [" & Template & "] WHERE [Key] ='k';"
Set Keys = DB.OpenRecordset(SQL, dbOpenDynaset)
Keys.MoveFirst
AnzSchlüssel = Keys![AnzSchlüssel]
Keys.Close


Set Muster = DB.OpenRecordset("t_Template", dbOpenTable)
Set T = DB.CreateTableDef(NewTab)
If Muster.EOF = False Then
Muster.MoveFirst

' Feld für Autoindex als Autowert anlegen, falls gewollt
' Der Autoindex wird als Index definiert, wenn keine anderen Schlüssel vorhanden sind
If AutoIdx Then
Set F = T.CreateField("myIdx", 4) 'Indexfeld hinzufügen
F.Attributes = DB_AUTOINCRFIELD ' automatischer Index
T.Fields.Append F
If AnzSchlüssel = 0 Then ' wenn keine anderen Schlüssel definiert sind
Set I = T.CreateIndex("PrimaryKey")
I.Primary = True
Set IndexF = I.CreateField("myIdx")
I.Fields.Append IndexF
T.Indexes.Append I
End If
End If

' alle Felder anlegen
While Muster.EOF = False
Feldname = Muster![Feldname]
Feldtyp = Muster![F_Type]
Feldlänge = Muster![F_len]
If Feldtyp <> 10 Then ' Feld anlegen
Set F = T.CreateField(Feldname, Feldtyp)
Else ' für Textfelder wird die Länge angegeben
Set F = T.CreateField(Feldname, Feldtyp, Feldlänge)
End If
T.Fields.Append F
Muster.MoveNext
Wend
DB.TableDefs.Append T
End If 'alle Felder sind angelegt und der Tabelle zugeordnet

' Behandlung von Indices
If AnzSchlüssel > 0 Then
' nur die Records aus Mustertabelle, die einen Key haben sollen
SQL = "SELECT * FROM [" & Template & "] WHERE [Key] ='k' ORDER BY " & " ID;"
Set Keys = DB.OpenRecordset(SQL, dbOpenDynaset)
If AnzSchlüssel > 1 Then
Set I = T.CreateIndex("Tab_Index")
I.Clustered = True
I.Primary = True
End If
Keys.MoveFirst
While Keys.EOF = False
Feldname = Keys![Feldname]
Schlüssel = Keys![Key]
If Schlüssel = "k" Then ' Index hinufügen
Select Case AnzSchlüssel
Case 0
' keine Indices definieren, Autoindex wird oben behandelt
Case 1
' nur ein Key, also diesen als PrimaryKey erstellen
Set I = T.CreateIndex("PrimaryKey")
I.Primary = True
Set IndexF = I.CreateField(Feldname)
I.Fields.Append IndexF
Case Else
Set IndexF = I.CreateField(Feldname)
I.Fields.Append IndexF
'T.Indexes.Append I
End Select
End If ' von Indices erstellen
Keys.MoveNext
Wend
T.Indexes.Append I
Keys.Close
End If ' von überhaupt auf Schlüssel reagieren

Muster.Close
DB.Close
End Sub

===================================================

Sub Del_Table(Tabname As String)
' sorgt dafür, daß eine Tabelle gelöscht wird, wenn sie vorhanden ist
' ist die Tabelle nicht vorhanden, passiert nichts
' Tabname ist der Name der Tabelle

Dim obj As AccessObject
Dim dbs As Object
Dim TName As String
Dim Found As Boolean
Dim tabdef As TableDef 'Objektvariable Tabellendefinitionen zum Löschen von Tabellen
Set dbs = Application.CurrentData
Set DB = CurrentDb

For Each obj In dbs.AllTables
TName = obj.Name
If TName = Tabname Then
Found = True
Exit For
Else
Found = False
End If
Next obj

If Found = True Then
Set tabdef = DB.TableDefs(Tabname) 'Tabelle zuweisen
DB.TableDefs.Delete tabdef.Name 'Tabelle löschen
End If

End Sub