注册 登录
Office中国论坛/Access中国论坛 返回首页

5988143的个人空间 http://www.office-cn.net/?10050 [收藏] [复制] [分享] [RSS]

日志

Tables based on templates

已有 3206 次阅读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

发表评论 评论 (2 个评论)

回复 5988143 2009-2-12 14:42
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
回复 tanhong 2009-3-3 22:39
多谢汪兄分享!

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-19 10:32 , Processed in 0.059026 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部