Объектно-ориентированное программирование БД. Использование DAO и ADO Модели объектов Access. Процедурное программирование в DAO. Объект Recordset. Визуальное.

Презентация:



Advertisements
Похожие презентации
Основные возможности MS ACCESS. CУБД Access - Представляет из себя программное средство, при помощи которого можно создать многотабличную реляционную.
Advertisements

Выполнение запросов, создание и редактирование отчета MS Access.
СУБД Access Запросы Автор: Тутыгин В.С.. Назначение запросов Запросы обеспечивают простой доступ к определенному подмножеству записей одной или нескольких.
Инструкция по созданию базы данных в Microsoft Access
VBA – Visual Basic for Application (офисное программирование) Назначение VBA VBA является современным языком визуального и объектно-ориентированного программирования.
Тема 5. Основы современной технологии программирования Программирование в средах современных информационных систем. Интегрированные системы разработки.
СУБД Microsoft Access 2003 Элементы языка SQL. Язык SQL SQL (Structured Query Language) – структурированный язык запросов Язык SQL применяется во многих.
Урок 3. Формы представления данных (таблицы, формы, запросы, отчеты)
Модуль 7 Разработка и создание форм. Общие сведения Формы. Основные понятия. Создание форм с помощью мастера. Использование выражений в формах. Работа.
Информационные системы. Базы данных. Информационная система – любая система обработки информации (шир)
База данных (БД) – Совокупность определённым образом организованной информации на определённую тему (в рамках определённой предметной деятельности); Организованная.
Работа с таблицами в MS Access. Таблицы Единицей хранящейся в БД информации является таблица. Таблица представляет собой совокупность строк и столбцов,
Что такое связи между таблицами В реляционной базе данных связи позволяют избежать избыточности данных. Например, в ходе создания базы данных, содержащей.
Базы данных Учебная презентация. Определение База данных (БД) – это информационная модель, позволяющая в упорядоченном виде хранить данные о группе объектов,
Построение запросов в Access. Преимущества запросов Они позволяют собирать воедино информацию из нескольких таблиц, учитывая связи, установленные между.
Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
PL/SQL Курсоры. Курсор – специальный элемент, связанный с SQL-оператором SELECT. Объявление курсора происходит в секции объявления базового блока. Работа.
ТАБЛИЦЫ База данных может включать множество таблиц, в которых хранятся данные по различным темам. Каждая таблица может состоять из множества полей различного.
База данных – это информационная модель, позволяющая в упорядоченном виде хранить данные о группе объектов, обладающих одинаковым набором свойств. Типы.
Тема 6. Технология разработки реляционной модели данных Вопросы 1.Объекты реляционных БД, терминология 2.Разработка структуры БД 3.Нормализация отношений.
Транксрипт:

Объектно-ориентированное программирование БД. Использование DAO и ADO Модели объектов Access. Процедурное программирование в DAO. Объект Recordset. Визуальное программирование в Access

Отношения между объектами (объектно- ориентированный подход) Успех объектно-ориентированного подхода лежит в смещении акцента со структуры данных (в особенности, от вида связей между данными) к процессу, с помощью которого эти данные создаются и уничтожаются. Реальные структуры данных - деталь реализации, лучше всего относящаяся к внутренней работе каждого класса (совокупности объектов). В ООБД в центре разработки оказываются не структуры данных, а процедуры (методы). Свойства ООБД: 1. Абстракция: Каждая реальная "вещь", которая хранится в БД, является членом какого-либо класса. Класс определяется как совокупность свойств (properties), методов (methods), общедоступных (public) и частных (private) структур данных, а также программ, применимых к объектам (экземплярам) данного класса. Классы представляют собой ни что иное, как абстрактные типы данных. Методы - это процедуры, которые вызывается для того, чтобы произвести какие-либо действия с объектом (например, напечатать себя или скопировать себя). Свойства - это значения данных, связанные с каждым объектом класса, характеризующие его тем или иным образом (например, цвет, возраст). Свойства присутствуют не во всех реализациях, по сути дела, они являются краткой записью методов без аргументов (таких как "сообщите свой цвет", "сообщите свой возраст"). 2. Инкапсуляция: Внутреннее представление данных и деталей реализации общедоступных и частных методов (программ) является частью определения класса и известно только внутри этого класса. Доступ к объектам класса разрешен только через свойства и методы этого класса или его родителей (см. ниже "наследование"), а не путем использования знания подробностей внутренней реализации.

3. Наследование (одиночное или множественное): Классы определены как часть иерархии классов. Определение каждого класса более низкого уровня наследует свойства и методы его родителя, если они только они явно не объявлены ненаследуемыми или изменены новым определением. При одиночном наследовании класс может иметь только один родительский класс (т.е. классовая иерархия имеет древовидную структуру). При множественном наследовании класс может происходить от многочисленных родителей (т.е. иерархия классов имеет структуру ориентированного нециклического графа, не обязательно древовидную). Не все объектно-ориентированные СУБД поддерживают множественное наследование. 4. Полиморфизм: Несколько классов могут иметь совпадающие имена методов и свойств, даже если они считаются различными. Это позволяет писать методы доступа, которые будут правильно работать с объектами совершенно различных классов, лишь бы соответствующие методы и свойства были в этих классах определены. Например, метод Print может быть определен во многих классах, но работать по-разному, в зависимости от класса объекта, к которому он применяется. 5. Сообщения: Взаимодействие c объектами осуществляется путем посылки сообщений с возможностью получения ответов. Это отличается от традиционного для других моделей вызова процедур. Для того, чтобы применить метод к объекту, надо послать ему сообщение типа "примени к себе данный метод" (например, "напечатай себя"). Парадигма пересылки сообщений не всегда используется в объектно-ориентированных БД, однако типична для "истинно" ОО-реализаций. Каждый объект, информация о котором хранится в ООБД, считается принадлежащим какому-либо классу, а связи между классами устанавливаются при помощи свойств и методов классов

Модели объектов Access MS Access представлен двумя уровнями компонентов: ядром БД Jet Database Engine (ПО Join* Engine Technology) и СУБД Access (Access Application Layer). 1. На уровне ядра обслуживаются данные - таблицы и запросы. Ядро транслирует операторы программы в физические операции в БД, читает, записывает и модифицирует БД и индексные файлы, блокирует и объединяет записи и выполняет запросы к БД. Для организации данных используется индексно- последовательный метод (ISAM). Этот уровень поддерживается двумя библиотеками классов объектов: DAO (Data Access Objects) и ADO (ActiveX Data Objects – ADODB, ActiveX Data Objects Extensions for DDL and Sequrity – ADOX, Microsoft Jet and Replication Objects – JRO, где ADO - это название протокола взаимодействия с БД, a ADODB - название объекта в библиотеке). DAO и ADO являются интерфейсами, используемым для присоединения к Jet Database Engine: ADODB обеспечивает приложению доступ к источнику данных с возможностью отбора и изменения данных. ADOX позволяет программно изменять структуру объектов источника данных и систему защиты БД. JRO служит для создания, модификации и синхронизации реплик БД Access. 2. СУБД Access обслуживает интерфейс пользователя (формы, отчеты, макросы, меню, панели, окна диалога) и процедуры VBA (БД можно делить на части и хранить отдельно данные, отдельно – интерфейс). Jet Database Engine и СУБД Access взаимодействуют друг с другом с помощью языка SQL и библиотек классов объектов DAO и ADO.

Интерфейсы ODBC и OLE BD 1. Интерфейс ODBC (Open Database Connectivity или Открытый интерфейс доступа к БД) был разработан фирмой MS для унифицированного доступа любого приложения к различным источникам данных с помощью языка SQL. Для подключения к БД с использованием функций ODBC API первоначально следует создать источник данных DSN (Data Source Name), в котором задаются его имя и местоположение БД (имя сервера и имя БД на сервере). Интерфейс ODBC используется библиотекой классов объектов доступа к данным DAO (DataAccess Objects версии 3.6 в Access 2003), к ним относится большинство РБД: MS-SQL server, Oracle, Sybase, DB2 (IBM), SAP. 2. Интерфейс OLE DB (Object Linking and Embedding, связывание и внедрение объектов или OLE для БД) может присоединяться к большинству файлов, в том числе к не реляционным БД, поэтому словосочетание источник данных было решено заменить термином провайдер. Провайдер OLE DB используется для доступа к данным с помощью библиотеки классов объектов доступа к данным ADO (ActiveX Data Objects версии 2.7 в Access 2003). Для доступа используется объект Connection, несущий сведения об источнике данных и его расположении и открывающий сеанс обмена данными через провайдер OLE DB.

Jet Database Engine Библиотека содержит DLL файлы, присоединяемые к проекту в режиме реального времени. Транслирует операторы программы в физические операции в БД. Читает, записывает и модифицирует БД и связанные индексные файлы, обслуживает блокировку и объединение записей и выполняет запросы к БД (содержит процессор БД). DAO и ADO являются интерфейсами, используемым для присоединения к Jet Database Engine. ODBC Клиент-серверные БД, такие, как MS-SQL server, Oracle, Sybase, IBM - DB2, SAP. ODBC использует язык SQL для доступа к БД OLE DB Набор COM-интерфейсов для универсального доступа к данным в различных по типам источниках данных (не реляционных БД) Новый низкоуровневый интерфейс, являющийся частью платформы Universal Data Access Позволяет обращаться к курсору (указателю на запись) Позволяет обрабатывать пакет записей Имеет графические возможности для построения иерархических структур. Позволяет обращаться к сетевым БД ActiveX control ActiveX это OLE с расширением для Internet. Объекты могут подключаться к форме. ActiveX могут добавляться на Web страницы для увеличения их функциональности. С их помощью можно проигрывать файлы.avi

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

Иерархия объектов Jet Data Base Engine Users ErrorsWorkspaces DBEngine GroupsDatabases TableDefsQueryDefs RecordsetsRelations Containers Documents Fields Indexes

Объект DBEngine - процессор ядра БД Jet. Объект DBEngine также содержит в себе семейство Workspaces объектов Workspace, которые устанавливают именованные сеансы работы пользователя. Каждый объект Workspace включает семейство Databases, которое состоит из одного или более объектов Database, являющихся открытыми БД. Объект TableDef, элемент семейства TabieDefs, представляет сохраненное определение основной или присоединенной таблицы. Объект QueryDef, элемент семейства QueryDefs, представляет сохраненное определение запроса в БД Microsoft Jet или временное определение запроса в рабочей области ODBCDirect. Объект Recordset, элемент семейства Recordsets, представляет набор записей в основной таблице или набор записей, который получается в результате выполнения запроса. В объектах Container группируются однотипные объекты, а объект Relation представляет связь между полями таблиц или запросами. Объект Error, являющийся элементом семейства Errors, хранит информацию об ошибках, возникающих при объектном доступе к данным. допустимое объявление переменных Dim fm As Form Dim ws As Workspace Dim db As Database Dim rs As Recordset Dim fld As Field

DBEngine Находится на вершине иерархии объектов DAO и позволяет обращаться к ядру БД - Microsoft Jet Database Engine. Транзакции используются для сохранения (commit) или отката (rollback) изменений в БД. Методы транзакций в DBEngine: BeginTrans CommitTrans Rollback Workspace Поддерживает отдельные транзакции. Позволяет изолировать одну группу транзакций так, что можно выполнить откат. Database Содержит объекты TableDefs, QueryDefs, Relations, Recordsets и Containers. Data Access Objects (DAO)

TableDef Представляет таблицу БД, т.е. коллекцию полей записей QueryDef Используется для создания и изменения запросов к БД. Может иметь объекты Field и Parameter (SQL). Recordset Объект табличной структуры, используется для представления данных из объектов TableDef или QueryDef. Recordset может быть открыт в режиме: Table (чтение и запись) – копия таблицы, медленный метод, связан с нехваткой памяти для всей таблицы Dynaset (чтение и запись) – запрос из таблиц или запросов, более быстрый метод Snapshot (только чтение) - запрос из таблиц или запросов, самый быстрый метод User interface DataBase Engine Data Store

Права на создание набора данных и соответствующие типы набора записей ТАБЛИЦА TelephoneDirectory ПОЛЯ - Name - Department - Extension (Admin Access) Полный доступ ко всем данным (Other) Доступ на чтение (Record Owner) Изменеиие только своих данных VS интерфейс Table Dynaset Snapshot Тип набора Recordset БД

Семейство ОбъектОписание объекта DAO -DBEngine Главный объект ядра БД Microsoft Jet ConnectionsConnection Информация о соединении с источником данных ODBC (рабочая область ODBCDirect) ContainersContainer Хранилище информации об объекте (рабочая область MS Jet) DatabasesDatabase Открытая БД DocumentsDocument Информация о сохраненном объекте (рабочая область MS Jet) ErrorsError Информация об ошибках, ассоциированных с данным объектом FieldsField Поле (столбец) таблицы, запроса, индекса, поле связи между таблицами или запросами, поле набора записей GroupsGroup Группа пользователей с правами доступа к данным (рабочая область MS Jet) IndexesIndex Порядок и уникальность значений в таблице (рабочая область MS Jet) ParametersParameter Параметр для параметризованного запроса PropertiesProperty Встроенная или определенная пользователем х­рактеристика (свойство) QueryDefsQueryDef Описание хранимого в БД запроса RecordsetsRecordset Набор записей в базовой таблице или запросе RelationsRelation Связь между полями таблиц или запросов (используется в рабочей области MS Jet) TableDefsTableDef Описание хранимой в БД таблицы (рабочая область MS Jet) UsersUser Права доступа пользователя к данным (рабочая область MS Jet) WorkspasesWorkspace Сеанс работы с источником данных с помощью ядра БД MS Jet

2. Во главе модели ADO стоит объект Connection (Соединение), оно описывает среду обмена данными. Источник данных управляется производным от Connection объектом Command (Команда), который командами SQL добавляет, удаляет, обновляет и считывает данные. Его семейство Parameters (Параметры) представляет компоненты объекта Command. Другой производный от Connection объект – Recordset – накапливает считанные из источника данные. Его семейство Fields представляет поля таблиц Recordset. Поля характеризуются семействами свойств Properties. Встроенные свойства являются частью объекта ADO и всегда доступны, а динамические свойства существуют только в момент работы источника данных. ADO содержит семь объектов: Connection, Command, Parameter, Recordset, Field, Property, Error (Stream – новый) и четыре семейства (коллекции) объектов: Fields, Properties, Parameters, Errors

Set Con = New ADODB.Connection Con.Open Provider='sqloledb';Data Source='SqlServer';Initial Catalog='Pubs'; & _ Integrated Security='SSPI'; Dim rst As New ADODB.Recordset strSQL = …" rst.Open strSQL, Con, adOpenKeyset, adLockBatchOptimistic, adCmdTable rst.MoveFirst Do Until rst.EOF … rst.MoveNext Loop If MsgBox("Save all changes?", vbYesNo) = vbYes Then rst.UpdateBatch Else rst.CancelBatch End If

Объект ТипОписание объекта модели ADO Connection ОбъектCеанс обмена данными Command ОбъектИнструкция SQL Parameters СемействоПараметр инструкции SQL Recordset Объект Набор записей, осуществляет навигацию по записям и манипуляцию с данными в наборе Fields СемействоПоле (столбец) в наборе записей Recordset Errors СемействоОтвет на одну ошибку, произошедшую во время сеанса связи Property ОбъектХарактеристика (свойство) любого объекта ADO Properties СемействоСвойства объектов Connection, Command, Recordset или Field Объект ТипОписание объекта модели ADOX Catalog ОбъектГлавный объект модели. Доступ к таблицам, представлениям, процедурам, группам, пользователям Tables СемействоТаблицы в источнике данных. Каждый объект Table семейства ссылается на одну таблицу Indexes СемействоИндексы таблицы. Каждый объект Index семейства ссылается на один из индексов Keys СемействоВсе ключи таблицы. Каждый объект Key семейства ссылается на один из ключей Columns СемействоОъекты Column, которые ссылаются на столбцы водном из объектов Table, Index, Key Groups СемействоКаждый из объектов Group ссылается на бюджет группы в каталоге или пользователе Users СемействоБюджеты пользователей, имеющих права доступа к защищенной БД Procedures СемействоХранимые процедуры в БД. Каждый объект procedure семейства ссылается на одну из хранимых процедур Views СемействоСодержит все представления (View) в БД

Метод Clone объекта Recordset (в DAO и ADO) создает копии наборов записей. При копировании организуется указатель текущей записи, а закладки копии совпадают с закладками оригинала. Копия не наследует свойств Index, Filter, Sort. Dim db As Database Dim Products(1 To 3) As Recordset Set db= OpenDatabase("Northwind.mdb") Set Products(1)=db.OpenRecordset & _ ("SELECT ProdName FROM Products ORDER BY ProdName", dbOpenSnapshot) Set Products(2) = Products(1).Clone Метод Relations (DAO) объекта Database описывается связь полей таблиц и запросов. При этом указываются поля в первичной и внешней таблицах. В первой таблице эти поля образуют PK, а во второй таблице – FK. Каждое поле первичного ключа следует добавить в семейство Fields связи с указанием внешнего ключа в свойстве ForeignName. Access устанавливает параметр ссылочной целостности, но не устанавливает каскадное обновление и удаление записей. Set объект Связи = БД.CreateRelation ([«Имя», Таблица, внешняя Таблица, Атрибуты]) объект Связи.Table = «Таблица» объект Связи.ForeignTable = «внешняя Таблица» Set объект Поле = объект Связи.CreateField(«Поле») объект Поле.ForeignName = «Поле» объект Связи.Fields Append объект Поле БД.Relations Append объект Связи

Подключение библиотек объектов Для использования объектов доступа необходимо задать ссылку на библиотеки DAO и/или ADO в редакторе VBA, команда СЕРВИС - ССЫЛКИ (TOOLS - REFERENCES), в окне ССЫЛКИ (REFERENCES) установить флажки. Библиотека, что указана в списке раньше, будет использоваться по умолчанию, или надо явно указывать необходимую библиотеку (DAO или ADO) в коде VBA.

Определение типа набора данных, возвращаемого свойством Recordset формы: Sub CheckRSType() Dim rs as Object Set rs=Forms(0).Recordset If TypeOf rs Is DAO.Recordset Then MsgBox "DAO Recordset" ElseIf TypeOf rs Is ADODB.Recordset Then MsgBox "ADO Recordset" End If End Sub Вы будете работать в среде DAO в Access 2003 в нескольких ситуациях: 1. Если извлекаете recordset формы в БД Access (.mdb), вы получите DAO recordset. Формы в проектах (.adp) используют ADO Recordset. 2. Если преобразуете БД из предшествующей версии Access. Если создаете новую БД в Access 2003, используете библиотеку ADO по умолчанию. Когда создаете новую БД (.mdb) или проект (.adp), Access допускает работу с ADO и устанавливает ссылку на MS ActiveX Data Objects Library. Библиотеки DAO и ADO имеют объекты с одинаковыми именами. Если выбираются обе библиотеки в пределах приложения, то ссылка будет выполнена на объект библиотеки, указанной первой в списке REFERENCES. Можно изменить порядок ссылок или в строке кода прямо сослаться на библиотеку: Dim rst1 As ADODB.Recordset Dim rst2 As DAO.Recordset

Модель объектов СУБД MS Access

Визуальное программирование в Access Для работы с формами и отчетами используется библиотека классов объектов СУБД Access с базовым классом Application (Приложение), описывающим семейства (коллекции) Forms, Reports, Modules, References, DataAccessPages, Controls, и объектами Screen, DoCmd, Module, Assistant, CommandBar Обращение к объектам в иерархии выполняется перечислением всех ее элементов для отслеживания вложенности объектов. Для разделения коллекции объектов и следующего за ним экземпляра коллекции используется восклицательный знак (!). Для разделения объекта и следующего за ним элемента его коллекции используется знак точка (.) Application. Forms! NameOfForm или Forms! NameOfForm Имя формы, содержащее знак пробел, надо заключить в квадратные скобки Application. Forms! [Name Of Form]

Итак, схема обращения к элементам библиотеки классов Access: имя Класса! имя Объекта[.имя ЭлементаУправления].Элемент Восклицательный знак используется для перечисления семейств и объектов в иерархии семейств вплоть до появления свойств и методов объекта. Точка отделяет объект от его свойства или метода, а также разделяет объекты подчиненной формы (отчета): [Forms!Форма!][Объект].[свойство ИлиМетод] [Reports!Отчет!][Объект].[свойство ИлиМетод] [Forms!Главная Форма!]Подчиненная Форма.[Form!]Объект [Forms!Главная Форма!]Подчиненная Форма.ее ИсточникДанных Обращение к объектам форм и отчетов выполняется по схемам: [Forms! Форма!] Объект [Reports! Отчет!] Объект Forms («имя Объекта») Reports («имя Объекта») Forms (индекс Объекта) Reports (индекс Объекта) Forms (ссылочная Переменная) Reports (ссылочная Переменная)

Объект ТипОписание объекта Access Application Объект Активное приложение Access Forms Семейство Все открытые формы Access Pages Семейство Все вкладки формы (Tab Control). Является свойством объекта Control Section Объект Раздел формы или отчета: заголовок, примечание, колонтитулы, раздел данных Reports Семейство Все открытые отчеты Access GroupLevel Объект Массив, содержащий уровни группировки в отчете - GroupLevel (n) Modules Семейства Все открытые стандартные модули и модули объектов Access Screen Объект Ссылка на форму, отчет или элемент управления, который в данный момент имеет фокус DoCmd Объект Запуск макроса или инструкции Access с помощью VBA Controls Семейство Все элементы управления формы, отчета или секции (Checkbox, TextBox, ComboBox, CommandButton, CustomControl, BoundObj ect Frame, Image, ListBox, ObjectFrame, OptionButton, OptionGroup, Page, Section, SubForm, TogleButton) DataAccessPages Семейство Все открытые страницы доступа к данным Access References Семейство Все ссылки на внешние библиотеки и проекты DBEngine Объект DAO Объект самого верхнего уровня модели доступа к данным DAO. CurrentProject Объект Программный проект. Семейства объектов AccessObjects: AllForms, AllReport AllMacros, AllModules, AllDataAccessPages, независимо от того, открыты они или закрыты в данный момент CurrentData Объект Объекты, сохраненные источником данных (ядром Jet и SQL- сервером) в текущей БД: AllTables, AllQueries, AllViews, AllStoredProcedures, All Functions, AllDatabaseDiagrams, независимо от того открыты они или закрыты в данный момент

Основными методами класса Application являются: Метод Назначение CloseCurrentDatabase Закрывает текущую БД из другой базы NewCurrentDatabase Создает новый объект Database из другого приложения OpenCurrentDatabase Открывает в качестве текущей БД объект Database Quit Закрывает Access Run Запускает процедуру Access из другого приложения RunCommand Запускает команду меню или панели инструментов Семейство Forms (Формы) содержит формы и их объекты, принадлежащие классу Controls (Элементы управления). Семейство Reports (Отчеты) включает все отчеты приложения и объекты отчетов того же класса Controls. Семейство Modules (Модули) объединяет все стандартные модули и модули авторских классов, а также модули, связанные с формами и отчетами. Класс объектов Screen используется для работы с окнами. Класс объектов DoCmd позволяет обращаться из модулей к стандартным средствам Access, т.е. дублировать операции интерфейса Access. Методы объекта DoCmd не возвращают значений. Аргументами являются константы Access: acTable, acQuery, acForm, acReport, True, False. Имена объектов помещаются в двойные кавычки. Для выполнения запросов SQL вызывается метод RunSQL объекта DoCmd. DoCmd.OpenForm Объект[,режим Вывода][,Запрос][,условие Отбора][,режим Данных][, режим Окна][, аргументы Открытия] DoCmd.OpenReport Объект[,режим Вывода][,Запрос][,условие Отбора][,режим Данных] [,режим Окна][,аргументы Открытия]

Обращение к активным объектам класса Screen заменяют их свойствами ActiveDataSheet, ActiveForm, ActiveControl, PreviousControl, Application, Parent. Для ссылки на активную форму или отчет из модулей их классов можно так: Me.Элемент Me!Объект Закрытие объектов выполняется методом 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 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 acDesign acFormDS acFormPivotChart acFormPivotTable acNormal default acPreview Немодальный режим открытия окна - допускается переход в другие окна. Модальный режим - форма или отчет сохраняет фокус до своего закрытия. Параматры метода OpenForm: OpenForm(FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs)

Свойство ТипОписание ActiveControl ro, o Активный элемент управления открытой формы Countro, i Число открытых элементов семейства CurrentRecordro, i Номер текущей записи формы Cyclei AllRecords, CurrentRecord или CurrentPage в форме Dirtyro, b Изменена ли текущая запись после сохранения Form ro, o Ссылка на форму HasDataro, i В отчете есть данные (-1) или нет данных (0) Me ro, o Сама форма или отчет MenuBar s Имя строки меню или стандартное меню («») Modal b Модальная ли форма NewRecordro, b Является ли текущая запись формы новой OrderBy s Список полей, определящий порядок сортировки Paintingb Необходимо ли перерисовать форму Picturebmp Имя файла фона PopUpb Всплывающая ли форма RecordSetClone ro, o Доступ к свойствам записей RecordSource RecordSource s Источник данных : таблица или запрос Report ro, o Ссылка на отчет Section ro, o Доступ к области или ее элементу управления ShortcutMenuBar s Имя контекстного меню или стандартное («») StatusBarText s Текст строки состояния формы TabIndexi Номер элемента управления формы ToolBar s Имя панели инструментов или стандартная («») Visibleb Отображается ли на экране Свойства объектов Form и Report o – объект, i – целый, b – логический, s – строковый, ro – только чтение

Sub Закрыть ФормуОтчет () DoCmd.OpenForm Сотрудники,,, Должность = дилер MsgBox Forms (Сотрудники).Caption DoCmd.Close acForm, "Сотрудники", acPrompt DoCmd.OpenReport Сотрудники, acViewPreview MsgBox Reports!Сотрудники.Page DoCmd.Close Save:=acSaveYes End Sub Function Конец РаботыAccess () ответ = MsgBox ("Закончить работу?", vbYesNoCancel + vbQuestion) Select Case ответ Case vbYes DoCmd.Quit acPrompt Конец РаботыAccess = True Case vbNo DoCmd.Close acForm, "Форма Таблицы 1", acSaveYes Конец РаботыAccess = False Case vbCancel Конец РаботыAccess = False End Select End Function OpenArgs – установлен фильтр на значение поля ДОЛЖНОСТЬ

Методы объекта Form Метод Действие GoToPage Передает фокус первому элементу управления активной формы Recalc Обновляет вычисляемые элементы, но не функции SQL Refresh Обновляет записи без учета добавлений и удалений Requery Обновляет источник данных формы (учет добавлений и удалений). Эквивалентно повторному открытию формы SetFocus Передает фокус элементу, ранее последним им владевшему Undo Отменяет изменения в форме Repaint Обновляет экран и завершает вычисления Обновление объектов, активных таблиц и запросов выполняется методом Requery: имя Объекта.Requery DoCmd.Requery Sub Поле ФормыAccess () Dim поле As Control DoCmd.OpenForm "Клиенты" Set поле = Forms!Клиенты![Обращаться к] поле = "Сергей Петров" Forms!Клиенты.Refresh данные обновляются только на форме End Sub

Событие До обновления (BeforeUpdate) возникает в момент перемещения с записи на запись. Если пользователь изменяет запись, свойство формы Dirty становится истинным, и если после этого аргументу Cancel присвоить значение True, событие отменяется. Метод Undo восстанавливает исходные данные. Событие После обновления (AfterUpdate) используется для выполнения определенных действий в зависимости от введенных в поле значений. При передаче фокуса от одного элемента управления к другому возникают события Вход (Enter), соответствующее приему фокуса, и Выход (Exit), соответствующее его потере. Для выявления идентичных объектов можно использовать оператор Is. Он определяет логический результат как Null или Not Null. Для ссылок из формы или отчета на объект Recordset используется свойство RecordSetClone. Оно определяет копию записей базовой таблицы или запроса, указанных в свойстве Источник записей формы. В частности, если форма основана на запросе, то обращение к свойству RecordsetClone эквивалентно созданию копии объекта 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 () 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 () p = Me![Поле 1] Like "К*" логическое значение If p Then MsgBox "Кузнецов!" Else MsgBox "Не он" End Sub Sub Кнопка_ Click () On Error GoTo 1 Err.Clear With Me !Премия.SetFocus память = !Премия.Text !Оклад.SetFocus !Оклад.Text = Val (!Оклад.Text) + Val (память).Refresh End With Exit Sub 1: MsgBox "Ошибка номер " & Err End Sub

Sub Кнопка Ошибки_Click () On Error GoTo 1 Err.Clear n = InputBox ("Введите число") Me!Оклад.SetFocus Me!Оклад.Text = n Me.Refresh Exit Sub 1: m = "Ошибка " & Str (Err.Number) & " возникла в " & Err.Source & Chr (13) & _ Err.Description MsgBox m,, "Ошибка" End Sub Sub ФормаAccess_BeforeUpdate (Cancel As Integer) If Me.Dirty Then данные на форме изменились If MsgBox ("Сохранить изменения?", vbYesNo) = vbNo Then Me.Undo End If End Sub Sub ФормаAccess_AfterUpdate () MsgBox в & Me.Name & кое-что изменилось End Sub

Sub НавигацияAccess() DoCmd.OpenForm "Сотрудники" Set форма = Forms!Сотрудники DoCmd.GoToRecord,, acLast форма.Надпись.Caption = Str(форма.CurrentRecord) DoCmd.GoToRecord,, acNewRec новая запись форма.Фамилия = InputBox ("Следующий?") форма.Refresh End Sub DoCmd.GoToRecord acActiveDataObject(default), ObjectName, acNext(default), Offset Function Подчиненная ФормаAccess() DoCmd.OpenForm "Главная" DoCmd.GoToControl "Подчиненная форма" DoCmd.GoToRecord,, acNewRec With Forms!Главная ![Подчиненная форма]!Подч Товар = !Клиенты Товар ![Подчиненная форма]!Подч Название = !Клиенты Название ![Подчиненная форма]!Подч Цена = !Клиенты Цена End With Forms!Главная.Refresh End Function

Sub Дни_Click () On Error GoTo label0 Dim день(1) As Date, ошибки As Integer, поле As Object Set поле = Me!дата DoCmd.GoToRecord,, acFirst Do While 1 день (0) = поле DoCmd.GoToRecord,, acNext день (1) = поле If DateDiff ("d", день (0), день (1)) <> 1 Then MsgBox день (0) & " или " & день (1) & " неверно" ошибки = ошибки + 1 End If Loop label0: MsgBox "Всего ошибок: " & Str (ошибки) End Sub Sub Открытые Отчеты () список = "Открыто отчетов: " & Reports.Count For Each отчеты In Reports список = список & Chr (13) & отчеты.Name For Each объекты In отчеты.Controls список = список & Chr(13) & "Объект " & объекты.Name Next объекты Next отчеты MsgBox список End Sub

Sub ЗапросSQL () DoCmd.OpenForm "Сотрудники" DoCmd.RunSQL UPDATE Сотрудники SET Родился = #01/12/02# WHERE Номер = 28 DoCmd.RunSQL DELETE FROM Сотрудники WHERE Родился = #01/12/02# DoCmd.RunSQL INSERT INTO Сотрудники (ФИО, Родился, Должность) VALUES (Кто- то, #01/12/12#, Дилер) DoCmd.Requery End Sub Sub Перенумеровать Записи () DoCmd.RunSQL "ALTER TABLE Сотрудники DROP COLUMN z" DoCmd.RunSQL "ALTER TABLE Сотрудники ADD COLUMN z COUNTER" DoCmd.OpenForm "Сотрудники" End Sub Sub ЗапросAccess () DoCmd.SetWarnings False DoCmd.OpenForm "Сотрудники", acDesign,,,, acHidden DoCmd.OpenQuery "Запрос 1" DoCmd.Close acForm, "Сотрудники" DoCmd.SetWarnings True 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:\Сотрудники.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

Курсор Курсор – текущая запись. Типы курсора: adOpenStatic. Изменения, внесенные другими пользователями – невидимы adOpenForwardOnly. Подобен первому типу, однако можно передвигаться только вперед по записям (быстрый метод) adOpenDynamic. Чужие изменения записей отображаются, перемещение по записям в любом направлении. adOpenKeyset. Как третий тип, но не отображаются добавленные записи. Программное блокирование записей Для исключения возможности внесения изменения в запись, редактируемую другим пользователем, каждый пользователь должен заблокировать запись перед ее редактированием. Типы блокировки: adLockReadOnly - чтение записей без их блокировки. adLockPessimistic – запись блокируется при получении доступа к ней и освобождается при переходе к другой записи. adLockOptimistic – запись блокируется в момент ее изменения (update) recordset.Update Fields, Values record.Fields.Update adLockBatchOptimistic - запись блокируется, когда выполняется команда updatebatch (пакетное изменение)

Название текущей версии DAO MS DAO 3.6 Object Library. Обращение к элементам библиотек классов DAO и ADO и все обращения в запросах SQL: имя Класса. имя Объекта. Элемент Составные имена заключаются в скобки []. 1. класс Workspace - доступ к данным модели DAO: DBEngine!CreateWorkspace (имя РабочейОбласти, Пользователь, Пароль [,Тип]) 2. метод CreateDatabase - создание новых БД: [рабочая Область].CreateDatabase (имя Базы Данных,Язык, [Параметры] ) где рабочая Область - ссылка на объект Workspace, Язык (константы dbLangGeneral, dbLangCirillic) определяет порядок сортировки данных, а необязательные Параметры задают формат ядра Jet и необходимость шифрования. 3. метод OpenDatabase - открытие БД: [база Данных.][рабочая Область.]OpenDatabase(имя Базы Данных[,Монопольность [,только Чтение[,Источник]]] ) Если БД уже открыта, к ней удобно обращаться через функцию CurrentDb: CurrentDB!имя Таблицы!имя Поля.имя Свойства, CurrentDB!QueryDefs!имя Запроса Процедурное программирование в DAO

Результирующие множества записей – объекты классов TableDef и QueryDef – создаются методами CreateTableDef, CreateQueryDef: [рабочая Область.]база Данных.CreateTableDef («имя Таблицы») [рабочая Область.]база Данных.CreateQueryDef ([запрос SQL]) Объекты классов TableDef и QueryDef открываются методом OpenRecordset и закрываются с удалением из семейства Databases методом Close объекта Database: база Данных.OpenRecordset (Источник [,Тип, Параметры] ) объект.OpenRecordset (Источник [,Тип, Параметры] ) база Данных.Close объект.Close Поля таблиц вначале создаются, затем добавляются в семейства, после чего обновляется окно БД: Set объект Поле = объект Таблица.CreateField (имя Поля, Тип, [Размер]) объект Таблица.Fields.Append объект Поле база Данных.TableDefs.Append объект Таблица RefreshDatabaseWindow Доступ к полям реализуется через объекты класса Fields: имя ТаблицыИли Запроса.Fields!имя Поля имя ТаблицыИли Запроса. имя Поля имя ТаблицыИли Запроса!Fields!имя Поля имя ТаблицыИли Запроса! имя Поля Parent!имя ПоляГлавной Формы

Извлечение информации с помощью DAO : 1. создать рабочую область (объект Workspace) 2. открыть БД (объект Database) 3. создать набор записей (объект Recordset), выбрать записи и поля Рабочая область - метод CreateWorkspace объекта DBEngine: Set Рабочая Область = CreateWorkspace(Name, UserName, Password, UseType) Рабочая области MS Jet: Dim Рабочая Область As CreateWorkspace Set Рабочая Область = DBEngine.CreateWorkspace(Name:="Моя Область", _ UserName:="admin", Password:="", UseType:=dbUseJet) Рабочая область ODBCDirect (ссылка на объект DBEngine применяется по умолчанию, поэтому во второй инструкции объект DBEngine опущен): Dim Рабочая Область As CreateWorkspace Set Рабочая Область = CreateWorkspace(Name:="Моя Область", UserName:="UID", Passwords:="", UseType:=dbUseODBC) Открыть БД можно методом OpenDatabase объекта Workspace. Set База Данных = Рабочая Область.OpenDatabase (name, options, readonly, connect)

Объект DAO Recordset В модели DAO присутствуют 4 типа объектов RecordSet: 1. Тип Table представляет набор записей одной таблицы открытого файла БД. Он не обрабатывает связанные таблицы и таблицы ODBC и обслуживает только рабочие области Jet. 2. Тип Dynaset представляет динамический набор записей таблицы открытой БД, связанной таблицы, результата выполнения запроса или оператора SELECT. Он состоит из ссылок, поэтому обрабатывается медленнее, чем Table и иногда не обновляется, но охватывает более широкую область данных. 3. Тип Snapshot представляет статическую копию таблицы, запроса или оператора SQL SELECT, удобную для выборки данных и создания отчетов. 4. Тип Forward-Only представляет аналогичную копию, предназначенную для единовременного просмотра данных. БД.OpenRecordSet (Источник [, Тип, Параметры, Блокировка]) Здесь Источник – это строка с именем таблицы, запроса или текстом SQL, далее следует тип объекта RecordSet, по умолчанию Table для таблиц и Dynaset для запросов и связанных таблиц. Любой объект RecordSet существует только в рамках своей процедуры, а затем уничтожается. Его можно закрыть раньше методом Close. Используйте объект Recordset для: создания вложенных форм, т.е. формы с подчиненной формой, для обращения к одному и тому же множеству данных. Это позволит синхронизировать представление данных Set Me.Recordset = Forms!Form1. Recordset обращения к методам объекта Recordset, не поддерживаемым свойствами формы. Например, с методом Find для поиска записи по параметрам, заданным в полях формы.

Sub Рабочая ОбластьDAO () Set область = DBEngine.Workspaces (0) Set новаяБД = область.CreateDatabase ("Школьники.mdb", dbLangGeneral) Set другаяБД = область.OpenDatabase ("Транспорт") MsgBox другаяБД.Name & Chr (13) & новаяБД.Name & Chr (13) & CurrentDb.Name End Sub В отличие от режима работы через интерфейс пользователя, VBA может одновременно открыть несколько БД, хотя на экране отображается только одна из них. Полный путь к открытой БД возвращает выражение объект.Name. Sub Базы ДанныхDAO() 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 tdf.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 Доступ КПолямDAO () MsgBox CurrentDb!Таблица 1.Fields(1).Name & Space (2) & CurrentDb!Таблица 1.Fields(2).Name & Chr (13) & "Всего полей: " & CurrentDb!Сотрудники.Fields.Count End Sub Sub ЗапросDAO () s=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. Update сохраняет изменения. При необходимости буфер копирования очищается методом CancelUpdate: объект.Move… или Find… или Seek объект.Edit объект.имя Поля = Значение объект.Update или объект.CancelUpdate Новые записи не добавляются прямо в БД, а сначала помещаются в буфер копирования, затем обновляют набор методом AddNew. В наборах типа Dynaset и Table без индекса новая запись добавляется в конец набора данных. Для добавленной записи автоматически создается закладка в свойстве LastModified. Указатель текущей записи при этом автоматически не перемещается. Удаляемая запись помещается в буфер удаления и остается текущей. Удаление выполняется без предупреждения и отмены. БД Access необходимо сжимать (до 2 МБ).

Sub ПоискDAO () Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники") tdf1. Index = "PrimaryKey" tdf1. 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) результат Запроса.FindFirst "Фирма = 'Intel'" MsgBox результат Запроса.Fields(0) & " - " & результат Запроса.Fields(2) результат Запроса.FindNext "Фирма = 'Intel'" MsgBox результат Запроса.Fields(0) & " - " & результат Запроса.Fields(2) результат Запроса.MoveLast MsgBox результат Запроса.RecordCount End Sub

Sub Обновление ЗаписейDAO () 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 Анализ ЗаписейDAO () 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=True Then MsgBox "Фирма только одна" rst.Close db.Close Set rst = Nothing Set db = Nothing End Sub

Sub Список Базы ДанныхDAO () Set текущаяБД = CurrentDb Set рабочая Область = DBEngine.Workspaces(0) Set новаяБД = рабочая Область.CreateDatabase ("Студенты.mdb", dbLangGeneral) Set другаяБД = рабочая Область.OpenDatabase ("Фирма ГодПрезидент") For Each БД In рабочая Область.Databases список = список & Chr (13) & БД.Name Next БД MsgBox список End Sub Sub Список ПолейDAO () Set db = CurrentDb Set tdf = db!Таблица 1 For Each fld In tdf.Fields строка = строка & Chr (13) & fld.Name Next fld MsgBox строка End Sub

Sub Замена ДанныхDAO () Set объект = CurrentDb.OpenRecordset ("Товары", dbOpenDynaset) критерий = "NТовара = 1" объект.FindFirst критерий Do Until объект.NoMatch With объект.Edit.NТовара = 333.Update.FindNext критерий End With Loop объект.Close Set объект = Nothing End Sub Sub Чтение ДанныхDAO () В Access для загрузки в массив строк объекта Recordset используется метод GetRows 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

Создание таблицы с помощью DAO Option Explicit 'предписание явного объявления переменных Sub Create_table() Dim db As Database, td As TableDef, fld As Field Объектные переменные для БД, таблиц и полей Set db = CurrentDb Ссылка на текущую БД Set td = db.CreateTableDef("Временная") Новая таблица, метод CreateTableDef объекта Database Set fld = td.CreateField("Номер Зачетки", dbByte) Тип поля Byte, метод CreateField объекта TableDef td.Fields.Append fld 'Добавляем поле в семейство Fields таблицы Set fld = td.CreateField("Фамилия", dbText) Тип поля текстовый td.Fields.Append fld Добавляем поле "Фамилия" в семейство Fields таблицы db.TableDefs.Append td 'Добавляем таблицу к семейству TableDefs БД db.TableDefs.Refresh 'Обновляем количество объектов семейства TableDefs End Sub Удаление таблицы с помощью DAO Sub Del_table() Dim db As Database Set db = CurrentDb 'Устанавливаем ссылку на текущую БД db.TableDefs.Delete "Временная" db.TableDefs.Refresh Set db = Nothing 'Освобождаем объектную переменную End Sub Создание запроса с помощью DAO Public Sub CreateQueryDAO() Dim db As Database, qd As QueryDef, rs As DAO.Recordset Set db = CurrentDb Set qd = db.CreateQueryDef("Отличники")'новый запрос сохраняем в БД qd.SQL = "SELECT код, предмет, оценка FROM Экзамены WHERE (оценка)=5" Set rs = qd.OpenRecordset(dbOpenDynaset)набор записей на базе нового запроса Set rs = Nothing End Sub

Sub ConnectionObjectX() Dim wrkJet as Workspace, dbsNorthwind As Database, wrkODBC As Workspace, conPubs As Connection Set wrkJet = CreateWorkspace("NewJetWorkspace", "admin", "", dbUseJet) ' (DAO) Set dbsNorthwind = wrkJet.OpenDatabase("Northwind.mdb") Set wrkODBC = CreateWorkspace("NewODBCWorkspace", "admin", "", dbUseODBC) (DAO) The DSNs must be configured to use Microsoft Windows NT Authentication Mode to authorize user access to the MS SQL Server Set conPubs=wrkODBC.OpenConnection("Connection1",,, ODBC; DATABASE=pubs; DSN=Publishers") Debug.Print "Database properties:" With dbsNorthwind For Each prpLoop In.Properties Debug.Print " " & prpLoop.Name & " = " & prpLoop.Value Next prpLoop End With For Each conLoop In wrkODBC.Connections Debug.Print "Connection properties for " & conLoop.Name & ":" Next conLoop dbsNorthwind.Close conPubs.Close wrkJet.Close wrkODBC.Close End Sub Cтрока соединения это единое целое, включающее в себя блоки информации о провайдере и пути к БД, разделенные символом точки с запятой

Объекты ADO Connection Recordset

Dim conn As ADODB.Connection'declare conn to be a Connection Set conn = New ADODB.Connection' make a connection object conn.Provider = "Microsoft.Jet.OLEDB.4.0' specify what kind of data provider it is conn.Open "c:/walter/ass21.mdb' open the connection on one database Dim myTableRS As ADODB.Recordset ' declare a recordset Set myTableRS = New ADODB.Recordset' make one ' open it using a table in the database, and the connection myTableRS.Open "myTable", conn, adOpenDynamic, adLockPessimistic myTableRS.MoveFirst ' go to start of recordset ' until we reach the end.. Do Until myTableRS.EOF MsgBox (myTableRS.Fields("ID"))' display the ID field in current row myTableRS.MoveNext' move next row Loop myTableRS.Close'close the recordset Set myTableRS.ActiveConnection = Nothing conn.Close' and the connection Set conn = Nothing

Dim conn As ADODB.Connection Dim myTableRS As ADODB.Recordset Set conn = New ADODB.Connection Set myTableRS = New ADODB.Recordset conn.Provider = "Microsoft.Jet.OLEDB.4.0" conn.Open "c:/walter/ass21.mdb" myTableRS.Open "myTable", conn, adOpenStatic, adLockOptimistic Dim wanted As String Text5. SetFocus wanted = Text5. Text myTableRS.Find "ID = " & wanted If Not myTableRS.EOF Then Label8. Caption = myTableRS.Fields("Name") Else Label8. Caption = "Not found" End If Поиск записи Поиск записиFind a row with a certain key field value and display other field Выбор значения их текстового поля Поиск Отображение результатов

Dim conn As ADODB.Connection Dim myTableRS As ADODB.Recordset Set conn = New ADODB.Connection Set myTableRS = New ADODB.Recordset conn.Provider = "Microsoft.Jet.OLEDB.4.0" conn.Open "c:/bd1.mdb" myTableRS.Open "myTable", conn, adOpenStatic, adLockOptimistic myTableRS.MoveFirst Do While Not myTableRS.EOF myTableRS.Fields("PhoneNumber") = myTableRS.Fields("PhoneNumber") + 1 myTableRS.Update myTableRS.MoveNext Loop myTableRS.Close Set myTableRS.ActiveConnection = Nothing conn.Close Запись результатов в БД

Вставка записей myTableRS.Open "myTable", conn, adOpenDynamic, adLockPessimistic myTableRS.AddNew nameTxtBox.SetFocus myTableRS.Fields("Name") = nameTxtBox.Text phoneTxtBox.SetFocus myTableRS.Fields("PhoneNumber") = phoneTxtBox.Text myTableRS.Update myTableRS.Close Новая запись добавляется в конец таблицы. В РБД порядок записей не имеет значения. Удаление записей IDTxtBox.SetFocus myTableRS.Find "ID = " & IDTxtBox.Text If Not myTableRS.EOF Then myTableRS.Delete myTableRS.Update MsgBox ("Record deleted") Else MsgBox ("No matching record") End If myTableRS.Close

myTableRS.Open "Select ID, name From myTable", conn, adOpenDynamic, adLockPessimistic Do While Not myTableRS.EOF For i = 1 To myTableRS.Fields.Count Debug.Print myTableRS.Fields(i - 1), Next Debug.Print myTableRS.MoveNext Loop _______________________________________________________________ Использование SQL Объект Command Dim conn As ADODB.Connection Set conn = New ADODB.Connection conn.Provider = "Microsoft.Jet.OLEDB.4.0" conn.Open "c:/db1.mdb" Dim myCommand As ADODB.command Set myCommand = New ADODB.command myCommand.ActiveConnection = conn myCommand.CommandText="Update myTable set phone=phone + 2" myCommand.Execute conn.Close Set conn = Nothing

Создание таблицы с помощью ADO Sub ADO() Dim cnn As New ADODB.Connection'Соединение с текущей БД Dim cat As New ADOX.Catalog Set cnn = CurrentProject.Connection 'Используется объект модели объектов Access cat.ActiveConnection = cnn Debug.Print cat.Tables(0).Type Dim Table Set Table = CreateObject("ADOX.Table")'Создаем таблицу в ADO Table.name = "Временная_2" Table.Columns.Append "Номер Зачетки", dbInteger 'Создаем столбец Table.Columns.Append "Фамилия", dbText cat.Tables.Append Table 'Добавляем таблицу к семейству Tables Set cat = Nothing End Sub Удаление таблицы с помощью ADO Sub ADO_del() Dim cnn As New ADODB.Connection 'Соединение с текущей БД Dim cat As New ADOX.Catalog Set cnn = CurrentProject.Connection 'Используется объект модели объектов Access cat.ActiveConnection = cnn Debug.Print cat.Tables(0).Type cat.Tables.Delete ("Временная_2") End Sub

Sub ADO_1() Dim Cnn As New ADODB.Connection, rsADO As New ADODB. Recordset Set cnn = New ADODB.Connection Set rsADO = New ADODB.Recordset Cnn.Mode=adModeShareDenyNoneпо умолчанию Shared cnn.Open "Provider=Microsoft.jet.oledb.4.0;Data Source=D:/Wind.mdb; Set con = CurrentProject.Connection rsADO.Open "tblAccount", cnn, adOpenKeyset, adLockOptimistic Do While Not rsADO.EOF rsADO![Commis]=trim(rsADO![Commis]) rsADO.Update rsADO.MoveNext Loop Set rsADO = Nothing Set cnn = Nothing rsADO.Close cnn.Close End Sub Sub DAO_1() Dim db As DAO.Database, Dim rsDAO As DAO.Recordset Set db = DBEngine.OpenDatabase(D:/Wind.mdb, ReadOnly:=True, Shared:=True) Set db = CurrentDb() Set rsDAO = db.OpenRecordset("tblAccount") Do While Not rsDAO.EOF rsDAO.Edit rsDAO![Commis]=trim(rsDAO![Commis]) rsDAO.Update rsDAO.MoveNext Loop Set rsDAO = Nothing Set db = Nothing rsDAO.Close cnn.Close End Sub Редактирование таблиц с помощью DAO и ADO

FunctionalityDAOADO 1 ADOX 2 JRO (*) Create RecordsetsXX Edit Startup propertiesXX** Support ANSI-92 SQLXX Create TablesXX Create New DatabaseXX* Edit Existing Table propertiesXX Create table relationshipsXX* Create New Users/GroupsXX Edit security settingsXX* Support for new Jet 4.0 Decimal datatypeX Support for Compression attribute for column dataX Edit stored, basic SQL queries or viewsXX* Create permanent queries that are accessible only through codeX* Create queries accessible through database container/UI and codeX Compact/Encode databaseXX4X4 Refresh CacheXX Make Database ReplicableXX3X3 Make Database ReplicasXX3X3 Synchronize ReplicasXX3X3 Edit Database propertiesX Create custom database propertiesX Edit table column propertiesX * - оnly.mdb, ** - only.adp, 1 - Uses Connection object to reference to database; 2 - Uses Catalog object to reference database; 3 - Uses Replica object to reference database; 4 - Uses JetEngine object to reference database

DAOADO (ADODB) DBEngine None Workspace None Database Connection Recordset Dynaset-Type Keyset Snapshot-Type Static Table-Type Keyset с параметром adCmdTableDirect Field Конвертация кода DAO в код ADO Open a Recordset Dim db as Database Dim rs as DAO.Recordset Set db = CurrentDB() Set rs=db.OpenRecordset("Employees") Dim rs as New ADODB.Recordset rs.Open "Employees", CurrentProject.Connection, adOpenKeySet, adLockOptimistic Edit a Recordset rs.Edit rs("TextFieldName") = "NewValue" rs.Update rs("TextFieldName") = NewValue rs.Update Перенос фокуса с текущей записи методами MoveNext, MoveLast, MoveFirst, MovePrevious без метода CancelUpdate приведет к выполнению метода Update

DAO Sub DAOOpenJetDatabase() Dim db As DAO.Database Set db = DBEngine.OpenDatabase(".\NorthWind.mdb") db.Close End Sub ADO Sub ADOOpenJetDatabase() Dim cnn As New ADODB.Connection cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;" cnn.Close End Sub DAO Sub DAOOpenJetDatabaseReadOnly() Dim db As DAO.Database ' Open shared, read-only. Set db = DBEngine.OpenDatabase (".\NorthWind.mdb", False, True) db.Close End Sub ADO Sub ADOOpenJetDatabaseReadOnly() Dim cnn As New ADODB.Connection ' Open shared, read-only cnn.Mode = adModeRead cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\NorthWind.mdb;" cnn.Close End Sub DAO в ADO с помощью Microsoft Jet Provider

DAO Sub DAOOpenRecordset() Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.Field Set db = DBEngine.OpenDatabase(".\NorthWind.mdb") ' Open the forward-only, read-only recordset Set rst = db.OpenRecordset ("SELECT * FROM Customers WHERE Region = 'WA'", dbOpenForwardOnly, dbReadOnly) ' Print the values for the fields in the first record in the debug window For Each fld In rst.Fields Debug.Print fld.Value & ";"; Next rst.Close End Sub ADO Sub ADOOpenRecordset() Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset, fld As ADODB.Field cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\NorthWind.mdb;" ' Open the forward-only, read-only recordset rst.Open "SELECT * FROM Customers WHERE Region = 'WA'", cnn, adOpenForwardOnly, adLockReadOnly For Each fld In rst.Fields Debug.Print fld.Value & ";"; Next rst.Close End Sub

DAO' Open the forward-only, read-only recordset Sub DAOMoveNext() Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.Field Set db = DBEngine.OpenDatabase (".\NorthWind.mdb") Set rst = db.OpenRecordset("SELECT * FROM Customers WHERE Region = 'WA'", dbOpenForwardOnly, dbReadOnly) While Not rst.EOF For Each fld In rst.Fields Debug.Print fld.Value & ";"; Next rst.MoveNext Wend rst.Close End Sub ADO' Open the forward-only, read-only recordset Sub ADOMoveNext() Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset, fld As ADODB.Field cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;" rst.Open "SELECT * FROM Customers WHERE Region = 'WA'", cnn, adOpenForwardOnly, adLockReadOnly While Not rst.EOF For Each fld In rst.Fields Debug.Print fld.Value & ";"; Next rst.MoveNext Wend rst.Close End Sub

DAO Sub DAOAddRecord() Dim db As DAO.Database, rst As DAO.Recordset Set db = DBEngine.OpenDatabase (".\NorthWind.mdb") Set rst = db.OpenRecordset("SELECT * FROM Customers", dbOpenDynaset) rst.AddNew ' Specify the values for the fields rst!CustomerId = "HENRY" rst.Update ' Save the changes you made to the current record in the Recordset ' Position recordset on new record rst.Bookmark = rst.LastModified Debug.Print rst!CustomerId rst.Close End Sub ADO Sub ADOAddRecord() Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;" rst.Open "SELECT * FROM Customers", cnn, adOpenKeyset, adLockOptimistic rst.AddNew ' Specify the values for the fields rst!CustomerId = "HENRY" rst.Update Debug.Print rst!CustomerId rst.Close End Sub В DAO запись, которая была текущей перед вставкой новой записи, остается текущей записью, поэтому переводим курсор на новую запись. В ADO новая запись сразу становится текущей.

DAO Sub DAOUpdateRecord() Dim db As DAO.Database, rst As DAO.Recordset Set db = DBEngine.OpenDatabase(".\NorthWind.mdb") Set rst = db.OpenRecordset("SELECT * FROM Customers WHERE CustomerId = 'LAZYK'", dbOpenDynaset) rst.Edit ' Update the Contact name of the first record rst.Fields("ContactName").Value = "New Name" rst.Update rst.Close End Sub ADO Sub ADOUpdateRecord() Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;" rst.Open "SELECT * FROM Customers WHERE CustomerId = 'LAZYK'", cnn, adOpenKeyset, adLockOptimistic rst.Fields("ContactName").Value ="New Name" rst.Update rst.Close End Sub

DAOExecuting a nonparameterized stored query Sub DAOExecuteQuery() If gbBreakEach Then Stop Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.Field Set db = DBEngine.OpenDatabase(".\NorthWind.mdb") Set rst = db.OpenRecordset("Products Above Average Price", dbOpenForwardOnly, dbReadOnly) While Not rst.EOF For Each fld In rst.Fields Debug.Print fld.Value & ";"; Next rst.MoveNext Wend rst.Close End Sub ADO Sub ADOExecuteQuery() Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset, fld As ADODB.Field cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;" rst.Open "[Products Above Average Price]", cnn, adOpenForwardOnly, adLockReadOnly, adCmdStoredProc While Not rst.EOF For Each fld In rst.Fields Debug.Print fld.Value & ";"; Next rst.MoveNext Wend rst.Close End Sub

DAOExecuting a parameterized stored query Sub DAOExecuteParamQuery() Dim db As DAO.Database, qdf As DAO.QueryDef, rst As DAO.Recordset, fld As DAO.Field Set db = DBEngine.OpenDatabase(".\NorthWind.mdb") Set qdf = db.QueryDefs("Sales by Year") ' Get the QueryDef from the QueryDefs collection qdf.Parameters("Forms!Sales by Year Dialog!BeginningDate") = #8/1/1997# ' Specify the parameter values Set rst = qdf.OpenRecordset(dbOpenForwardOnly, dbReadOnly) While Not rst.EOF ……………. rst.MoveNext Wend rst.Close End Sub ADO Sub ADOExecuteParamQuery() Dim cnn As New ADODB.Connection, cat As New ADOX.Catalog, cmd As ADODB.Command, rst As New ADODB.Recordset cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;" cat.ActiveConnection = cnn Set cmd = cat.Procedures("Sales by Year").Command ' Get the Command object from the Procedure cmd.Parameters("Forms![Sales by Year Dialog]!BeginningDate") = #8/1/1997# rst.Open cmd,, adOpenForwardOnly,adLockReadOnly, adCmdStoredProc While Not rst.EOF ……………. rst.MoveNext Wend rst.Close End Sub

БД Библиотека Dim rst As Recordset, strSQL as string Screen.PreviousControl.SetFocus If Not IsNull(Me.id_книга) Then If Not IsNull(Me.прим) Then strSQL = "SELECT [фонд].[id_книга], [фонд].[прим] & _ FROM фонд WHERE ([фонд].[id_книга]=" & Me.id_книга & ");" Set rst = CurrentDb.OpenRecordset(strSQL) rst.Edit If IsNull(rst![прим]) Then rst![прим] = Me.прим Else rst![прим] = rst![прим] & "; " & Me.прим End If rst.Update rst.Close Set rst = Nothing End If Набор записей, отображаемый в подчиненнной форме

Private Sub id_книга_BeforeUpdate(Cancel As Integer) Dim rst1, rst2 As Recordset, strSQL1 as String, strSQL2 As String If Me.id_книга <> 0 Then strSQL1="SELECT фонд.кол FROM фонд WHERE (фонд.id_книга=" & Me.id_книга & "); " Set rst1=CurrentDb.OpenRecordset(strSQL1) strSQL2= "SELECT count(выдано.id_книга) as count1 FROM выдано INNER JOIN фонд ON выдано.id_книга = фонд.id_книга WHERE (фонд.id_книга=" & Me.id_книга & "); " Set rst2 = CurrentDb.OpenRecordset(strSQL2) If (rst1![кол] - rst2!count1) <= 0 Then MsgBox "Все книги на руках" Me.Undo Me![id_книга].Requery End If End Sub Код на событии ПОСЛЕ ОБНОВЛЕНИЯ поля СПИСОК КНИГ по указанной тематике

Sub update_table(table1) Dim strsql1 As String, rst1 As Recordset strsql1 = "SELECT " + table1 + ".выбор FROM " + table1 + " where " + table1 + ".выбор=true" Set rst1 = CurrentDb.OpenRecordset(strsql1, dbOpenDynaset) If rst1. RecordCount <> 0 Then rst1. MoveLast rst1. MoveFirst For i = 1 To rst1. RecordCount - 1 rst1. Edit rst1![Выбор] = False rst1. Update rst1. MoveNext Next rst1. Edit rst1![Выбор] = False rst1. Update rst1. Close End If End Sub Код на закрытии формы Фото-видео (для снятия отметок о выборе товара в исходной таблице) Private Sub Form_Unload(Cancel As Integer) Call update_table("[Фото-видео]") End Sub БД Компьютерный Магазин

Dim conn As ADODB.Connection'declare conn to be a Connection Set conn = New ADODB.Connection'make a connection object conn.Provider = "Microsoft.Jet.OLEDB.4.0'specify what kind of data provider it is conn.Open "c:/walter/ass21.mdb'open the connection on one database Dim myTableRS As ADODB.Recordset'declare a recordset Set myTableRS = New ADODB.Recordset'make one ' open it using a table in the database, and the connection myTableRS.Open "myTable", conn, adOpenDynamic, adLockPessimistic myTableRS.MoveFirst'go to start of recordset Do Until myTableRS.EOF'until we reach the end MsgBox (myTableRS.Fields("ID"))'display the ID field in current row myTableRS.MoveNext'move next row Loop myTableRS.Close'close the recordset Set myTableRS.ActiveConnection = Nothing conn.Close 'close the connection Set conn = Nothing

Протокол OLE DB Пример использования объекта ADODB.Connection Sub DemoADODB() Const Provider = "Provider=Microsoft.Jet.OLEDB.4.0;" Const DataSource = "Data Source=C:\Data\Hours.mdb" Dim Connection As New ADODB.Connection On Error GoTo Finally Call Connection.Open(Provider & DataSource) Connection.Close Finally: If (Err.Number <> 0) Then MsgBox Err.Description End If Set Connection = Nothing End Sub Sub Текущая ЗаписьADO () Dim rst As New ADODB.Recordset rst.Open "Сотрудники", CurrentProject.Connection Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") rst.Close End Sub

Извлечение информации с помощью ADO : 1. Объявить переменную-объект класса ADODB.Connection. 2. Задать информацию о провайдере OLE DB 3. Открыть соединение. 4. По завершении работы освободить память, выделенную объекту Connection. Sub DemoADODB() Const Provider = "Provider=Microsoft.Jet.OLEDB.4.0;" Const DataSource = "Data Source=C:\Data\Hours.mdb" Dim Connection As New ADODB.Connection On Error GoTo Finally Call Connection.Open(Provider & DataSource) ….. Set Connection =Nothing Connection.Close Finally: If (Err.Number <> 0) Then MsgBox Err.Description End If Set Connection =Nothing Connection.Close End Sub

После объявления переменной Recordset объект надо заполнить, используя: метод Open объекта Recordset; метод Execute объекта Command; метод Execute объекта Connection. 1. Метод Open, если используется простая инструкция Select: Dim con As New Connection Dim rst As Recordset Dim strSQL As String …………….. соединение и открытие БД strSQL = "SELECT * FROM Toys" Set rst.ActiveConnection = con rst.Open strSQL,,adOpenForwardOnly, adLockReadOnly, adCmdText нет 2-го аргумента 2. В приложениях клиент/сервер обращение к сохраненным запросам методом Execute: Dim con As New Connection Dim cmd As New Command Dim rst As Recordset Dim strSQL As String …………….. соединение и открытие БД With cmd Set.ActiveConnection = con.CommandText = strSQL.CommandType = adCmdText End With rst.CursorType = adOpenForwardOnly rst.lockType = adLockReadOnly Set rst = cmd.Execute()

3. Метода Execute объекта Connection позволяет работать с сохраненными процедурами. Однако, если для выполнения процедур необходимы определенные параметры, придется включить эти параметры в инструкцию SQL: Dim conVert As New Connection Dim rst As Recordset Dim strSQL As String …………….. соединение и открытие БД rst.CursorType = adOpenForwardOnly rst.LockType = adLockReadOnly Set rst = conVert.Execute() Если известно, что подключение необходимо только для одного объекта Recordset, можно указать строку подключения в качестве 2-го аргумента метода Open объекта Recordset без выделения переменной для подключения к БД: Dim rst As New Recordset Dim strSQL As String, strConnect As String strConnect = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Data\Shop.mdb" strSQL = "SELECT * FROM Bicycles" rst.Open strSQL, strConnect, adOpenForwardOnly Создание подключения на лету

1. Если используется обращение к БД Jet, то Access автоматически создает объект Connection для объекта CurrentProject, который можно использовать: Dim conADOConnection As Connection ADO Set conADOConnection = CurrentProject.Connection 2. Подключение с БД SQL Server в проекте Access - свойство BaseConnectionString объекта CurrentProject: Dim conADO Аs New Connection conADO.ConnectionString = CurrentProject.BaseConnectionString 3. Эквивалентные примеры создания объекта Connection для БД Jet: 1. Dim. conADOConnection As New Connection ADO Dim strCont As String strCon = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Data\Toys.mdb" conADOConnection.Open strCon 2. Dim conADOConnection As New Connection ADO With conADOConnection.Provider="Microsoft.Jet.OLEDB.4.0;".Properties("Data Source") - "=C:\Data\Toys.mdb".Open End With 4. Пример для SQL Server: Dim conADOConnection As New Connection ADO Dim strCon As String strCon="Provider=SQLOLEDB; Data Source=DSN1; Initial Catalog=toys;User ID=sa; Password=;" conADOConnection.Open strCon

Курсор необходим для перемещения между записями. По умолчанию тип Forward-only. Выбор типа курсора

Свойство LockType по умолчанию имеет свойства adLockPessimistic. Блокирование

Методы Recordset Основные –rst.Open –rst.Close Перемещение по записям –rst.Movefirst –rst.MoveLast –rst.MoveNext –rst.MovePrevious Поиск –rst.Find –rst.Seekесли поле проиндексировано (rst.seek 1234, asSeekFirstEQ) Редактирование –rst.AddNew –rst.Delete –rst.Update

Перемещение по набору записей (ADO) Методы MoveFirst, MoveLast, MoveNext и MovePrevious. Метод Move позволяет перемещаться на определенное количество записей в наборе вперед или назад. Например, инструкция rst.Move -3 перемещает на три записи назад. Для возвращения к определенной записи, для нее создается закладка: var Bookmark1 = rst.Bookmark … rst.Bookmark = varBookmarkl Метод Seek, а также методs FindFist, FindLat, FindNext и FindPrevious позволяют отследить определенную запись, базируясь на ее содержимом. Метод Seek работает быстрее, однако, прежде содержимое БД должно быть проиндексировано. Метод AddNew добавляет новую запись в набор. Метод позволяет указать поля и их значения: With rst.AddNew Array ( "Имя", "Возраст", "Пол), Array("Анна", 42, "Ж") End With Для удаления текущей записи предназначен метод Delete. Добавление и удаление записей

Чтение поля Работа с текущим значением - укажите поле по имени или по его индексному номеру: If rst.Fields("Service visits").Value >10 MsgBox "This unit needs a major overhaul!" End If strCurrentFieldData = rst.Fields(3) Поскольку Fields является семейством по умолчанию объекта Recordset, его указывать не обязательно: rst!Date = #5/15/2001# rst.fields!Date With rst intltems =![Oil cans] rst.fields![Oil cans] End With Указать новое значение и переместиться к другой записи: With rst.Fields(0).Value = Lemon.MoveNext End With Если надо остаться на текущей записи – метод Update: With rst.Value=2. Update End With Изменение поля

Recordset - свойства rst.recordCount rst.BOF rst.EOF rst.AbsolutePosition rst.Fields.Count Обращение к полям записи Каждая запись содержит поля, к каждому из которых можно обратиться по индексу (начиная с 0) следующими способами: номер индексаrec(0) имя поляrec(surname) переменнаяrec(fieldpos) выражениеrec(fieldpos + 3)

Объект Command представляет инструкцию SQL или сохраненную процедуру. Средства доступа OLE DB Provider не нужны. Для входных параметров определить объекты Parameter коллекции Parameters. Значение adCmdText передает инструкцию SQL источнику данных: Dim con As Connection Dim cmdVBA As Command Dim prmDate Set cmdVBA = New Command With cmdVBA.ActiveConnection = con соединение определено и открыто.CommandText = "qryDeleteOldRecords имя хранимой процедуры.CommandType = adCmdStoredProc, adCmdTable ' in Jet.CommandText = "UPDATE Bicycles SET OnSale = True WHERE Category = 4;".CommandType = adCmdText.Execute End With Set prmDate =New Parameter With prmDate.Name = "Date".Value = InputBox "Enter the cut-off date.".Type = adDate.Direction = adParamlnput End With With cmdVBA.Parameters.Append prmDate ' Добавление параметра.Execute End With Использование объекта Command Для запроса, сохраненного в БД Jet/Access, используйте значение adCmdTable свойства CommandType объекта Command, а не adCmdStoredProc, относящееся к SQL Server и другим серверам БД.

SQL В коде VBA принято использовать одинарные кавычки для определения строки в инструкции SQL: strSQL = "SELECT Name FROM Kids WHERE Hates = 'Brocolli' " cmd.CommandText = strSQL Если часть инструкции SQL основывается на переменной, например, запрос базируется на данных, введенных пользователем в текстовом поле формы, то добавьте значение переменной к остальной части строки. Если переменная представляет строковое значение, заключите ее в одинарные кавычки: StrSQL = "SELECT Name FROM Kids WHERE Hates = ' " & frmInputForm.TextBoxl & " ' " Если переменная представляет данные, а не строку, заключите ее между символами #. Переменные, представляющие числовые значения, не требуют использования каких-либо открывающих и закрывающих символов.

Dim rs As Object Dim rs As Recordset Dim int As Integer ' nonobject variable declaration Dim db As Database ' object variable declaration InputBox(prompt [, title] [, default]) On Error Resume Next Sub example() On Error GoTo ERR_EXAMPLE MsgBox rs.RecordCount Exit Sub ERR_EXAMPLE: MsgBox Err.Description, vbCritical Resume Next End Sub

Макрокоманда, метод или объект Объект запускает ся из Источник Пример Макрокоманда runSQL DoCmd Строка SQLDoCmd.runSQL strSQL Макрокоманда OpenQuery DoCmd Заготовленный запрос DoCmd.OpenQuery qryTotals Метод Open Recordset (DAO) Включение или БД Строчка SQL или заготовленный запрос db. OpenRecordset strSQL Метод Open (DAO) Включение или набор записей Строка SQL, заготовленный запрос или процедура rs.Open SELECT * FROM t Метод Execute (DAO) Включение или БД Строка SQLdb.execute strSQL Метод Execute (ADO) Включение или команда Строка SQLcnn.execute strSQL QueryDef (заготовленны й запрос DAO) Включение или БД Заготовленный запрос db.QueryDefs ("qryTotals") Методы запуска запросов