WWW.LIBRUS.DOBROTA.BIZ
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - собрание публикаций
 

«Access на VBA Санкт-Петербург УДК 681.3.016 В.М.Водовозов. Управление базами данных Access на VBA. 32 с. Даны основные сведения об использовании Visual Basic for Applications для создания ...»

В. М. Водовозов

Управление базами данных

Access на VBA

Санкт-Петербург

УДК 681.3.016

В.М.Водовозов. Управление базами данных Access на VBA. 32 с .

Даны основные сведения об использовании Visual Basic for

Applications для создания модулей Access. Для всех, кто владеет основами

Microsoft Access .

© В.М.Водовозов, 2003 .

Оглавление

Модели объектов Access

Процедурное и структурное программирование в DAO

Процедурное и структурное программирование в ADO

Визуальное программирование в Access

Меню

Панели инструментов

Начальная установка интерфейса

Модели объектов Access Access представлен двумя уровнями компонентов: ядром базы данных Jet и системой управления базой данных Access. На уровне ядра находятся данные, то есть таблицы и запросы, а также файлы, хранящие компоненты системы управления. Для организации данных используется индекснопоследовательный метод (ISAM), в соответствии с которым каждая запись имеет переменную длину и хранится на странице объемом до двух килобайт .

Выборка данных поддерживается механизмом запросов SQL и программным доступом на VBA. Система управления Access обслуживает интерфейс пользователя (формы, отчеты, макросы, меню, панели, окна диалога) и процедуры VBA .

Первый уровень поддерживаются двумя моделями объектов. Первая из них базируется на библиотеках классов DAO (Data Access Objects), вторая — на библиотеках ADO (ActiveX Data Objects — ADODB, ActiveX Data Objects Extensions for DDL and Sequrity — ADOX, Microsoft Jet and Replication Objects — JRQ). ADODB обеспечивает приложению доступ к источнику данных с возможностью отбора и изменения данных. ADOX позволяет программно изменять структуру объектов источника данных и систему защиты баз данных. JRQ служит для создания, модификации и синхронизации реплик баз данных Access .

Второй уровень строится на библиотеке Access .

Библиотека классов DAO ориентирована на работу с данными. Базовым классом DAO является DBEngine, описывающий семейства Errors (Ошибки) и Workspaces (Рабочие области). Каждая рабочая область Workspace характеризуется классами Databases (Базы данных), Groups (Группы), Users (Пользователи). Наиболее часто используется семейство Recordset (Результирующие наборы записей) класса Database. Каждое множество Recordset основывается на записях таблицы или на описании запроса и позволяет находить, добавлять, изменять или удалять записи. Структуры таблиц базы данных хранятся в семействе класса TableDefs, в частности, в объектах его классов Fields (Поля), Indexes (Индексы). В семействе класса Relations (Связи) размещаются схемы данных таблиц. Структура запросов базы данных описывается семейством класса QueryDefs (Запросы) с объектами классов Fields (Поля), Parameters (Параметры) .

На работу с данными рассчитана и модель ADO. Во главе этой модели стоит объект Connection (Соединение). Он описывает среду, в которой выполняется обмен данными. Источник данных управляется производным от Connection объектом Command (Команда), который командами SQL добавляет, удаляет, обновляет и считывает данные. Его семейство Parameters (Параметры) представляет переменные компоненты объекта Command .

Другой производный от Connection объект — Recordset — накапливает считанные из источника данные. Его семейство Fields представляет поля таблиц Recordset. Поля характеризуются семействами свойств Properties .

Встроенные свойства являются частью объекта ADO и всегда доступны, а динамические свойства существуют только в момент работы источника данных .





Библиотеку классов возглавляет класс Application Access (Приложение), описывающий семейства Forms, Reports, Modules, References, DataAccessPages, Controls и такие объекты как Screen, DoCmd, Module, Assistant, CommandBar…

В литературе часто используются сокращения:

–  –  –

Обращение к членам библиотек классов DAO и ADO и все обращения в запросах SQL выполняется по схеме:

имяКласса.имяОбъекта.Член Имена длиной более одного слова заключаются в прямоугольные скобки. При ссылке на объект в активном окне базы данных или контейнера (объекта, содержащего адресуемый объект) имя класса иногда можно опускать. Для упрощения обращений к объектам используется оператор Set, ставящий в соответствие описываемому объекту объектную переменную .

Процедурное и структурное программирование в DAO

В общем случае доступ к данным библиотек DAO организуется в три этапа. Сначала создается объект методом Create… его родителя. Затем устанавливаются его свойства, которые после сохранения объекта в базе данных останутся доступными только для чтения. В ряде случаев, кроме свойств, сразу же задаются и объекты-потомки, например, поля таблиц. В заключение объект добавляется в состав семейства методом Append этого семейства и сохраняется в памяти. Отдельные классы объектов создаются по упрощенной схеме .

Сеанс доступа к данным модели DAO описывает класс Workspace. Все действия в рамках сеанса определены правилами доступа пользователя, а их последовательность — транзакция — рассматривается как одно целое. В незащищенных базах данных открывается сеанс по умолчанию под именем Default Workspace для пользователя admin без пароля. При создании нового сеанса Workspace DBEngine!CreateWorkspace _ (имяРабочейОбласти, Пользователь, Пароль [, Тип]) его не добавляют в семейство ввиду временного характера его существования .

Метод CreateDatabase используют для создания новых баз данных:

[рабочаяОбласть].CreateDatabase (имяБазыДанных, _ Язык, [Параметры] ) Здесь ранее созданная рабочаяОбласть служит ссылкой на объект Workspace, имяБазыДанных длиной до 255 символов представляет короткий или полный путь к файлу.MDB, Язык задается значением констант dbLangGeneral, dbLangCirillic, определяя порядок сортировки данных, а необязательные Параметры задают формат ядра Jet и необходимость шифрования. Базы данных автоматически добавляются в соответствующие семейства и сохраняются .

Для открытия базы данных используется метод OpenDatabase:

[базаДанных.] [рабочаяОбласть.]OpenDatabase (имяБазыДанных _ [, Монопольность [, толькоЧтение[, Источник]]] ) Если база данных уже открыта, к ней удобно обращаться через функцию

CurrentDb:

• CurrentDB!имяТаблицы!имяПоля.имяСвойства

• CurrentDB!QueryDefs!имяЗапроса

• CurrentDB!QueryDefs («имяЗапроса»)

• CurrentDB!QueryDefs (индекс)

• CurrentDB!QueryDefs (ссылка) Результирующие множества записей — объекты классов TableDef и

QueryDef — создаются методами CreateTableDef, CreateQueryDef:

• [рабочаяОбласть.]базаДанных.CreateTableDef («имяТаблицы») • [рабочаяОбласть.]базаДанных.CreateQueryDef ([запрос, SQL]) Если при вызове метода CreateQueryDef аргументы не заданы, можно присвоить новому объекту значения свойств Name и SQLtext позднее, посредством оператора присваивания .

Объекты классов TableDef и QueryDef открываются методом OpenRecordset и закрываются с удалением из семейства Databases методом

Close объекта Database:

• базаДанных.OpenRecordset (Источник [,Тип, Параметры] )

• объект.OpenRecordset (Источник [,Тип, Параметры] )

• базаДанных.Close

• объект.Close В отличие от режима работы через интерфейс пользователя, процедуры VBA дают возможность одновременно открывать несколько баз данных, хотя на экране отображается только одна из них. Свойство Name позволяет проверить, открылась ли база данных: полный путь к открытой базе возвращает выражение объект.Name .

Поля таблиц вначале создаются, затем добавляются в семейства, после чего обновляется окно базы данных:

Set объектПоле = объектТаблица.CreateField (имяПоля, Тип, [Размер]) объектТаблица.Fields.Append объектПоле базаДанных.TableDefs.Append объектТаблица RefreshDatabaseWindow

Доступ к полям реализуется через объекты класса Fields:

• имяТаблицыИлиЗапроса.Fields!имяПоля

• имяТаблицыИлиЗапроса. имяПоля

• имяТаблицыИлиЗапроса!Fields!имяПоля

• имяТаблицыИлиЗапроса! имяПоля

• Parent!имяПоляГлавнойФормы Ни TableDef, ни QueryDef не содержат данных. Для доступа к данным нужны наборы записей — объекты RecordSet. В модели DAO присутствуют четыре типа таких объектов. Тип Table представляет набор записей одной таблицы открытого файла базы данных. Он не обрабатывает связанные таблицы и таблицы ODBC и обслуживает только рабочие области Jet. Тип Dynaset представляет динамический набор записей таблицы открытой базы данных, связанной таблицы, результата выполнения запроса или оператора SQL SELECT. Он состоит из ссылок, поэтому обрабатывается медленнее, чем Table и иногда не обновляется, но охватывает более широкую область данных. Тип Snapshot представляет статическую копию таблицы, запроса или оператора SQL SELECT, удобную для выборки данных и создания отчетов .

Forward-Only представляет аналогичную копию, предназначенную для единовременного просмотра данных.

Синтаксис:

базаДанных.OpenRecordSet (Источник [,Тип, Параметры, Блокировка]) Здесь Источник — это строка с именем таблицы, запроса или текстом SQL, далее следует тип объекта RecordSet, по умолчанию Table для таблиц и Dynaset для запросов и связанных таблиц. Любой объект RecordSet существует только в рамках своей процедуры, а затем уничтожается. Его можно закрыть раньше методом Close .

Примеры Sub РабочаяОбласть () Set область = DBEngine.Workspaces (0) Set новаяБазаДанных = _ область.CreateDatabase ("Школьники.mdb", dbLangGeneral) Set другаяБазаДанных = _ область.OpenDatabase ("Транспорт") MsgBox другаяБазаДанных.Name & Chr (13) & _ новаяБазаДанных.Name & Chr (13) & CurrentDb.Name End Sub Sub БазыДанных () Set текущаяБазаДанных = CurrentDb Set новаяБазаДанных = CreateDatabase ("Студенты.mdb", dbLangCyrillic) Set другаяБазаДанных = OpenDatabase ("Пользователи.mdb") MsgBox другаяБазаДанных.Name & Chr (13) & _ новаяБазаДанных.Name & Chr (13) & текущаяБазаДанных.Name End Sub Sub НаборыЗаписейDAO () Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники", dbOpenDynaset) Set tdf2 = CurrentDb.OpenRecordset ("Категории") Set tdf3 = CurrentDb.OpenRecordset ("SELECT * FROM Поставщики") Set tdf4 = CurrentDb!Поставщики.OpenRecordset Set tdf5 = CurrentDb.QueryDefs (“Продажи”).OpenRecordset tdf1.Close End Sub Sub УправлениеТаблицей () Set tdf = CurrentDb.OpenRecordset ("Отделы") MsgBox "Таблица открыта" tdf.Close MsgBox "Таблица закрыта" End Sub Sub СозданиеТаблицы () Set область = DBEngine.Workspaces (0) Set база = область.OpenDatabase (“C:\Учащиеся.mdb”) Set таблица = база.CreateTableDef ("НоваяТаблица") таблица.Fields.Append таблица.CreateField (“Кто”, dbText) таблица.Fields.Append таблица.CreateField (“Когда”, dbDate) база.TableDefs.Append таблица база.TableDefs.Refresh Set таблица = Nothing Set база = Nothing End Sub Sub УдалениеТаблицы () CurrentDb.TableDefs.Delete “НоваяТаблица” CurrentDb.TableDefs.Refresh RefreshDatabaseWindow End Sub Sub ДоступКПолям () MsgBox CurrentDb!Таблица1.Fields (1).Name & Space (2) _ & CurrentDb!Таблица1.Fields (2).Name & Chr (13) & _ "Всего полей: " & CurrentDb!Сотрудники.Fields.Count End Sub Sub Запрос () переменная = CurrentDB.CreateQueryDef _ (“зСотр”, “SELECT * FROM Сотрудники ORDER BY Сотрудники.ФИО”) RefreshDatabaseWindow End Sub При создании объекта RecordSet строки данных помещаются в буфер и не выводятся на экран, а указатель позиционирует на текущей записи. При открытии набора записей активной становится первая запись. Для перемещения к другим записям используются методы MoveFirst, MoveNext, MovePrevious, MoveLast.

Методом BookMark можно определять закладки и возвращаться впоследствии к запомненным в них записям:

объектЗакладка = объектНабор.BookMark … объектНабор.BookMark = объектЗакладка Метод Move числоСтрок [,Закладка] смещает указатель на требуемое число записей вперед или назад. Свойства BOF и EOF объекта Recordset фиксируют выход за пределы набора записей .

Для поиска определенной записи в наборах типа Table используется метод Seek, а в наборах других типов — методы FindFirst, FindNext, FindPrevious, FindLast. Найденная запись становится текущей, а свойство NoMatch устанавливается в False. При отсутствии искомой записи NoMatch =

True:

• объект.Seek «оператор», списокКлючей

• объект.Find… «критерий»

Здесь используются операторы,, =, =, =, а список ключей описывает поля текущего индекса. Критерий же предствляет логичекое выражение вида «Поле оператор Значение» .

В модели DAO изменения в таблицы вносятся последовательно .

Предварительно запись копируется в специальную область памяти — буфер копирования методом Edit, а затем методом Update возвращается в объект Recordset. При необходимости буфер копирования очищается методом

CancelUpdate:

объект.Move… или Find… или Seek объект.Edit объект.имяПоля = Значение объект.Update объект.CancelUpdate При необходимости Execute выполняет запрос на изменение и Update сохраняет изменения .

Новые записи тоже не добавляются прямо, а сначала помещаются в буфер копирования, а затем обновляют набор методом AddNew. В наборах типа Dynaset и Table без индекса новая запись добавляется в конец, а там, где определен индекс, она вставляется в соответствии с индексом. Для добавленной записи автоматически создается закладка в свойстве LastModified. Указатель текущей записи при этом автоматически не перемещается .

Удаляемая запись помещается в буфер удаления и остается текущей .

Удаление выполняется без предупреждения и отмены .

Уникальный объект DoCmd реализует связь между макропрограммированием и программированием на VBA, дублируя операции интерфейса пользователя Access. Методы DoCmd не возвращают значений. В их аргументах активно используются константы Access, такие как acTable, acQuery, acForm, acReport, True, False. Имена объектов здесь не заключаются в прямоугольные скобки, а при необходимости помещаются в двойные кавычки. В частности, для выполнения запросов SQL вызывается метод RunSQL объекта DoCmd. В программах VBA допускается использование выражений SQL длиной до 32768 символов .

Другой метод — Clone — создает копии наборов записей. При копировании организуется независимый указатель текущей записи, а закладки копии совпадают с закладками оригинала. Но копия не наследует свойств Index, Filter, Sort .

Связь полей таблиц и запросов описывается методом Relation. Он используется для создания новых связей (CreateRelation), для их изменения и просмотра. При создании связи указываются соответствующие поля в первичной и внешней таблицах (запросах). В первой таблице эти поля образуют первичный ключ, однозначно определяющий запись, а во второй таблице — внешний ключ. Каждое поле первичного ключа следует добавить в семейство Fields связи с указанием внешнего ключа в свойстве

ForeignName:

Set объектСвязи = базаДанных.CreateRelation ([«Имя», Таблица, внешняяТаблица, Атрибуты]) объектСвязи.Table = «Таблица»

объектСвязи.ForeignTable = «внешняяТаблица»

Set объектПоле = объектСвязи.CreateField(«Поле») объектПоле.ForeignName = «Поле»

объектСвязи.Fields Append объектПоле базаДанных.Relations Append объектСвязи При этом Access устанавливает параметр ссылочной целостности, но не устанавливает каскадное обновление и удаление записей .

Примеры Sub ПоискDAO () Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники") tdf.Index = "PrimaryKey" tdf.Seek "=", "Иванов" Set tdf2 = CurrentDb.OpenRecordset ("Командировки", dbOpenSnapshot) tdf2.FindFirst "Кто = 'Алексеев'" End Sub Sub ЗаписиDAO () Set базаДанных = CurrentDb строкаSQL = "SELECT * FROM Таблица1 WHERE Фирма LIKE 'I*'" Set результатЗапроса = базаДанных.OpenRecordset (строкаSQL) результатЗапроса.MoveFirst MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2) где = "Фирма = 'Intel'" результатЗапроса.FindFirst где MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2) результатЗапроса.FindNext где MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2) результатЗапроса.MoveLast MsgBox результатЗапроса.RecordCount End Sub Sub ОбновлениеЗаписей () Set rst = CurrentDb.OpenRecordset ("Таблица1") где = "Фирма = 'Intel'" DoCmd.RunSQL _ "UPDATE Таблица1 SET Цена = 5 WHERE NТовара=2" DoCmd.RunSQL _ "UPDATE Таблица1 SET Фирма = 'LG' WHERE " & где DoCmd.RunSQL _ "UPDATE Таблица1 SET Фирма = 'Zilog' WHERE " & _ "Фирма = 'LG'" rst.Close Set rst = Nothing End Sub Sub АнализЗаписей () Set db = CurrentDb Set rst = db.OpenRecordset ("Таблица1", dbOpenDynaset) где = "Фирма = 'Intel'" rst.MoveFirst rst.FindFirst где If rst.NoMatch = False Then MsgBox "Фирма есть в этой таблице" rst.FindNext где If rst.NoMatch Then MsgBox "Фирма только одна" rst.Close db.Close Set rst = Nothing Set db = Nothing End Sub Sub СписокБазыДанных () Set текущаяБазаДанных = CurrentDb Set рабочаяОбласть = DBEngine.Workspaces(0) Set новаяБазаДанных = рабочаяОбласть.CreateDatabase _ ("Студенты.mdb", dbLangGeneral)

–  –  –

Set объект = CurrentDb.OpenRecordset("Товары") массив = объект.GetRows (объект.RecordCount) For Each элемент In массив строка = строка & элемент & chr (13) Next MsgBox строка End Sub Sub ПравкаТаблицDAO () Set таблица = CurrentDB.OpenRecordset ("Таблица1") таблица.MoveFirst таблица.Edit таблица.Fields (Фирма) = "SCAN" таблица.Fields (Год) = 2005 строкаSQL = "UPDATE Таблица1 SET NТовара = 22 " _ & "WHERE NТовара = 2 " CurrentDb.Execute строкаSQL таблица.AddNew таблица.Fields (ФИО) = “Новый” таблица.Update таблица.BookMark = таблица.LastModified таблица.Move 5 таблица.Delete таблица.moveNext End Sub Процедурное и структурное программирование в ADO

Синтаксис обращения к объектам ADO:

ADODB.имяОбъекта Для доступа к данным в этой модели используются объекты Connection, несущие сведения об источнике данных и его расположении. Для работы с ним открывается множество Recorddet или Command и задается строка подключения ConnectionString. Значения каждого свойства такого объекта можно задавать как аргумент метода Open или отдельно, через свойство Properties. Connection открывает сеанс обмена данными через провайдера OLEDB. Command служит для выполнения запросов. Recordset представляет набор записей, а Fields — семейство его полей. Отдельные параметры SQLзапросов и хранимых процедур образуют семейство Parameter. Ошибки сеанса связи фиксируются объектами семейства Errors. Как и в DAO, свойства — объекты Properties — делятся на встроенные и динамические .

Можно сначала задавать свойства, а потом создавать объект, используя его метод или метод другого объекта. Или наоборот: вначале создать объект, а затем установить значения его свойств .

Свойства и методы классов модели ADODB приведены в таблице .

–  –  –

Объекты Recordset создают тремя методами: Open класса Recordset, Exequte класса Command или Exequte класса Connection. Синтаксис метода

Open:

rst.Open Source, Connection, CursorType, lockType, Options где Source — это имя таблицы или запроса, инструкция SQL, ссылка на объект Command или имя файла, Connection — ссылка на объект подключения, cursorType — тип доступа: adOpenDynamic — отображает все изменения, вставки и удаления, вносимые другими пользователями;

adOpenKeyset — показывает только изменения; adOpenStatic — сохраняет исходный набор; adOpenForwardOnly — то же, при одностороннем движении курсора; LockType — тип блокировки: adLockReadOnly — только для чтения, adLockPessimistic — пессимистическая блокировка, adLockOptimistic — оптимистическая блокировка, adLockBatchOptimistic — с кэшированием изменений в наборе; Options — характеристика Source: adCmdText — инструкция SQL, adCmdTable — SQL-запрос ко всем записям таблицы, adCmdTableDirect — таблица или запрос, adCmdUnknown — без указания параметра, adCmdFile — файл с набором записей .

Объект Command служит для выполнения запросов. В качестве источника данных запроса может задаваться таблица или SQL-инструкция, серверное представление или хранимая процедура. Его свойство CommandType при этом принимает одно из значений: adCmdUnknown — неизвестный, по умолчанию, adCmdText — запрос или хранимая процедура, adCmdTable — таблица для запроса, adCmdTableDirect — непосредственно открываемая таблица, adCmdStoredProc — хранимая процедура на сервере, adCmdFile — файл с набором записей .

Примеры Sub ТекущееСоединениеADO () Dim cnn As ADODB.Connection Set cnn = CurrentProject.Connection MsgBox cnn.ConnectionString If cnn.State = adStateClosed Then MsgBox "Нет подключения" Else MsgBox "Подключение есть" End If Set cnn = Nothing End Sub Sub Соединение1ADO () Dim cnn As ADODB.Connection Set cnn = New ADODB.Connection cnn.Open _ "Provider=SQLOLEDB; Data Source=srv; Initial Catalog=pubs;" & _ "DataBase=базаДанных; User Id=sa; Password=;" MsgBox cnn.ConnectionString If cnn.State = adStateClosed Then MsgBox "Нет подключения" Else MsgBox "Подключение есть" End If cnn.Close End Sub Sub Соединение2ADO () Dim cnn As ADODB.Connection Set cnn = New ADODB.Connection cnn.Provider = "SQLOLEDB" cnn.Properties ("DataSource") = "Источник" cnn.Properties ("DataBase") = "базаДанных" cnn.Properties ("UserId") = "Пользователь" cnn.Properties ("Password") = "Пароль" cnn.Open MsgBox cnn.ConnectionString If cnn.State = adStateClosed Then MsgBox "Нет подключения" Else MsgBox "Подключение есть" End If cnn.Close End Sub Sub ДоступКПолямADO () Dim rst As New ADODB.Recordset rst.Open "Сотрудники", CurrentProject.Connection For i = 0 To rst.Fields.Count - 1 temp = temp & rst.Fields(i).Name & vbCr Next MsgBox "Всего полей: " & Str(rst.Fields.Count) & vbCr & temp End Sub Sub СвойстваADO () Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset cnn.Provider = "Microsoft.Jet.OLEDB.4.0" cnn.Properties ("Data Source") = "D:\ Кадры.mdb" cnn.Open rst.CursorType = adOpenStatic rst.Open “Сотрудники”, cnn ' вот как можно узнать все свойства класса For i = 0 To cnn.Properties.Count - 1 Debug.Print cnn.Properties (i).Name Next End Sub Public cnnXLS As New ADODB.Connection, _ cnnMDB As New ADODB.Connection, _ cnnDBF As New ADODB.Connection Public rstXLS As New ADODB.Recordset, _ rstMDB As New ADODB.Recordset, _ rstDBF As New ADODB.Recordset Sub Соединения () Отключение cnnXLS.Open "DBQ=D:\ Сотрудники.xls;Driver={Microsoft Excel Driver (*.xls)}" RSTOpen "Сотрудники", cnnXLS, rstXLS cnnDBF.Open "DBQ=D:\;Driver={Microsoft dBase Driver (*.dbf)}" RSTOpen "T", cnnDBF, rstDBF cnnMDB.Open "DBQ=D:\ Кадры.mdb;Driver={Microsoft Access Driver (*.mdb)}" RSTOpen "Сотрудники", cnnMDB, rstMDB End Sub

–  –  –

Sub Отключение () Set cnnXLS = Nothing Set cnnMDB = Nothing Set cnnDBF = Nothing Set rstXLS = Nothing Set rstMDB = Nothing Set rstDBF = Nothing End Sub Sub ВсеПоля () Set базаДанных = CurrentDb Set таблица = базаДанных!t3 For Each поле In таблица.Fields строка = строка & Chr(13) & поле.Name Next поле MsgBox строка End Sub Sub ТекущаяЗаписьADO () Dim rst As New ADODB.Recordset rst.Open "Сотрудники", CurrentProject.Connection Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") rst.Close End Sub Sub Записи1ADO () Dim rst As New ADODB.Recordset rst.Open "ЗапросСотрудники", CurrentProject.Connection набор.MoveNext Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") набор.Move 4 Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") Set rst = Nothing End Sub Sub Записи2ADO () Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset

–  –  –

Для изменения данных следует сначала сделать запись текущей. В модели ADO изменения данных программируются проще, чем в DAO, так как используется обычный оператор присваивания с последующим обновлением .

В модели ADO используется отличный от DAO синтаксис поиска:

• объектRecordset.Seek (значенияКлюча, параметрыПоиска)

• Find (Критерии, Пропуск, направлениеПоиска, Старт) где аргументы указывают массив переменных искомого значения и константный тип сравнения, число пропускаемых строк и направление .

–  –  –

Визуальное программирование в Access Для работы с формами и отчетами используется библиотека Access с базовым классом Application.

Основными методами Application являются:

–  –  –

Входящее в Access семейство Forms (Формы) содержит формы и их объекты, принадлежащие классу Controls (Элементы управления). Семейство Reports (Отчеты) включает все отчеты приложения и объекты отчетов того же класса Controls. Семейство Modules (Модули) объединяет все стандартные модули и модули авторских классов, а также модули, связанные с формами и отчетами. Для работы с окнами используется класс Screen. А класс DoCmd позволяет обращаться из модулей к стандартным средствам Access .

Схема обращения к членам библиотеки классов Access:

имяКласса!имяОбъекта[.имяЭлементаУправления].Член Открытие форм и отчетов выполняется методами OpenForm и

OpenReport объекта DoCmd:

• DoCmd.OpenForm Объект [, режимВывода] [, Запрос] _ [, условиеОтбора] [, режимДанных] [, режимОкна] _ [, аргументыОткрытия]

• DoCmd.OpenReport Объект [, режимВывода] [, Запрос] _ [, условиеОтбора] [, режимДанных] [, режимОкна] _ [, аргументыОткрытия]

Обращение к объектам форм и отчетов выполняется по схемам:

• [Forms! Форма!] Объект

–  –  –

Точка отделяет объект от его свойства или метода, а также разделяет объекты подчиненной формы (отчета):

• [Forms! Форма!] [Объект].[свойствоИлиМетод] • [Reports! Отчет!] [Объект].[свойствоИлиМетод] • [Forms!ГлавнаяФорма!]ПодчиненнаяФорма.[Form!] Объект • [Forms!ГлавнаяФорма!]ПодчиненнаяФорма.ееИсточникДанных Обращение к активным объектам класса Screen в ряде случаев заменяют их свойствами ActiveDataSheet, ActiveForm, ActiveControl, PreviousControl, Application, Parent. А для ссылки на активную форму или отчет из модулей их классов удобно использовать конструкции

–  –  –

Закрытие объектов выполняется методом Close класса Access и объекта

DoCmd, а выход из Access — методом Quit:

DoCmd.Close [типОбъекта, имяОбъекта], [параметрСохранения]

• Application.Quit [параметрСохранения]

• DoCmd.Quit [параметрСохранения] где типОбъекта и параметрСохранения выражаются встроенными константами .

Примеры Sub ОткрытиеФормыAccess () DoCmd.OpenForm "Форма Таблицы1" MsgBox Forms![Форма Таблицы1].Caption End Sub Sub ОткрытиеФормAccess () On Error GoTo ошибка Имя = InputBox ("Какую открыть форму?") DoCmd.OpenForm Имя Exit Sub ошибка:

MsgBox "Ошибка " & Err, vbExclamation Exit Sub End Sub Sub СвойстваФормыAccess () DoCmd.OpenForm FormName:="Мы", view:=acDesign, windowmode:=acHidden With Forms!Мы.Caption = "Сведения о клиентах".Modal = True.DefaultView = 1.AllowEdits = False.AutoResize = False.AutoCenter = True.Width = 300.Picture = "d:\ f1.bmp".Tag = "0".OnActivate = "=FunctionName ()".OnCurrent = "[Процедура обработки событий]".OnClose = "Макрос" End With DoCmd.OpenForm "Мы" End Sub Sub ОткрытиеОтчетаAccess () DoCmd.OpenForm "Выставка" ответ = MsgBox ("Вывести отчет ?", vbYesNoCancel) If ответ = vbYes Then DoCmd.OpenReport "Выставка", acPreview MsgBox Screen.ActiveReport.Name End Sub Sub ЗакрытьФормуОтчет () DoCmd.OpenForm “Сотрудники”,,, “Должность = ‘дилер’ ” MsgBox Forms (“Сотрудники”).Caption DoCmd.Close acForm, "Сотрудники", acPrompt DoCmd.OpenReport “Сотрудники”, acViewPreview MsgBox Reports!Сотрудники.Page DoCmd.Close Save:=acSaveYes End Sub Private Sub Form_Current () Form_имяФормы.Caption = Time MsgBox Me.Name + Me.Tag End Sub Function ButtonOpenNextForm (fName As String) Dim имяЭтойФормы As String имяЭтойФормы = Screen.ActiveForm.Name Screen.ActiveForm.Visible = False DoCmd.OpenForm fName Screen.ActiveForm.Tag = имяЭтойФормы End Function

–  –  –

В следующей таблице приведены наиболее общие свойства объектов Form и Report (обозначения: o — объект, i — целый, b — логический, s — строковый, ro — только чтение):

–  –  –

Некоторые методы объектов Form:

Метод Действие GoToPage Передает фокус первому элементу управления активной формы Recalc Обновляет вычисляемые элементы, но не функции SQL Refresh Обновляет записи без учета добавлений и удалений Repaint Обновляет экран и завершает вычисления Requery Обновляет источник данных формы SetFocus Передает фокус элементу, ранее последним им владевшему Undo Отменяет изменения в форме Обновление объектов, активных таблиц и запросов выполняется методом Requery:

• имяОбъекта.Requery

• DoCmd.Requery Событие До обновления (BeforeUpdate) возникает в момент перемещения с записи на запись. Если пользователь изменяет запись, свойство формы Dirty становится истинным, и если после этого аргументу Cancel присвоить значение True, событие отменяется. Метод Undo восстанавливает исходные данные. Событие После обновления (AfterUpdate) используется для выполнения определенных действий в зависимости от введенных в поле значений. При передаче фокуса от одного элемента управления к другому возникают события Вход (Enter), соответствующее приему фокуса, и Выход (Exit), соответствующее его потере .

Для выявления идентичных объектов можно использовать оператор Is .

Он определяет логический результат как Null или Not Null .

Для ссылок из формы или отчета на объект RecordSet используется свойство RecordSetClone. Значение этого свойства формы определяет копию записей базовой таблицы или запроса, указанных в свойстве Источник записей формы. В частности, если форма основана на запросе, то обращение к свойству RecordSetClone эквивалентно созданию копии объекта RecordSet с помощью того же запроса.

Если к форме будет дополнительно применен фильтр, то объект RecordSet создается с учетом фильтра:

Примеры Sub СвободныеЭлементыAccess() Dim надпись As Object, поле As Object DoCmd.OpenForm "Форма1" Set надпись = Forms!Форма1.Надпись1 Set поле = Forms!Форма1.Поле0 надпись.Caption = поле.Text End Sub Sub ПолеФормыAccess () Dim поле As Control DoCmd.OpenForm "Клиенты" Set поле = Forms!Клиенты![Обращаться к] поле = "Сергей Петров" Forms!Клиенты.Refresh End Sub Sub ОбновлениеЧерезФормуAccess () DoCmd.OpenForm "Сотрудники",,, "Фамилия = 'Иванов'" Set где = Forms!Сотрудники If IsNull (где.оклад) Then где.оклад = 0 где.оклад = InputBox ("Можно заменить " & Str (где.оклад),, где.оклад) DoCmd.Requery End Sub Sub СтильПоляФормы () DoCmd.OpenForm "Клиенты", acDesign,,,, acHidden Set поле = Forms!Клиенты!Имя поле.FontSize = 14 поле.FontName = "Times New Roman Cyr" поле.Enabled = False DoCmd.Save acForm, "Клиенты" DoCmd.OpenForm "Клиенты" End Sub Sub НадписьAccess () Set форма = Forms![Сотрудники] With форма.[ОкладНадпись].Caption = "Должность".Controls![ОкладНадпись].FontName = "Arial Cyr".Оклад.SetFocus.Оклад.Requery.Дата.Enabled = False End With End Sub Sub Form_Current () текст = Me![Поле1] Like "К*" If текст Then MsgBox "Кузнецов!" Else MsgBox "Не он" End Sub Sub Кнопка_ Click () On Error GoTo сообщение Err.Clear With Me !Премия.SetFocus память = !Премия.Text !Оклад.SetFocus !Оклад.Text = Val (!Оклад.Text) + Val (память).Refresh End With Exit Sub сообщение:

MsgBox "Ошибка номер " & Err End Sub Sub КнопкаОшибки_Click () On Error GoTo сообщение Err.Clear число = InputBox ("Введите число") сумма = 50 / число Me!Оклад.SetFocus Me!Оклад.Text = сумма Me.Refresh Exit Sub сообщение:

плохо = "Ошибка № " & Str (Err.Number) & " возникла в " _ & Err.Source & Chr (13) & Err.Description

–  –  –

Sub ОткрытыеОтчеты () список = "Открыто отчетов: " & Reports.Count For Each отчеты In Reports список = список & Chr (13) & отчеты.Name For Each объекты In отчеты.Controls список = список & Chr(13) & "Объект " & объекты.Name Next объекты Next отчеты MsgBox список End Sub Sub АнализТаблицыЧерезФорму () DoCmd.OpenForm "Выставка" MsgBox Forms (“Выставка”).RecordsetClone.RecordCount & " записей " End Sub Sub AccessForm_Open () If Me.RecordsetClone.RecordCount = 0 Then MsgBox "Записей нет", vbInformation Else MsgBox Me.RecordsetClone.RecordCount & " записей" End If End Sub Sub ФормаADO () Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset cnn.Open "DBQ=D:\VAL\Access\Access03\Сотрудники.xls;" _ & "Driver={Microsoft Excel Driver (*.xls)}" rst.CursorType = adOpenStatic rst.Open Лист1, cnn DoCmd.OpenForm “Form1” Set Forms (“Form1”).Recordset = rst Forms (“Form1”).Controls ("Надпись").Caption = rst.RecordCount Forms (“Form1”).Controls ("Список").RowSource = "select * from rst.Source" End Sub Public cnnDBF As New ADODB.Connection Public rstDBF As New ADODB.Recordset Sub ПодключениеКФормеADO () ConnectStr = "DBQ=D:\;Driver={Microsoft dBase Driver (*.dbf)}" cnnDBF.Open ConnectStr With rstDBF.Open "select * from " & ВыборФайла () & _ " where [отдел]=15", cnnDBF, adOpenDynamic, adLockOptimistic MsgBox ДобавитьУдалить ().Close.Open "select * from " & ВыборФайла () _ & " where [отдел]=15", cnnDBF, adOpenStatic, adLockPessimistic End With DoCmd.OpenForm "фILM_Test" Set Forms ("фILM_Test").Recordset = rstDBF End Sub

–  –  –

DoCmd.OpenForm "Сотрудники" End Sub Sub ЗапросAccess () DoCmd.SetWarnings False DoCmd.OpenForm "Сотрудники", acDesign,,,, acHidden DoCmd.OpenQuery "Запрос1" DoCmd.Close acForm, "Сотрудники" DoCmd.SetWarnings True End Sub

–  –  –

Меню создаются и редактируются под управлением редактора меню или с помощью процедур, размещаемых в модулях. Редактор меню представлен вкладкой Команды меню Вид.Панели инструментов.Настройка… Различают встроенные меню приложения и авторские меню пользователя. Каждому пункту авторского меню соответствует индивидуальный макрос или функция. Редактор меню позволяет удалять любой пункт меню, открыв его контекстное меню и выбрав из него Сброс или Удалить при открытом окне Настройка. При этом встроенные меню не удаляются, а скрываются. В любое меню можно добавить новый пункт через вкладку Команды меню Вид.Панели инструментов.Настройка, перетащив необходимый элемент из списка Команды в меню .

Для программирования строк меню используются объекты классов CommandBars и CommandBar из библиотеки Microsoft Office. Первый из классов хранит все строки встроенных меню. Он служит инструментом использования меню приложения и создания авторских меню. Второй класс представляет все пункты конкретного меню. Он служит инструментом использования пунктов меню приложения и создания авторских пунктов .

Ссылки на пункты меню определяются свойством Controls .

Для отображения контекстных меню используется метод ShowPopup, а для удаления всех новых меню, не выведенных на экран, – методы Delete и Reset .

Примеры Sub ВсеСтрокиМеню () For Each строкаМеню In CommandBars Debug.Print строкаМеню.Index, " ", строкаМеню.Name Next End Sub Sub ВсеПунктыМеню () For Each пункт In CommandBars ("Menu Bar").Controls список = список & пункт.Index & " " & пункт.Caption & Chr(13) Next MsgBox список End Sub Sub ЕщеСтрокаМеню () Set новоеМеню = CommandBars.Add (Name:="Игры", _ Position:=msoBarFloating, MenuBar:=False, Temporary:=True) новоеМеню.Visible = True End Sub Sub НаполнениеСтрокиМеню () Set меню = CommandBars (CommandBars.Count) Set новыйПункт = меню.Controls.Add (Type:=msoControlPopup) новыйПункт.Caption = "Информация" Set подпункт1 = новыйПункт.Controls.Add (Type:=msoControlPopup) подпункт1.Caption = "О меню" Set подпункт2 = новыйПункт.Controls.Add (Type:=msoControlPopup) With подпункт2.Caption = "О панелях".Enabled = True.OnAction = "процедураИлиМакрос" End With End Sub Sub УдалениеМеню () For Each меню In CommandBars If Not меню.BuiltIn And Not меню.Visible Then меню.Delete Next End Sub Sub ВосстановлениеМеню () On Error Resume Next For i = 1 To CommandBars.Count CommandBars (i).Reset Next End Sub Панели инструментов VBA позволяет изменить изображение любой кнопки панели инструментов с помощью меню Вид.Панели инструментов.Настройка .

При программировании панели инструментов рассматриваются как разновидности меню .

Примеры Sub НоваяПанельИнструментов () On Error GoTo ошибка Dim новаяПанель As CommandBar Set новаяПанель = CommandBars.Add (Name:="Игры", _ Position:=msoBarFloating, MenuBar:=False, Temporary:=True)

–  –  –

Начальная установка интерфейса База данных Access открывается в соответствии с настройками меню Сервис.Параметры запуска или макросом AutoExec .

Примеры Sub ПараметрыЗапуска () ЗадатьСвойство "StartupForm", dbText, "МояФорма" ЗадатьСвойство "AppTitle", dbText, "Моя форма" ЗадатьСвойство "StartupShowDBWindow", dbBoolean, False ЗадатьСвойство "StartupShowStatusBar", dbBoolean, False ЗадатьСвойство "AllowBuiltinToolbars", dbBoolean, True ЗадатьСвойство "AllowFullMenus", dbBoolean, True ЗадатьСвойство "AllowBreakIntoCode", dbBoolean, False ЗадатьСвойство "AllowSpecialKeys", dbBoolean, True ЗадатьСвойство "AllowBypassKey", dbBoolean, TrueEnd Sub MsgBox(“OK”) End Sub

–  –  –

End If CurrentDb.Properties ("AllowBypassKey") = нуженЛи MsgBox "Свойство установлено" Exit Sub добавитьСвойство:

CurrentDb.Properties.Append _ CurrentDb.CreateProperty ("AllowBypassKey", DbBoolean, нуженЛи) MsgBox "Свойство добавлено и установлено" End Sub Sub УдалитьСвойство () On Error GoTo нетТакогоСвойства CurrentDb.Properties.Delete "AllowBypassKey" Exit Sub нетТакогоСвойства:

MsgBox "Нет такого свойства"




Похожие работы:

«УДК 691.168(575.3) ОЕВ Саидмумин Абдулхакович ЩЕБЕНОЧНО-МАСТИЧНЫЙ АСФАЛЬТОБЕТОН, СОДЕРЖАЩИЙ СТАБИЛИЗИРУЮЩУЮ ДОБАВКУ НА ОСНОВЕ МИКРОКРИСТАЛЛИЧЕСКОЙ ЦЕЛЛЮЛОЗЫ АВТОРЕФЕРАТ диссертации на соискание ученой степени кандидата технических наук по специальности 05.23.05 – Строительные материалы и изделия Душанбе – 2018 Работ...»

«МИНИСТЕРСТВО СТРОИТЕЛЬСТВА ПРЕДПРИЯТИЯ НЕФТЯНОЙ и г а з о в о й п ро м ы ш л енн о сти РУКОВОДСТВО ПО ТЕХНОЛОГИИ И ОРГАНИЗАЦИИ ПЕРЕВОЗКИ, ПОГРУЗКИ, РАЗГРУЗКИ И СКЛАДИРОВАНИЯ ТРУБ МАЛЫХ ДИАМЕТРОВ (100-500 мм) ПРИ СТРОИТЕЛЬСТВЕ НЕФТЕГАЗОПРОВОДОВ Р 5 4 7 -8 4 Москва 1985 сертификат пвх Ш 621.643.002...»

«Информация о конференции.Ёёё Второе информационное письмо Министерство образования и науки Российской Федерации Академия наук Республики Татарстан Казанский (Приволжский) федеральный университет приглашают принять участие в работе VIII-й Международной...»

«БУДАЖАНАЕВА МЭДЭГМА ЦЫРЕНДОРЖИЕВНА СОВЕРШЕНСТВОВАНИЕ МЕХАНИЗМА УПРАВЛЕНИЯ СОЦИАЛЬНО-ЭКОНОМИЧЕСКИМ РАЗВИТИЕМ СЕЛЬСКИХ ТЕРРИТОРИЙ РЕГИОНА Специальность 08.00.05 — Экономика и управление народным хо...»

«ПЛАНШЕТНЫЙ КОМПЬЮТЕР WEXLER.TAB A722 ПЛАНШЕТНЫЙ КОМПЬЮТЕР WEXLER.TAB A722 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ Уважаемые пользователи! Благодарим за выбор продукции под маркой Wexler! Планшетный компьютер Wexler.TAB...»

«РАКЕТНО-КОСМИЧЕСКОЕ ПРИБОРОСТРОЕНИЕ И ИНФОРМАЦИОННЫЕ СИСТЕМЫ 2018, том 5, выпуск 2, c. 34–39 РАДИОТЕХНИКА И КОСМИЧЕСКАЯ СВЯЗЬ УДК 629.372413.47.45.99 DOI 10.30894/issn2409-0239.2018.5.2.34.39 Компактный СВЧ делитель мощности с развязкой между входами В. Г. Алыбин, д. т. н., otdelenie17@spacecorp.ru...»

«Об эффективности криогенной деформации для измельчения микроструктуры меди Т. Н. Конькова1, С. Ю. Миронов1,2, А. В. Корзников1 Учреждение Российской академии наук Институт Проблем Сверхпластичности Металлов РАН, 450001, Уфа, ул. Халтурина, 39, Россия Университет Тохоку, Департамент Обработки Материалов, Высшая Шк...»

«www.scientifitrends.de e-mail: orgcom@scientifictrends.de ПРОГРАММА КОНФЕРЕНЦИИ Современный этап развития научно-технического прогресса ‘2018 The current stage of development of scientific and technological progress' 2018 Сучасний етап розвитку науково-технічного прогресу '2...»







 
2019 www.librus.dobrota.biz - «Бесплатная электронная библиотека - собрание публикаций»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.