فصل ۳۱ — ایجاد و تغییر ساختار Tableها
در حین اجرای Application ممکن است لازم شود Tableای بهصورت On-the-fly ساخته یا ساختار Table تغییر کند. برای مثال، هنگام Import از Text File اگر دادهٔ ورودی از ظرفیت Field جدول بزرگتر باشد، Truncate میشود و داده از دست میرود. همچنین ممکن است Table موقتی برای یک عملیات ساخته و سپس حذف شود. Propertyهای Field مانند Required یا Indexed نیز قابل تغییرند.
ایجاد Table
Sub CreateTable()
Dim MyTable As TableDef
Set MyTable = CurrentDb.CreateTableDef("NewTable")
MyTable.Fields.Append MyTable.CreateField("TextField", dbText, 100)
MyTable.Fields.Append MyTable.CreateField("LongIntegerField", dbLong)
MyTable.Fields.Append MyTable.CreateField("MemoField", dbMemo)
MyTable.Fields.Append MyTable.CreateField("YesNoField", dbBoolean)
MyTable.Fields.Append MyTable.CreateField("DateTimeField", dbDate)
MyTable.Fields.Append MyTable.CreateField("IntegerField", dbInteger)
MyTable.Fields.Append MyTable.CreateField("SingleNumberField", dbSingle)
MyTable.Fields.Append MyTable.CreateField("DoubleNumberField", dbDouble)
CurrentDb.TableDefs.Append MyTable
Application.RefreshDatabaseWindow
End Sub
TableDef جدید با نام NewTable ساخته میشود و Fieldها با CreateField و Append به Fields Collection اضافه میشوند. فقط TextField در مثال Size اختیاری 100 دارد؛ اگر Size حذف شود پیشفرض 255 Character است. در پایان TableDef به TableDefs Collection افزوده و Navigation pane Refresh میشود.
حذف Table یا Field
CurrentDb.TableDefs.Delete "NewTable"
CurrentDb.TableDefs("NewTable").Fields.Delete "TextField"
دستور دوم هم Field و هم تمام دادههای آن را حذف میکند. هیچ Warningی نمایش داده نمیشود، بنابراین خطر ازدستدادن داده وجود دارد.
ویرایش Propertyهای Field
CurrentDb.TableDefs("NewTable").Fields("MemoField").DefaultValue = "abc"
CurrentDb.TableDefs("NewTable").Fields("MemoField").Required = True
CurrentDb.TableDefs("NewTable").Fields("MemoField").AllowZeroLength = False
این دستورات DefaultValue را abc، Required را True و AllowZeroLength را False میکنند؛ Table نباید باز باشد.
ایجاد Index
Index روی Fieldهای کلیدی Queryها را سریعتر میکند، اما هرچه تعداد Indexed Field بیشتر باشد Insert رکورد کندتر میشود چون Indexها باید Update شوند.
CurrentDb.Execute "create index NewIndex on NewTable(TextField)"
CurrentDb.Execute ("drop index NewIndex on NewTable")
همچنین میتوان از Objectها استفاده کرد:
Sub CreateIndex()
Dim TDef As TableDef, Idx As Index
Dim db As Database
Set db = CurrentDb()
Set TDef = db.TableDefs("NewTable")
Set Idx = TDef.CreateIndex("MyIndex")
Idx.Fields.Append Idx.CreateField("LongIntegerField")
Idx.Primary = True
Idx.Required = True
Idx.Unique = True
TDef.Indexes.Append Idx
End Sub
در این روش باید Database Object ساخته شود و نمیتوان مستقیماً فقط از CurrentDb Object در تمام مراحل استفاده کرد. Field در Index ساخته میشود و به Field موجود Table اشاره میکند؛ خود Table Field تازهای دریافت نمیکند. Primary، Required و Unique روی True قرار میگیرند.
CurrentDb.TableDefs("NewTable").Indexes.Delete "MyIndex"
فصل ۳۲ — ایجاد فهرست موجودی اشیای Database
Applicationهای Access ممکن است صدها Table، Query، Form، Report و Module داشته باشند. Navigation pane نام آنها را نشان میدهد، اما برای دیدن DateCreated و DateModified باید هر شیء را جدا بررسی کرد. از Access 2007 به بعد Collectionهایی مانند AllTables امکان ساخت Inventory با VBA را فراهم میکنند.
Tableای به نام TblObjectInventory بسازید: ObjectName Text(255)، ObjectType Text(10)، DateCreated Date/Time، DateModified Date/Time؛ Primary Key لازم نیست.
Sub Inventory()
Dim Obj As AccessObject, Dbs As Object, RecSet As Recordset
CurrentDb.Execute "delete * from tblObjectInventory"
Set RecSet = CurrentDb.OpenRecordset("tblObjectInventory")
Set Dbs = Application.CurrentData
For Each Obj In Dbs.AllTables
RecSet.AddNew
RecSet!ObjectName = Obj.Name
RecSet!ObjectType = "Table"
RecSet!DateCreated = Obj.DateCreated
RecSet!DateModified = Obj.DateModified
RecSet.Update
Next Obj
For Each Obj In Dbs.AllQueries
RecSet.AddNew
RecSet!ObjectName = Obj.Name
RecSet!ObjectType = "Query"
RecSet!DateCreated = Obj.DateCreated
RecSet!DateModified = Obj.DateModified
RecSet.Update
Next Obj
For Each Obj In CurrentProject.AllForms
RecSet.AddNew
RecSet!ObjectName = Obj.Name
RecSet!ObjectType = "Form"
RecSet!DateCreated = Obj.DateCreated
RecSet!DateModified = Obj.DateModified
RecSet.Update
Next Obj
For Each Obj In CurrentProject.AllReports
RecSet.AddNew
RecSet!ObjectName = Obj.Name
RecSet!ObjectType = "Report"
RecSet!DateCreated = Obj.DateCreated
RecSet!DateModified = Obj.DateModified
RecSet.Update
Next Obj
For Each Obj In CurrentProject.AllMacros
RecSet.AddNew
RecSet!ObjectName = Obj.Name
RecSet!ObjectType = "Macro"
RecSet!DateCreated = Obj.DateCreated
RecSet!DateModified = Obj.DateModified
RecSet.Update
Next Obj
For Each Obj In CurrentProject.AllModules
RecSet.AddNew
RecSet!ObjectName = Obj.Name
RecSet!ObjectType = "Module"
RecSet!DateCreated = Obj.DateCreated
RecSet!DateModified = Obj.DateModified
RecSet.Update
Next Obj
Set Dbs = Nothing
Set Obj = Nothing
Set RecSet = Nothing
End Sub
جدول Inventory ابتدا پاک میشود، Dbs به Application.CurrentData اشاره میکند و سپس Collectionهای AllTables، AllQueries، AllForms، AllReports، AllMacros و AllModules پیمایش میشوند. برای هر Object نام، نوع، تاریخ ایجاد و آخرین تغییر ثبت میشود.
صفحهٔ پایانی این بخش در نسخهٔ اصلی عمداً خالی است.