Конспект лекций_Администрирование БД. Теоретические основы баз данных
Скачать 0.98 Mb.
|
Программирование в VBA (Visual Basic for Application)Основу объектно-ориентированного программирования составляет работа с объектами, в качестве которых рассматриваются любые программируемые элементы. Основными объектами в Access являются таблицы, формы, запросы, отчёты, модули и макросы. Они строятся на основе мелких объектов – элементов управления, которые объединяются в более крупные объекты – семейства (наборы однотипных объектов). Все объекты имеют сохраняемый набор свойств, изменяя которые можно управлять объектом. Для каждого объекта имеется ряд методов – исполняемых инструкций. Основные иерархические структуры объектов, используемые в Access: Модель объектов доступа к данным (Data Access Object – DAO) обеспечивает объектно-ориентированный интерфейс для работы с ядром базы данных Jet. А именно – доступ и обработку данных в базах данных, управление базами данных и их объектами с помощью свойств и методов, а также создание новых объектов и изменение структуры базы данных. Модель объектов ActiveX Data Objects – ADO используется для работы с формами, отчётами и модулями выполняющегося приложения Access, объектами других приложений, их свойствами и методами, а также для управления текущим сеансом работы в Access и создания интерфейса приложения. Основой для программирования являются события, которые обрабатываются процедурами обработки событий. Процедуры, входящие в состав приложения, хранятся в модулях в базе данных. Однако запросить выполнение модуля в целом невозможно. Выполняться могут только процедуры, содержащиеся в модулях. Модули предназначены для удобного объединения процедур по их функциональному назначению или привязке к форме или отчёту. Процедуры обработки событий можно создать для каждого события каждого элемента формы или отчёта и каждого из возможных событий самой формы или отчёта. Событие может быть вызвано системой, программой или действиями пользователя. Типы переменных:Синтаксис. Dim переменная As тип Тип данных Boolean (Bool) может принимать два значения — True (истина) и False (ложь). Этот тип данных присваивается переменным, задействованным в качестве флажков для обозначения состояния объектов. Также этот тип присваивается функциям, которые возвращают значение, сообщающее об успешном или неудачном выполнении какого-то действия. Численная переменная, не равная нулю, считается True; равная нулю — False. При конвертировании переменной типа Boolean в численную переменную возвращается значение -1, если переменная типа Boolean имела значение True, и 0— если False. Переменная типа дата/время представляет собой 64-разрядное число и может принимать значения даты от 1 января 100 года до 31 декабря 9999 года или значения времени от 0:00:00 до 23:59:59. Значения даты можно обозначать с помощью символа #, например #20/10/96#. Для преобразования даты используется функция Cdate: dtDate = CDate("20 October 1995") Функция Day (число) после передачи ей даты возвращает число в диапазоне 1—31. Функция Month (месяц) выделяет из даты значение месяца— от 1 до 12. Функция Year (год) возвращает из переданной даты год. Значение Null. MyVar = "" MyCheck = IsNull(MyVar) ' Returns False. MyVar = Null MyCheck = IsNull(MyVar) ' Returns True. МассивыDim MyArray(10, 10,10) As Integer Dim sngMulti(1 To 5, 1 To 10) As Single Dim sngArray() As Single ‘создан динамический массив Dim varData(3) As Variant varData(0) = "Claudia Bendel" varData(1) = "4242 Maple Blvd" varData(2) = 38 varData(3) = Format("06-09-1952", "General Date") Другой способ объявления массивов: Dim A As Variant A = Array(10,20,30) Присвоение массива переменной типа Variant позволяет изменять размерность массива. ОбъектыDim SmithBillBD As Object Visual Basic поддерживает объект Collection (коллекция или семейство элементов), который служит для хранения элементов любых типов данных. Вы можете использовать семейство точно так же, как массив – для хранения целых чисел, цепочек символов и других типов данных. Объект Collection содержит методы для включения, удаления и контроля элементов в семействе. Dim AppObjects As New Col lection Чтобы добавить AppObject в семейство, воспользуйтесь методом Add для объекта Collection. В объекте семейства предусмотрен метод Item, который служит для адресации элементов семейства. Чтобы удалить элемент из семейства, используйте метод Remove. ДоступностьКлючевые слова Private и Public определяют доступность переменных и процедур. Использование Dim для объявления переменной на уровне модуля означает, что переменная доступна всем процедурам в этом модуле, но недоступна вне его. Замена Dim ключевым словом Private не отразится на доступности переменной; переменная будет доступна только процедурам модуля. Однако если заменить Dim на ключевое слово Public, то переменная будет доступна для всех модулей приложения. Процедуры и функции, которые добавляются в модуль, являются Publiс по умолчанию; они доступны всем модулям приложения. События процедур в модулях Form и Report являются Private по умолчанию, поэтому они доступны только модулю, в котором содержатся. Обработка ошибокЧтобы установить системное прерывание по обнаружению ошибки, поместите оператор On Error туда, где вы хотите активизировать это системное прерывание. Sub CausesAnError() ' Direct procedure flow. On Error GoTo ErrorHandler ' Raise division by zero error. Err.Raise 11 Exit Sub ErrorHandler: ' Display error information. MsgBox "Error number " & Err.Number & ": " & Err.Description EndSub Другая форма оператора On Error Resume Next передает управление оператору, следующему за оператором с ошибкой. Этот оператор приводится ниже. Publ ic Function MyFunctionO On Error Resume Next If Err Then ‘обработка End If Exit Function Resume возвращает управление программой оператору, вызвавшему ошибку, и пытается выполнить его снова. Если это приводит к повторной ошибке, то программа обработки ошибок сработает снова. Если вы используете оператор Resume, то лучше применить счетчик возникновения ошибки. По достижении некоторого предела счетчика следует выйти из процедуры. Resume Next передает управление оператору, следующему за оператором, приведшим к ошибке. Вы можете использовать этот прием только в том случае, если уверены, что ошибка — не критическая и может быть проигнорирована, или если ваш обработчик ошибок откорректирует ситуацию, вызвавшую ошибку. Ветвления и циклы
Параметры процедур и функций.Объявление: Sub CalcFee(AcctTotal As Currency, ContractMonths As Integer) Вызов: CalcFeeA, 24 Вы можете использовать ключевое слово Optional в определении процедуры или функции для указания того, что данный аргумент является необязательным. Необязательные (Optional) аргументы должны иметь тип Variant. Sub CalcFee(AcctTotal As Currency, Optional ContractMonths As Variant) Чтобы создать процедуру для работы с массивом аргументов, в объявлении процедуры используйте аргумент ParamArray, причем не определяя размера массива. Public Function Calc_Order(ParamArray Сosts As Variant) As Currency Простейшие программы на VBAОбработка событий с помощью методов объекта DoCmd. DoCmd.OpenForm “Студенты” Другие методы этой команды: Beep Close – закрывает указанное окно Microsoft Access или текущее окно (по умолчанию). FindNext – находит следующую запись, удовлетворяющую условиям, указанным в предыдущей макрокоманде «НайтиЗапись» (FindRecord) или в диалоговом окне Поиск в поле, открывающемся командой Найти из меню Правка. FindRecord – находит данные, удовлетворяющие условиям поиска, указанным с помощью аргументов этой макрокоманды. Данные могут быть в текущей записи, в следующей, предыдущей или в самой первой записи. GoToControl – переводит фокус на указанное поле или элемент управления в текущей записи открытой формы, формы в режиме таблицы, таблицы в режиме таблицы или запроса в режиме таблицы GoToRecord – делает указанную запись текущей записью открытой таблицы, формы или результирующего набора записей запроса. Maximize Minimize OpenDiagram – используется в проекте Microsoft Access для открытия схемы базы данных в режиме конструктора OpenQuery OpenReport OpenTable Quit RunSQL Задание свойств форм, отчетов и элементов управления в Visual BasicОбъекты Form, Report и Control являются объектами Microsoft Access. Свойства таких объектов можно задавать в процедурах Sub, Function или в процедурах обработки событий. Можно также задавать свойства разделов форм и отчетов. Чтобы задать свойство формы или отчетаУкажите ссылку на конкретную форму или отчет в семействе Forms или Reports, за которой следуют имя свойства и его значение. Например, следующая программная строка задает для свойства Вывод на экран (Visible) формы «Customers» значение True (–1): Forms!Customers.Visible = True Свойства формы и отчета можно также задавать из модуля объекта с помощью свойства объекта Me. Программы, использующие свойство Me, выполняются быстрее, чем программы, использующие полные имена объектов. Например, следующая программная строка в модуле формы «Customers» определяет свойство Источник записей (RecordSource) формы «Customers» через инструкцию SQL, возвращающую все записи, в которых значение поля «CompanyName» начинается с «A»: Me!RecordSource = "SELECT * FROM Customers " _ & "WHERE CompanyName Like 'A*'" Чтобы задать свойство элемента управленияУкажите ссылку на элемент управления в семействе Controls объекта Form или Report, в котором он находится. На семейство Controls можно ссылаться явно или неявно, но программа выполняется быстрее при использовании неявных ссылок. В следующих примерах задается свойство Вывод на экран (Visible) поля «CustomerID» в форме «Customers»: ' Faster method. Me!CustomerID.Visible = True ' Slower method. Forms!Customers.Controls!CustomerID.Visible = True Быстрее всего можно задать свойство элемента управления из модуля объекта с помощью свойства объекта Me. Например, следующая программа изменяет значение свойства Вывод на экран (Visible) поля «CustomerID» в форме «Customers»: With Me!CustomerID .Visible = Not .Visible End With Чтобы задать свойство раздела формы или отчетаУкажите ссылку на форму или отчет в семействе Forms или Reports, за которой следует свойство Section и целое значение или константа, определяющая раздел. В следующем примере задается значение False для свойства Вывод на экран (Visible) верхнего колонтитула формы «Customers»: Forms!Customers.Section(3).Visible = False Me!Section(acPageHeader).Visible = False Примечания В справке по предметному указателю можно найти следующие сведения о каждом свойстве: допускается ли задание этого свойства в программе Visual Basic; режимы, в которых можно задавать свойство. Не все свойства можно задавать во всех режимах. Например, свойство формы Тип границы (BorderStyle) можно задавать только в режиме конструктора формы; какие значения следует использовать для задания свойства. Часто значения некоторых свойств в программе Visual Basic, отличаются от значений, выбираемых в окне свойств. Например, если значение свойства выбирается из списка, необходимо использовать это значение или его числовой эквивалент. Чтобы задать в программе Visual Basic стандартные значения свойств для элементов управления, следует использовать метод DefaultControl. DAO.Объекты доступа к данным DAO (Data Access Objects) позволяют управлять структурой базы данных и содержащимися в ней данными из программ Visual Basic. Многие объекты ADO соответствуют объектам, которые можно видеть в базе данных — например, объект TableDef соответствует таблице Microsoft Access. Объект Field соответствует полю в таблице. Большая часть свойств объектов DAO является свойствами DAO. Эти свойства определены в ядре базы данных Microsoft Jet и задаются тем же способом, как и в других приложениях, включающих ядро Jet. Некоторые свойства, которые можно задать для объектов DAO, определяются в Microsoft Access, а затем автоматически распознаются ядром базы данных Jet. Способ задания свойств объектов DAO зависит от того, где определено свойство, в ядре базы данных Jet или в Microsoft Access. `Общение с JET через объекты данных Access.
Каждый объект в иерархии DAO имеет одно или более свойств, которые описывают его поведение и атрибуты. Каждое из этих свойств само является объектом в семействе Properties родительского объекта. Например, объект TableDef имеет такие свойства, как Name, Updatable и DateCreated. Доступ к свойству Name можно получить следующим образом: MyTableDef.Name Кроме того, на свойство Name можно сослаться, используя семейство Properties объекта TableDef: MyTableDef.Properties("Name") Использование объекта TableDefОбъект TableDef описывает каждую физически хранящуюся в базе данных таблицу. Объект TableDef описывает поля в физической таблице, идентифицирует индексы таблицы и фиксирует свойства, имеющие отношение к этой таблице. .RecordCount указывает число записей в таблице. Если в таблице записей нет, то его значение равно нулю. Для присоединенных таблиц значение этого свойства равно -1. .Attributes указывает на характеристики таблицы. Вы можете установить его, когда строите свою таблицу, но после добавления TableDef к семейству TableDefs свойство может быть только прочитано. Dim dbsNorthwind As Database Dim fldLoop As Field Set dbsNorthwind = OpenDatabase("Northwind.mdb") With dbsNorthwind For Each fldLoop In .TableDefs(0).Fields Debug.Print " " & fldLoop.Name & " = " & fldLoop.Attributes Next fldLoop .Close End With .CreateField служит для создания нового поля; новое поле содержит номер, характеризующий объект в семействе. После того как поле будет создано, метод Append семейства Fields добавляет его к TableDef. Dim dbsNorthwind As Database Dim tdfNew As TableDef Dim fldLoop As Field Set dbsNorthwind = OpenDatabase("Northwind.mdb") Set tdfNew = dbsNorthwind.CreateTableDef("NewTableDef") With tdfNew .Fields.Append .CreateField("TextField", dbText) .Fields.Append .CreateField("IntegerField", dbInteger) .Fields.Append .CreateField("DateField", dbDate) End With dbsNorthwind.TableDefs.Append tdfNew Использование объекта RecordsetRecordset — это объект, который используется для выполнения операций с записями. Семейство Recordsets содержит все открытые объекты Recordset в открытой базе данных. При закрытии объекта Recordset он удаляется из памяти и из семейства Recordsets. Объекты Database, TableDef и QueryDef включает метод OpenRecordset. Recordset можно открыть, указав в методе OpenRecordset объекта Database название соответствующей таблицы или воспользовавшись методом OpenRecordset объекта TableDef: Dim dbsNorthwind As Database Dim rstEmployees As Recordset Set dbsNorthwind = OpenDatabase("Northwind.mdb") Set rstEmployees = dbsNorthwind.OpenRecordset( "Employees", dbOpenDynaset) После открытия объекта Recordset необходимо определить, какие записи доступны. Если в Recordset нет ни одной записи, то его свойства BOF (Beginning Of File — начало файла) и EOF (End Of File — конец файла) установлены в True. Если EOF установлено в False, то Recordset имеет хотя бы одну запись. Если записи существуют, то при открытии Recordset будет выполнено позиционирование на первой записи. Используя метод Move, можно построить цикл, обращающийся к каждой следующей записи в объекте Recordset. Метод MoveLast используется для позиционирования к последней записи Recordset. Для перемещения к предыдущей записи используется метод MovePrevious, пока свойство BOF не будет установлено в True. Метод MoveFirst может быть использован для позиционирования к первой записи. Метод Edit информирует Jet о том, что в текущей записи происходят изменения. При использовании метода Update сделанные изменения вносятся в таблицу. Для добавления записей используйте метод AddNew. Этот метод применяется в комплексе с методом Edit при добавлении новых записей. Как и в случае с методом Edit, записи будут присоединены к таблице после применения метода Update. Для удаления текущей записи используйте метод Delete. После того как обработка объекта Recordset будет завершена, закройте его, воспользовавшись методом Close. Этот метод удаляет объект Recordset из семейства Recordsets и делает объект Recordset недействительным. Примеры использования методов DAOSub Find() '-------------------------------------------------------- ' Поиск записей в таблице "tblPeoples" ' Будем искать записи, у которых в поле LastName ' находиться значение "Иванова" ' и печатать в окне отладки ID_People найденных записей ' и их количество ' Проход по всей таблице. ' ЭТОТ МЕТОД НЕ ЯВЛЯЕТСЯ ОПТИМАЛЬНЫМ!!! '-------------------------------------------------------- Dim db As Database Dim rs As Recordset Dim str As String Dim lngRecordCount As Long 'Счетчик найденных записей Set db = CurrentDb Set rs = db.OpenRecordset("tblPeoples", dbOpenDynaset) str = "" lngRecordCount = 0 If rs.RecordCount <> 0 Then rs.MoveFirst Do Until rs.EOF 'Если текущая запись удовлетворяет условию... If rs![LastName] = "Иванова" Then 'Инкримируем счетчик найденных записей lngRecordCount = lngRecordCount + 1 str = str & rs![ID_People] & ", " End If rs.MoveNext Loop str = str & vbCrLf & "Всего найдено записей: " & _ lngRecordCount Else str = "Таблица ""tblPeoples"" не содержит записей." End If Debug.Print str rs.Close db.Close End Sub Option Compare Database Option Explicit Sub Cycle01_1() '-------------------------------------------------------- ' Цикл по записям таблицы "tblPeoples" от начала до конца '-------------------------------------------------------- 'База данных Dim db As Database 'Набор записей Dim rs As Recordset 'Строка Dim str As String 'Количество записей в наборе записей Dim lngRecordCount As Long ' db - текушая база данных Set db = CurrentDb Set rs = db.OpenRecordset("tblPeoples", dbOpenDynaset) ' rs - набор записей на основе таблицы "tblPeoples" ' При инициализации набора записей мы можем точно ' определить, есть ли в этом наборе записи или нет. ' Свойство "RecordCount" набора записей посли его ' инициализации, по идее, должна сождержать количество ' записей набора, однако это не так. Если в наборе есть ' записи это свойство отлично от нуля, но не содержит ' их количество. Для определения количества записей ' необходимо перейти на последнюю запись набора, и после ' этого в свойстве "RecordCount" будет находиться ' количество записей набора. 'Если в наборе rs есть записи... If rs.RecordCount <> 0 Then rs.MoveLast ' Переходим на последнюю запись (чтобы "RecordCount" ' содержало верное значение) lngRecordCount = rs.RecordCount ' Считываем количество записей в переменную rs.MoveFirst 'Переходим на первую запись набора ' Заполняем текстовую переменную str количеством записей str = "Количество записей в таблице ""tblPeoples"": " & lngRecordCount & vbCrLf 'Свойство EOF (End Of File) набора записей становиться истинным ПОСЛЕ последней 'записи набора,точно как и свойство BOF (Begin Of File) становиться истинным ПЕРЕД 'первой записью набора. 'Цикл "Пока не кончатся записи в наборе rs" Do Until rs.EOF 'Добавляем в переменную str имнена полей, их ' значения и символ перевода строки str = str & "ID_People: " & rs![ID_People] & vbCrLf str = str & "ID_RecordStatus: " & rs![ID_RecordStatus] & vbCrLf str = str & "LastName: " & rs![LastName] & vbCrLf str = str & "FirstName: " & rs![FirstName] & vbCrLf str = str & "MiddleName: " & rs![MiddleName] & vbCrLf str = str & "PeopleSex: " & rs![PeopleSex] & vbCrLf str = str & "BirthDate: " & rs![BirthDate] & vbCrLf str = str & "------------" & vbCrLf rs.MoveNext 'Переходим на следующую запись Loop 'Конец цикла Else 'Если записей нет... ' Заполняем текстовую переменную str сообщением об ' отсутствии записей str = "Таблица ""tblPeoples"" не содержит записей." End If 'Печатаем содержимое переменной str в окне отладки Debug.Print str rs.Close 'Закрываем переменную набора записей db.Close 'Закрываем переменную базы данных End Sub |