Лекция 3: 2 Для создания возможности использования объектов файловой системы нужно подключить библиотеку DLL, содержащую эти объекты: меню Разработать > Ccылки > Microsoft Scriptlet Component (сделать щелчок на соответствующем элементе управления CheckBox). Не могу найти меню Разработать (Develop)>Links и т.д. |
Базы данных
MSНFlexGrid и MSFlexGrid - элементы управления для отображения и оперирования данными в табличном формате
Элемент управления MSFlexGrid, выводимый на форму при работах с базами данных, представляет собой cетку строк и столбцов. MSFlexGrid поддерживает следующие функции:
- чтение данных, если элементу MSFlexGrid назначен элемент управления данными; связывание данных для чтения,
- динамическая перестановка столбцов и строк; автоматическая перегруппировка данных при упорядочении столбцов,
- адаптация к существующему программному коду для связанного элемента управления DataGrid,
- управление помещением в ячейку текста/графики; перенос текста в ячейках.
Вывод MSFlexGrid на панель элементов управления: меню Проект (Project) Компоненты (Components) Microsoft FlexGrid 6.0.
Свойство Rows таблицы, выводимой на форму при использовании MSFlexGrid, можно использовать для задания количества строк в таблице, а свойство Cols - для задания количества столбцов. На рис. 4.4 представлена сетка MSFlexGrid. В качестве первого индекса ячейки используется номер строки, в качестве второго - номер столбца. Например, ячейка в левом верхнем углу таблицы имеет адрес 0, 0. Чтобы поместить данные в ячейку таблицы MSFlexGrid, нужно использовать свойство TextMatrix и задать координаты ячейки.
Пример 1: поместить слово "элемент" в ячейку (2, 1): MSFIexGridl.TextMatrix (2,1) = "элемент"
Пример 2: ввести число 3000 в ячейку (5, 2): MSFIexGridl.TextMatrix (5,2) = 3000
MSFlexGrid обеспечивает множество стандартных стилей форматирования ячеек. Если при работе нужно добавить новые строки в таблицу, то используется метод Addltem.
MSHFIexGrid - Microsoft Hierarchical FlexGrid - иерархическая гибкая таблица поддерживает по сравнению с MSFIexGrid множество дополнительных функций:
- ActiveX Data Binding - привязывание данных ActiveX, когда свойства DataSource и DataMember элемента управления связаны с поставщиком данных,
- связывание через Data Binding Manager - Диспетчер связывания данных в Visual Basic,
- привязывание непосредственно к сгруппированным и связанным наборам записей ADO ( ADO RecordSet ) из иерархии Command (Управление),
- создание отображений сгруппированных и связанных наборов RecordSet.
Практическая работа 28. MSFIexGrid
- Создать базу данных ACCESS с таблицами, например, student (см. табл. 4.7) и др, сохранить в файле stud.mdb; впоследствие это имя выбирается в стандартном диалоговом окне Open,
- создать на форме объекты (см. рис. 4.4 и код, данный ниже):
- MSFlexGrid (см. выше),
- CommonDialоg: Проект Компоненты Управление Microsoft CommonDialog Control,
- CommandButton (Name = Command1),
- Data (Name = Data1, Connect = Accеss),
- ComboBox (Name = Combo1, Style = 0), см. 10.1,
- TеxtBox (Name = Text1),
- ввести код, данный ниже, пояснения даны под комментариями:
Private Sub Command1_Click() Dim i As Integer ' очистить свойство объекта CommonDialog, содержащее ' имя базы данных CommonDialog1.FileName = "" ' стартовать CommonDialog CommonDialog1.Action = 1 ' выводится стандартное диалоговое окно Open; ' нужно выбрать требуемую базу данных. ' связать объект Data1 с файлом базы данных, выбранным с ' помощью элемента управления CommonDialog1 Data1.DatabaseName = CommonDialog1.FileName ' обновить содержимое элемента управления Data1 Data1.Refresh ' читать в цикле имена таблиц базы данных и занести ' их в ComboBox (AddItem) For i = 0 To Data1.Database.TableDefs.Count - 1 ' свойство Count определяет количестко элементов Combo1.AddItem (Data1.Database.TableDefs(i).Name) Next i ' после добавления имeн таблиц в ComboBox очистить теку- ' щее значение свойства Text Combo1.Text = "" ' введeнный в текстовое поле строку SQL присвоить ' свойству RecordSource элемента Data1 Data1.RecordSource = Text1.Text ' обновить содержимое Data1. Реализуется запрос, т.к ' свойству RecordSource присвоено значение строки SQL Data1.Refresh ' оставшаяся часть кода может быть заменена ' следующим оператором присваивания: ' MSFlexGrid1.DataSource = Data1 в Окне свойств. Эта ' часть кода нужна лишь для того чтобы пользователь мог ' освоить работу с ячейками MSFlexGrid. ' Свойство MSFlexGrid1.Cols - характеризует количество ' столбцов в сетке; Data1.Recordset.Fields.Count - количество ' столбцов таблицы базы данных, к которой сделан ' SQL-запрос MSFlexGrid1.Cols = Data1.Recordset.Fields.Count ' MSFlexGrid1.Rows - количество строк в сетке ' установить равным 1 MSFlexGrid1.Rows = 1 ' в элементе управления MSFlexGrid1 доступ к строкам и ' столбцам проводится начиная с ячейки (0,0), ' свойство TextMatrix(X, Y) позволяет получить доступ ' к отдельным ячейкам таблицы For i = 0 To Data1.Recordset.Fields.Count - 1 ' занести название имeн полей таблицы базы данных в ' первую строку MSFlexGrid1 MSFlexGrid1.TextMatrix(0, i) = Data1.Recordset.Fields(i).Name Next i ' проверить, является ли запись в таблице (строка) по- ' следней; организовать цикл прохода по строкам Do While Not Data1.Recordset.EOF ' увеличить количество строк в MSFlexGrid на единицу MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1 ' цикл переноса данных из Data1 в MSFlexGrid1 For i = 0 To Data1.Recordset.Fields.Count - 1 ' перенос данных данной строки (по полям). Если данные в ' ячейке Data1 имеются, то перенести их в ' таблицу MSFlexGrid1 If Not Data1.Recordset.Fields(i) = "" Then MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, i) = Data1.Recordset.Fields(i) End If ' конец цикла переноса данных из элемента управления Data1 ' в таблицу MSFlexGrid1 для одной строки Next i ' использовать метод MoveNext - переход к ' следующей строке Data1.Recordset.MoveNext Loop End Sub
- стартовать проект, ввести в текстовое поле SQL-строку (запрос) SELECT * FROM student, сделать щелчок на командной кнопке, в выведенном стандартном диалоговом окне Open выбрать базу данных stud.mdb. В таблицу MSFlexGrid выводятся результаты запроса. Одновременно в список элемента управления ComboBox выводятся имена всех имеющихся таблиц, рис. 4.4.
- выбрать таблицу в списке ComboBox, изменить запрос - ввести новый запрос для другой таблицы (ввести этот запрос в текстовое поле), сделать щелчок на командной кнопке, наблюдать результат.
Репликация и синхронизация баз данных
Реплицировать означает тиражировать. Если учреждение располагает сетью, тогда целесообразно иметь основную копию базы данных (главная реплика) в главном подразделении фирмы и несколько еe копий (реплик) в других помещениях/на других территориях. Пользователи баз данных на других территориях в процессе работы (например, в результате реализации/приобретения изделий, перечень которых содержит база данных) делают изменения таблиц в своих копиях (репликах). Позднее (периодически) каждый должен внести им сделанные изменения в главную реплику и получить информацию об изменениях, сделанных другими пользователями. Это процесс синхронизации - приведение репликационного набора в состояние, когда реплики одинаковы.
Пусть имеется база данных sabi.mdb c несколькими таблицами . Превратим sabi.mdb в главную реплику. Создадим на дисковом устройстве С: каталог rep, который будем использовать для проекта. Сначала нужно просмотреть базу данных в приложении Visdata: меню Добавления Визуальный менеджер данных (Visual Data Manager) Файл Открыть базу данных Microsoft Access в выведенном списке выбрать файл sabi.mdb. В окно приложения выводится список таблиц базы данных. Существуют также системные таблицы; для их вывода на экран использовать команду: Utility Preferences Include System Tables. Представляет особый интерес объект Properties - свойства исходной базы данных: Name = C:\ : sabi.mdb, Connect*,: .
Практическая работа 29. Репликация и синхронизация баз данных
Для приобретения навыков репликации и синхронизации нужно выполнить несколько этапов:
- сделать ссылку на библиотеку Microsoft Jet and Replication Objects 2.1 Library (меню Проект Ссылки библиотека OK) и библиотеку, обеспечивающую работу с DAO: Microsoft DAO 3,54 Objects Library,
- создать главную реплику ( Command1_Click (), см. ниже):
- открыть базу данных,
- создать свойство Replicable и присвоить ему значение "Т",
- cоздать копию главной реплики ( Command2_Click (), см. ниже):
- открыть базу данных,
- использовать метод MakeReplica,
- внести изменения в главную реплику и еe копию:
- внести изменение в 1-ой записи главной реплики и копии,
- зафиксировать изменение значения поля s_Generation (см. ниже) при изменении содержимого таблиц; там появятся нули вместо единиц и соответствующая запись будет позднее скопирована при выполении процедуры синхронизации,
- выполнение синхронизации - копирование изменений главной реплики в реплику и наоборот ( Command3_Click (), см. ниже):
- открыть базу данных,
- использовать метод Cynchronize объекта Database.
Последовательность действий:
- ввести код процедур Command1_Click () и Command2_Click (), см. ниже,
- стартовать первую процедуру (создание главной реплики),
- после остановки выполнения проекта открыть базу данных (главную реплику) в приложении Visdata, найти добавленные поля каждой таблицы: в каждую таблицу главной реплики добавлены 3 поля:
- s_Generation, идентифицирующее записи, которые были изменены Вами/сотрудниками учреждения. После изменения записей, содержимое поля меняется с 1 на 0 (сначала везде была 1) и в процессе синхронизации, т.е. позднее, пересылаются только записи, которым соответствует значение поля 0,
- s_GUID, содержащее идентификатор каждой записи,
- s_Lineage, хранящее количество изменений записи.
Пояснения: после создания главной реплики в главной реплике появились новые системные таблицы, появились дополнительные свойства главной реплики. Свойство Replicable (установлено в Т) означает, что для базы данных можно создавать реплики. После создания главной реплики появились новые свойства любой таблицы главной реплики.
- стартовать вторую процедуру (создание реплики),
- после остановки выполнения проекта просмотреть базу данных в приложении Visdata (в базе данных содержатся те же самые таблицы),
- открыть таблицу MSysReplicas, содержащую информацию о каждом члене репликационного набора, где появилась вторая запись из-за создания реплики (ранее была только одна запись),
- поочерeдно открыть базы данных (главную реплику и реплику) в любом приложении, предназначенном для работы с базами данных и сделать изменения в одной записи какой-либо таблицы. Наблюдать изменения поля s_Generation - появление чисел 0 вместо 1 после внесения изменений Вами/сотрудниками учреждения в записи таблиц главной реплики и реплики,
- создать и стартовать процедуру Command3_Click (), см. код ниже,
- после остановки выполнения проекта загрузить реплику в приложение Visdata, просмотреть содержимое соответствующей таблицы (в этой таблице появились изменения, сделанные ране в главной реплике) и значения поля s_Generation: в процессе синхронизации значение поля увеличивается на 1 при каждом изменении записи.
В тех случаях, когда в разных репликах изменяется одна и та же запись несkолько раз, то в итоге в процессе синхронизации копируются данные той реплики, которая изменила запись большее число раз. В случае равенства числа изменений Microsoft Jet выбирает запись из таблицы с наименьшим значением ReplicaID,
- cделать изменения в реплике 1 раз, в главной реплике - 2 раза. Сделать щелчок на третьей командной кнопке, затем проверить результат синхронизации.
Private Sub Command1_Click() ' создание главной реплики Dim dbHaupt As Database, replicaProp As Property ' открыть базу Set dbHaupt = OpenDatabase("C:\rep\sabi.mdb", True) ' создать свойство Replicable Set replicaProp = dbHaupt.CreateProperty("Replicable", dbText, "T") dbHaupt.Properties.Append replicaProp ' добавить свойство ' свойству присвоить значение True dbHaupt.Properties("Replicable") = "T" End Sub Private Sub Command2_Click() ' создание реплики Dim dbHaupt As Database ' открыть базу Set dbHaupt = OpenDatabase("C:\rep\sabi.mdb", True) 'создать новый объект репликационного набора dbHaupt.MakeReplica "C:\rep\sabicopy.mdb", "Replica of " & "dbHaupt" dbHaupt.Close End Sub Private Sub Command3_Click() ' процесс синхронизации Dim dbHaupt As Database ' открыть базу данных - главную реплику Set dbHaup = OpenDatabase("C:\rep\sabi.mdb", True) ' копирование изменений dbHaupt.Synchronize "C:\rep\sabicopy.mdb" End Sub