КонспектЛекций
.pdfДанные, используемые для математических вычислений, за исключением финансовых расчетов (для них следует использовать тип «Денежный»). Сохраняет 1, 2, 4 или 8 байтов; 16 байтов для кодов репликации (GUID). Конкретный тип числового поля определяется значением свойства Размер поля (FieldSize).
4. Дата/время
Значения дат и времени. Сохраняет 8 байтов.
5. Денежный
Используется для денежных значений и для предотвращения округления во время вычислений. Сохраняет 8 байтов.
6. Счетчик
Автоматическая вставка уникальных последовательных (увеличивающихся на 1) или случайных чисел при добавлении записи. Сохраняет 4 байта; 16 байтов для кодов репликации (GUID).
7. Логический
Данные, принимающие только одно из двух возможных значений, таких как «Да/Нет», «Истина/Ложь», «Вкл/Выкл». Значения Null не допускаются. (Null – значение, которое можно ввести в поле или использовать в выражениях и запросах для указания отсутствующих или неизвестных данных. В Visual Basic ключевое слово Null указывает значение Null. Некоторые поля, такие как поля первичного ключа, не могут содержать значения Null.).Сохраняет 1 бит.
8. Поле объекта OLE
Объекты OLE (такие как документы Microsoft Word, электронные таблицы Microsoft Excel, рисунки, звукозапись или другие данные в двоичном формате), созданные в других программах, использующих протокол OLE (OLE. Технология связи программ, позволяющая приложениям совместно использовать данные. Все программы Microsoft Office поддерживают технологию OLE, что позволяет совместно работать с данными посредством внедрения и связывания объектов.). Сохраняет до 1 Гигабайта (ограничивается объемом диска).
9. Гиперссылка
Гиперссылки. Гиперссылка может иметь вид пути UNC (Universal Naming Convention – способ записи имени файла, который позволяет задать его местоположение независимо от конкретного компьютера. Вместо указания буквы диска и пути адреса UNC используют синтаксис \\Сервер\ОбщаяПапка\Путь\ИмяФайла. ) либо адреса URL (Uniform Resource Locator – адрес, указывающий протокол (такой как HTTP или FTP) и расположение объекта, документа, веб-страницы или другого ресурса в Интернете или интрасети, например: http://www.microsoft.com/.). Сохраняет до 64 000 знаков.
10. Мастер подстановок
Создает поле, позволяющее выбрать значение из другой таблицы или из списка значений, используя поле со списком. При выборе данного параметра в списке типов данных запускается мастер для автоматического определения этого поля. Для сохранения требуется тот же размер, что и у первичного ключа, соответствующего полю подстановок, — обычно 4 байта.
Если свойство Тип данных (DataType) имеет значение «Числовой», то допустимыми являются следующие значения свойства Размер поля (FieldSize):
Значение |
Описание |
Дробная часть |
|
Размер |
Байт |
Числа от 0 до 255 (без дробной |
Отсутствует |
1 |
байт |
|
части). |
|
|
|
Действительное |
Числа от –10^38–1 до 10^38–1 |
28 |
12 байт |
|
|
(.adp). |
|
|
|
|
Числа от –10^28–1 до 10^28–1 |
|
|
|
|
(.mdb). |
|
|
|
Целое |
Числа от -32 768 до 32 767 (без |
Отсутствует |
2 |
байта |
|
дробной части). |
|
|
|
Длинное целое |
(Значение по умолчанию.) Числа |
Отсутствует |
4 |
байта |
|
от -2 147 483 648 до 2 147 483 647 |
|
|
|
|
(без дробной части). |
|
|
|
Одинарное с |
Числа от |
7 |
4 |
байта |
плавающей |
–3,402823E38 до –1,401298E–45 |
|
|
|
точкой |
для отрицательных значений, и от |
|
|
|
|
1,401298E–45 до 3,402823E38 для |
|
|
|
|
положительных. |
|
|
|
61
Двойное с |
Числа от |
15 |
8 байт |
плавающей |
–1,79769313486231E308 до |
|
|
точкой |
–4,94065645841247E–324 |
|
|
|
для отрицательных значений и от |
|
|
|
4,94065645841247E–324 до |
|
|
|
1,79769313486231E308 для |
|
|
|
положительных. |
|
|
Код репликации |
Уникальный глобальный |
Не определено |
16 байт |
|
идентификатор (GUID) |
|
|
Код реплики (GUID) – 16-байтовое поле в базе данных Microsoft Access, используемое для уникальных идентификаторов при репликации. Коды GUID используются для идентификации реплик, наборов реплик, таблиц, записей и других объектов. В базах данных Microsoft Access коды GUID называются кодами реплик.
Программирование в VBA (Visual Basic for Application)
Основу объектно-ориентированного программирования составляет работа с объектами, в качестве которых рассматриваются любые программируемые элементы. Основными объектами в Access являются таблицы, формы, запросы, отчёты, модули и макросы. Они строятся на основе мелких объектов – элементов управления, которые объединяются в более крупные объекты – семейства (наборы однотипных объектов). Все объекты имеют сохраняемый набор свойств, изменяя которые можно управлять объектом. Для каждого объекта имеется ряд методов – исполняемых инструкций.
Основные иерархические структуры объектов, используемые в Access:
1.Модель объектов доступа к данным (Data Access Object – DAO) обеспечивает объектноориентированный интерфейс для работы с ядром базы данных Jet. А именно – доступ и обработку данных в базах данных, управление базами данных и их объектами с помощью свойств и методов, а также создание новых объектов и изменение структуры базы данных.
2.Модель объектов ActiveX Data Objects – ADO используется для работы с формами, отчётами и модулями выполняющегося приложения Access, объектами других приложений, их свойствами и методами, а также для управления текущим сеансом работы в Access и создания интерфейса приложения.
Основой для программирования являются события, которые обрабатываются процедурами обработки событий. Процедуры, входящие в состав приложения, хранятся в модулях в базе данных. Однако запросить выполнение модуля в целом невозможно. Выполняться могут только процедуры, содержащиеся в модулях. Модули предназначены для удобного объединения процедур по их функциональному назначению или привязке к форме или отчёту. Процедуры обработки событий можно создать для каждого события каждого элемента формы или отчёта и каждого из возможных событий самой формы или отчёта. Событие может быть вызвано системой, программой или действиями пользователя.
Типы переменных:
Синтаксис. Dim переменная As тип
Тип данных Boolean (Bool) может принимать два значения — True (истина) и False (ложь). Этот тип данных присваивается переменным, задействованным в качестве флажков для обозначения состояния объектов. Также этот тип присваивается функциям, которые
62
возвращают значение, сообщающее об успешном или неудачном выполнении какого-то действия. Численная переменная, не равная нулю, считается 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 ключевым
63
словом 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 End Sub
Другая форма оператора On Error Resume Next передает управление оператору, следующему за оператором с ошибкой. Этот оператор приводится ниже.
Publ ic Function MyFunctionO On Error Resume Next
If Err Then
‘обработка
End If
Exit Function
Resume возвращает управление программой оператору, вызвавшему ошибку, и пытается выполнить его снова. Если это приводит к повторной ошибке, то программа обработки ошибок сработает снова. Если вы используете оператор Resume, то лучше применить счетчик возникновения ошибки. По достижении некоторого предела счетчика следует выйти из процедуры. Resume Next передает управление оператору, следующему за оператором, приведшим к ошибке. Вы можете использовать этот прием только в том случае, если уверены, что ошибка — не критическая и может быть проигнорирована, или если ваш обработчик ошибок откорректирует ситуацию, вызвавшую ошибку.
Ветвления и циклы
For counter = start To end [Step step] |
Do [{While | Until} condition] |
[statements] |
[statements] |
[Exit For] |
[Exit Do] |
[statements] |
[statements] |
Next [counter] |
Loop |
While condition |
Do |
[statements] |
[statements] |
Wend |
[Exit Do] |
|
[statements] |
|
Loop [{While | Until} condition] |
For Each element In group |
With object |
[statements] |
[statements] |
[Exit For] |
End With |
[statements] |
|
Next [element] |
With MyLabel |
64
|
.Height = 20 |
|
For Each oGeneric In Forms |
.Width = 200 |
|
If oGeneric.Name = "Форма 3" Then Exit For |
.Caption = "This is MyLabel" |
|
EndIf |
End With |
|
Next oGeneric |
|
|
|
|
|
If condition Then [statements] [Else statements] |
Choose(index, choice-1[, choice-2, ... [, |
|
либо |
choice-n]]) |
|
If condition Then |
|
|
[statements] |
Function GetChoice(Ind As Integer) |
|
[ElseIf condition-n Then |
GetChoice = Choose(Ind, |
|
"Speedy", "United", "Federal") |
||
[statements] ... |
||
End Function |
||
[Else |
||
|
||
[statements]] |
|
|
End If |
|
|
|
|
|
IIf(expr, truepart, falsepart) |
Select Case expression_переменная |
|
|
[Case expression-n_значение |
|
CheckIt = IIf(TestMe>1000, "Large", "Small") |
[statements-n]] ... |
|
Switch(expr-1, value-1[, expr-2, value-2 … [, expr- |
[Case Else |
|
n,value-n]]) |
[elsestatements]] |
|
Matchup = Switch(CityName = "London", |
|
|
"English", CityName = "Rome", "Italian", |
End Select |
|
CityName = "Paris", "French") |
|
Параметры процедур и функций.
Объявление:
Sub CalcFee(AcctTotal As Currency, ContractMonths As Integer)
Вызов:
CalcFee A, 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 – находит данные, удовлетворяющие условиям поиска, указанным с помощью аргументов этой макрокоманды. Данные могут быть в текущей записи, в следующей, предыдущей или в самой первой записи.
65
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
66
Быстрее всего можно задать свойство элемента управления из модуля объекта с помощью свойства объекта 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
Примечания
В справке по предметному указателю можно найти следующие сведения о каждом свойстве:
o |
допускается ли задание этого свойства в программе Visual Basic; |
o |
режимы, в которых можно задавать свойство. Не все свойства можно задавать во |
|
всех режимах. Например, свойство формы Тип границы (BorderStyle) можно |
|
задавать только в режиме конструктора формы; |
oкакие значения следует использовать для задания свойства. Часто значения некоторых свойств в программе 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.
67
`Общение с JET через объекты данных Access.
DBEngine
Workspaces |
Errors |
|
Workspace |
Error |
|
Databases |
|
|
|
Database |
|
Groups |
Containers |
|
|
|
Container |
Users |
QueryDefs |
Documents |
|
||
|
|
QueryDef |
|
|
Fields |
|
RecordSets |
Parameters |
|
|
RecordSet |
|
Relations |
Fields |
Relation
Indexes |
TableDefs |
Fields |
Fields |
|
TableDef |
DBEngine Является ядром Jet. Этот верхний уровень объекта содержит все объекты DАО. Это объект, на который нужно ссылаться для сжатия и восстановления базы данных с помощью программы VBA
Error Содержит информацию, имеющую отношение к ошибке, которая произошла при работе Jet/DAO. Этот объект — член семейства Errors: список ошибок от самого нижнего до самого верхнего уровня
Workspace Содержит базы данных, открытые в пользовательском сеансе, а также предлагает методы и свойства для поддержки транзакций открытых БД и для защиты. Является членом семейства Workspaces
Database Ссылается на базу данных, открытую в соответствующем объекте Workspace
User Представляет пользователя сеанса в соответствующем объекте Workspace. Сеансы могут проводить одновременно несколько пользователей; эти пользователи определены в семействе Users
Group Представляет нескольких членов групп и предоставляет им общие возможности.
TableDef Представляет сохраненное описание локальной или присоединенной таблицы в соответствующем объекте Database
QueryDef Представляет сохраненный запрос в соответствующей базе данных. Его свойство SQL определяет SQL-оператор, используемый для определения возвращаемого набора записей. Когда в Access строится запрос с помощью каких-либо средств, то в этом свойстве записывается окончательный текст SQL-выражения
RecordSet Представляет итоговые записи после выполнения запроса или записи таблицы.
68
Field Определяет свойства и методы, применимые к одному полю (столбцу), а семейство Fields содержит все объекты Field для соответствующей таблицы, запроса или набора записей
Index Описывает индекс в соответствующей таблице.
Parameter QueryDefs должен содержать параметры для определения значений критериев
Relation Здесь описываются отношения между таблицами, установленные в базе данных
Container Объекты Container (контейнер) встроены и представляют собой доступные объекты данных, такие как таблицы, отношения и базы данных, а также объекты Access, такие как отчеты, формы и модули. Каждый объект поддерживает защиту хранящейся в нем информации
Document Представляет требования для типов объектов в соответствующем контейнере. Например, контейнер Access Forms содержит объект Document для каждой формы базы данных. Кроме того, объект Document поддерживает защиту информации того объекта, который он представляет
Каждый объект в иерархии 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)
69
.Fields.Append .CreateField("IntegerField", dbInteger)
.Fields.Append .CreateField("DateField", dbDate) End With
dbsNorthwind.TableDefs.Append tdfNew
Использование объекта Recordset
Recordset — это объект, который используется для выполнения операций с записями. Семейство 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 недействительным.
Примеры использования методов DAO
Sub Find() '--------------------------------------------------------
'Поиск записей в таблице "tblPeoples"
'Будем искать записи, у которых в поле LastName
'находиться значение "Иванова"
'и печатать в окне отладки ID_People найденных записей
'и их количество
'Проход по всей таблице.
'ЭТОТ МЕТОД НЕ ЯВЛЯЕТСЯ ОПТИМАЛЬНЫМ!!!
'--------------------------------------------------------
Dim db As Database Dim rs As Recordset Dim str As String
70