Tables based on templates
已有 3288 次阅读2009-2-12 14:42
|
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