|
|||||||
Объект индекса (DAO)
Время создания: 30.07.2019 00:02
Раздел: Разные закладки - VBA - Access - DAO
Запись: xintrea/mytetra_db_adgaver_new/master/base/1545888785neh4d94mjb/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
Область применения: Access 2013, Office 2013 Объект index указывает порядок записей, доступ к которым осуществляется из таблиц базы данных, а также сведения о том, принимаются ли повторяющиеся записи, что обеспечивает эффективный доступ к данным. Для внешних баз данных объекты index описывают индексы, установленные для внешних таблиц (только для рабочих областей Microsoft Access). Ядро СУБД Microsoft Access использует индексы при присоединении таблиц и создании объектов Recordset . Индексы определяют порядок, в котором объекты Recordset табличного типа возвращают записи, но не определяют порядок, в котором ядро СУБД Microsoft Access хранит записи в базовой таблице, или порядок, в котором любой другой тип набора записей объект возвращает записи. С помощью объекта index можно выполнять следующие действия:
Ядро СУБД Microsoft Access автоматически обслуживает все индексы базовых таблиц. Он обновляет индексы при каждом добавлении, изменении или удалении записей из базовой таблицы. Когда вы создадите базу данных, используйте метод CompactDatabase периодически для получения статистики индекса в актуальном состоянии. При доступе к объекту Recordset табличного типа необходимо указать порядок записей с помощью свойства index объекта. ПриСвойте этому свойству значение свойства Name существующего индекса в коллекции indexes . Эта коллекция находится в объекте tabledef , базовом объекте Recordset , который вы заполняете. Примечание Вам не нужно создавать индексы для таблицы, но для больших неиндексированных таблиц доступ к определенной записи или обработка соединений может занять длительное время. С другой стороны, наличие слишком большого количества индексов может замедлить обновление базы данных по мере уточнения каждого индекса таблицы. Свойство Attributes каждого объекта field в индексе определяет порядок возврата записей и, соответственно, определяет методы доступа, которые необходимо использовать для этого индекса. Каждый объект field в коллекции Fields объекта index является компонентом индекса. Чтобы определить новый объект index , задайте его свойства перед добавлением в коллекцию, сделав объект индекса доступным для последующего использования. Примечание Значение свойства Name существующего индекса можно изменить только в том случае, если значение свойства обновляемого объекта tabledef равно true. При задании первичного ключа для таблицы ядро СУБД Microsoft Access автоматически определяет его как первичный индекс. Первичный индекс состоит из одного или нескольких полей, которые уникально идентифицируют все записи в таблице в предварительно заданном порядке. Так как поле основного индекса должно быть уникальным, ядро СУБД Microsoft Access автоматически устанавливает значение trueдля свойства UNIQUE объекта основного индекса . Если первичный индекс состоит из нескольких полей, каждое поле может содержать повторяющиеся значения, но комбинация значений из всех индексированных полей должна быть уникальной. Первичный индекс состоит из ключа для таблицы и всегда состоит из тех же полей, что и первичный ключ. Важно! Убедитесь, что данные соответствуют атрибутам нового индекса. Если для индекса требуются уникальные значения, убедитесь, что в существующих записях данных нет дубликатов. Если дубликаты существуют, ядро СУБД Microsoft Access не может создать индекс; При попытке использовать метод Append для нового индекса возникает перехватываемая ошибка. При создании связи, которая применяет целостность ссылок, ядро СУБД Microsoft Access автоматически создает индекс с внешним свойством, установленным в качестве внешнего ключа в ссылающейся таблице. После установления связи таблицы ядро СУБД Microsoft Access предотвращает добавление или изменение базы данных, которая нарушает эту связь. Если задать для свойства Attributes объекта relation разрешение каскадных обновлений и каскадных удаленИй, ядро СУБД Microsoft Access обновляет или удаляет записи в связанных таблицах автоматически.
Примечание Свойство Clustered игнорируется для баз данных, использующих ядро СУБД Microsoft Access, которое не поддерживает кластеризованные индексы. В этом примере создается новый объект index , который добавляется в коллекцию indexes для Employees tabledef, а затем перечисляет коллекцию indexes объекта tabledef. Наконец, он перечисляет набор записей, сначала используя первичный индекс, а затем с помощью нового индекса. Для выполнения этой процедуры требуется процедура Индексаутпут. Sub IndexObjectX()
Dim dbsNorthwind As Database Dim tdfEmployees As TableDef Dim idxNew As Index Dim idxLoop As Index Dim rstEmployees As Recordset
Set dbsNorthwind = OpenDatabase("Northwind.mdb") Set tdfEmployees = dbsNorthwind!Employees
With tdfEmployees ' Create new index, create and append Field ' objects to its Fields collection. Set idxNew = .CreateIndex("NewIndex")
With idxNew .Fields.Append .CreateField("Country") .Fields.Append .CreateField("LastName") .Fields.Append .CreateField("FirstName") End With
' Add new Index object to the Indexes collection ' of the Employees table collection. .Indexes.Append idxNew .Indexes.Refresh
Debug.Print .Indexes.Count & " Indexes in " & _ .Name & " TableDef"
' Enumerate Indexes collection of Employees ' table. For Each idxLoop In .Indexes Debug.Print " " & idxLoop.Name Next idxLoop
Set rstEmployees = _ dbsNorthwind.OpenRecordset("Employees")
' Print report using old and new indexes. IndexOutput rstEmployees, "PrimaryKey" IndexOutput rstEmployees, idxNew.Name rstEmployees.Close
' Delete new Index because this is a ' demonstration. .Indexes.Delete idxNew.Name End With
dbsNorthwind.Close
End Sub
Sub IndexOutput(rstTemp As Recordset, _ strIndex As String) ' Report function for FieldX.
With rstTemp ' Set the index. .Index = strIndex .MoveFirst Debug.Print "Recordset = " & .Name & _ ", Index = " & .Index Debug.Print " EmployeeID - Country - Name"
' Enumerate the recordset using the specified ' index. Do While Not .EOF Debug.Print " " & !EmployeeID & " - " & _ !Country & " - " & !LastName & ", " & !FirstName .MoveNext Loop
End With
End Sub
В этом примере используется метод креатеиндекс для создания двух новых объектов индекса , а затем они добавляются в коллекцию indexes объекта Employees tabledef . Затем выполняется перечисление **** коллекции индексов объекта tabledef , коллекции Fields новых объектов index и коллекции свойств новых объектов index . Для выполнения этой процедуры требуется функция Креатеиндексаутпут. VB Sub CreateIndexX()
Dim dbsNorthwind As Database Dim tdfEmployees As TableDef Dim idxCountry As Index Dim idxFirstName As Index Dim idxLoop As Index
Set dbsNorthwind = OpenDatabase("Northwind.mdb") Set tdfEmployees = dbsNorthwind!Employees
With tdfEmployees ' Create first Index object, create and append Field ' objects to the Index object, and then append the ' Index object to the Indexes collection of the ' TableDef. Set idxCountry = .CreateIndex("CountryIndex") With idxCountry .Fields.Append .CreateField("Country") .Fields.Append .CreateField("LastName") .Fields.Append .CreateField("FirstName") End With .Indexes.Append idxCountry
' Create second Index object, create and append Field ' objects to the Index object, and then append the ' Index object to the Indexes collection of the ' TableDef. Set idxFirstName = .CreateIndex With idxFirstName .Name = "FirstNameIndex" .Fields.Append .CreateField("FirstName") .Fields.Append .CreateField("LastName") End With .Indexes.Append idxFirstName
' Refresh collection so that you can access new Index ' objects. .Indexes.Refresh
Debug.Print .Indexes.Count & " Indexes in " & _ .Name & " TableDef"
' Enumerate Indexes collection. For Each idxLoop In .Indexes Debug.Print " " & idxLoop.Name Next idxLoop
' Print report. CreateIndexOutput idxCountry CreateIndexOutput idxFirstName
' Delete new Index objects because this is a ' demonstration. .Indexes.Delete idxCountry.Name .Indexes.Delete idxFirstName.Name End With
dbsNorthwind.Close
End Sub
Function CreateIndexOutput(idxTemp As Index)
Dim fldLoop As Field Dim prpLoop As Property
With idxTemp ' Enumerate Fields collection of Index object. Debug.Print "Fields in " & .Name For Each fldLoop In .Fields Debug.Print " " & fldLoop.Name Next fldLoop
' Enumerate Properties collection of Index object. Debug.Print "Properties of " & .Name For Each prpLoop In .Properties Debug.Print " " & prpLoop.Name & " - " & _ IIf(prpLoop = "", "[empty]", prpLoop) Next prpLoop End With
End Function
|
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|