Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
102
Добавлен:
02.04.2015
Размер:
2.05 Mб
Скачать

Лабораторная работа №6. ИспользованиеAccessvbAпри решении задач обработки баз данных

Цель лабораторной работы

Лабораторная работа предназначена для получения практических навыков создания кодов VBA в Access на основе объектного событийно-управляемого подхода, что предполагает использование объектов Access Application, объектов доступа к данным DAO, ADO и объектов Access VBA.

Основные сведения об объектах ACCESS, DAO и ADO.

Объекты Access Application

К основным объектам Access Application относятся:

  • Объект Application представляет саму СУБД Access, а также среду для выполнения макрокоманд и процедур VBA. При установке характеристик объекта Application изменяются свойства всей среды Access.

  • Объекты Form ссылаются на конкретную открытую форму и являются членами совокупности Forms. Добавить объект или удалить его из совокупности Forms можно, только открыв или закрыв форму. Существует около 30 свойств событий, распознаваемых формой.

  • Объекты Report ссылаются на конкретный открытый отчет и являются членами совокупности Reports. Добавить объект или удалить его из совокупности Reports можно, только открыв или закрыв отчет. Отчет распознает семь свойств событий.

  • Объект Control представляет элемент управления в форме или отчете и принадлежит к совокупности Controls данной формы или отчета. Каждый тип элемента управления имеет собственный набор свойств, включая характеристики распознаваемых им событий.

  • Объект DoCmd - необычный объект, доступный только в VBA. Не представляя никакой физической сущности с заданными свойствами и поведением, он осуществляет важную связь между макропрограммированием и программированием на VBA. Его можно использовать при выполнении макродействий в Visual Basic.

Использование объектов Access Application

В семействах Forms и Reports содержатся лишь объекты, которые были открыты при помощи оператора DoCmd: Open тип_объекта или его эквивалентов.

Объект Form представляет форму MS ACCESS, открытую в режиме Design(Конструктор), Form(Режим формы) или DataSheet (Режим таблицы.

Чтобы начать работу с объектом Form, необходимо открыть форму, используя метод OpenForm объекта DoCmd. При неоднократном обращении к одному и тому же объекту Form лучше объявить объектную переменную, которая будет передавать этот объект.

Объект Report представляет собой отчет MS ACCESS, открытый в режиме Design (Конструктор), Print Preview (Предварительный просмотр) или Layout Preview (Образец).

Чтобы в VB можно было работать с объектом Report, сначала надо открыть отчет методом OpenReport объекта DoCmd. Можно получить ссылку на объект Report и присвоить ее объектной переменной.

Метод объекта DoCmd, соответствующий макрокоманде, обычно выполняет точный эквивалент макродействия. Методы объекта не возвращают значения или объекты и поэтому имеют следующий синтаксис:

DoCmd.метод аргумент1, аргумент2,...,аргументN

Существует два типа методов DoCmd, работающих с объектом Application в Access. Согласно одному из них объект нужно задавать как аргумент метода.

Например:

DoCmd.OpenReport"Приказ"

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

Например:

DoCmd.Close

Объекты DAO

Объекты DAO используются для управления базами данных из всех приложений, поддерживающих VBA.

Они позволяют:

  1. Проектировать и создавать базы данных, изменять определения таблиц, запросов, индексов и связей.

  2. Добавлять, удалять и изменять записи в базах данных.

  3. Защищать и обеспечивать безопасность данных в базах данных.

  4. Работать с различными форматами данных и присоединять таблицы из других баз данных.

  5. Использовать информацию из удаленных баз данных и создавать приложения клиент-сервер.

К наиболее часто используемым объектам DAO относятся:

  • Объект Database представляет открытую базу данных. Одновременно в одном рабочем пространстве можно открыть несколько баз данных. Существующая база данных открывается в процедуре VBA с помощью метода OpenDatabase объекта Workspace (рабочего пространства, создаваемого автоматически при запуске Access). Для ссылки на текущую базу данных Access позволяет использовать функцию CurrentDb().

  • Объект Recordset представляет набор записей в таблице базы данных либо набор записей, получаемых в результате выполнения запроса или оператора SQL. В непустом объекте Recordset можно указать одну текущую запись.

Каждый объект Recordset состоит из записей и полей. Создаются объекты Recordset при вызове метода OpenRecordset. Этим методом обладают разные классы объектов: Database, QueryDef, RecordSet, TableDef. Каждый объект этих классов может породить набор записей(таблицу), составляющую новый объект RecordSet.

Перемещение по записям

Методы MoveLast, MoveFirst, MoveNext и MovePrevious находят в указанном объекте Recordset последнюю, первую, следующую за текущей и предыдущую запись и делают ее текущей.

Для перемещения на заданное число записей вызывается метод Move.

Добавление записей методом AddNew

Синтаксис использования метода:

набор записей.AddNew

Удаление записей

Для удаления текущей записи объекта RecordSet используется метод Delete:

набор_записей.Delete

Изменение текущей записи

Для изменения текущей записи используется метод Edit:

набор_записей.Edit

Объекты ADO

Объекты управления данными ActiveX (ADO, ActiveX Data Objects) предназначены для обеспечения доступа к источникам данных разных видов, от текстовых файлов до распределенных баз данных. ADO представляет собой объектно-ориентированный интерфейс для приложений, использующих OLE DB. Хотя OLE DB является мощным интерфейсом для работы с данными, этот интерфейс является низкоуровневым. Объекты ADO обеспечивают программный интерфейс высокого уровня, упрощающий работу с данными.

Существуют три объектные модели, которые вместе обеспечивают те функции работы с данными, которые реализуются объектами DAO:

Microsoft ActiveX Data Objects 2.1 (ADODB)

Microsoft ActiveX Data Objects Extensions for DDL and Security 2.1 (ADOX)

Microsoft Jet and Replication Objects 2.1 (JRO)

Объектная модель ADODB обеспечивает приложению доступ к источнику данных и возможность отбирать для просмотра и изменять данные. Однако она не предоставляет возможности изменять структуру таблиц и других объектов источника данных.

Объектная модель ADOX позволяет программно изменять структуру объектов в источнике данных (добавлять и изменять таблицы, структуру таблиц создавать и изменять запросы и управлять схемой защиты данных).

Объектная модель JRO позволяет создавать, модифицировать и синхронизировать реплики и может работать только с базами данных Access.

Объект Connection открывает сеанс обмена данными.

Объект Command представляет собой инструкцию SQL.

Parameters является семейством объектов Parameter, каждый из которых представляет собой параметр инструкции SQL.

Объект Recordset представляет собой набор записей и позволяет осуществить навигацию по записям и манипулирование с данными в нем.

Fields является семейством объектов Field, каждый из которых представляет собой поле (столбец) в наборе записей Recordset.

Errors является семейством объектов Error. Все объекты в этом семействе создаются в ответ на одну ошибку, произошедшую во время сеанса связи.

Catalog – главный объект этой модели. Ссылается на источник данных и обеспечивает доступ ко всем объектам источника – таблицам, представлениям, процедурам, группам, пользователям.

Tables – семейство таблиц, содержащихся в источнике данных. Каждый объект Table этого семейства ссылается на одну таблицу.

Indexes – содержит все индексы таблицы. Каждый объект Index семейства ссылается на один из индексов.

Keys – содержит все ключи таблицы. Каждый объект Key семейства ссылается на один из ключей.

Columns – содержит объекты Column, которые ссылаются на столбцы в одном из объектов Table, Index, Key.

Groups – содержит все объекты Group каталога или пользователя.

Users – содержит объекты User, которые представляют собой бюджеты пользователей, имеющих права доступа к защищенной базе.

Procedures – содержит все хранимые процедуры в базе данных. Каждый объект Procedure ссылается на одну из хранимых процедур.

Views – содержит все представления (View) в базе данных.

Основные сведения о программировании в Access VBA

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

Access 2000 поддерживает три типа модулей: стандартные, модули формы и модули отчета.

Стандартный модуль создается для хранения кода Access VBA так же, как создается любой другой объект БД. Использование стандартных модулей для хранения кода Access VBA ускоряет открытие форм и отчетов, но замедляет начальный запуск приложения.

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

Для открытия модуля формы необходимо нажать кнопку «Программа» на панели инструментов в режиме конструктора формы или выполнить команду Вид/Программа. В любом случае откроется модуль Form_имя_формы. В Access 2000 формы имеют новое свойство «Наличие модуля». Если ему присвоено значение «Да», значит, форма имеет модуль класса, «Нет» – в форму нет необходимости добавлять какой-либо код.

Модули отчета содержат код, являющийся реакцией на события, запущенные отчетами, разделами отчетов. Элементы управления отчетов не запускают события. Модули отчета открываются так же, как модули формы и автоматически приобретают название Report_Имя_отчета.

Особенности работы с объектами

Перед каждой операцией работы с объектом необходимо применить ссылку на объект.

Один из способов ссылки на объект состоит в том, чтобы, начав с верхнего объекта иерархии, указать маршрут к целевому объекту (записав имена всех объектов и совокупностей на пути к нему). Объекты разделяются восклицательным знаком и точкой.

  • Восклицательный знак применяется при переходе от совокупности к одному из ее членов:

имя_совокупности!имя_объекта

например:

Forms!formname

  • Точка используется при переходе от объекта к одной из совокупностей:

имя_объекта.имя_совокупности

например:

Forms!formname.Controls

Forms!formname.Controls!controlname

  • Если имя объекта содержит пробелы, его нужно заключить в квадратные скобки:

Forms!Switchboard

Reports![Expense Report]

  • Для отделения названия характеристики от имени объекта используется операция точки:

Forms![Expense Categories].RecordSource

  • синтаксис ссылки на поле в таблице или запросе зависит от того, относится ли таблица или запрос к базовому источнику записей открытой формы.

Ссылка на поле в источнике записей формы имеет синтаксис:

Forms!имя_формы!имя_поля

Ссылка на поле в таблице или запросе основана на применении синтаксиса:

имя_таблицы.Fields!имя_поля или имя_таблицы!имя_поля

имя_запроса.Fields!имя_поля или имя_запроса!имя_поля

В программировании на VBA переменная - это временная область памяти, содержащая значение или используемая для ссылки на объект. Такой области присваивается имя.

В VBA объект можно рассматривать как совокупность характеристик и методов. Процедура VBA способна непосредственно считывать и изменять характеристики, а также манипулировать объектом, выполняя его методы.

При работе с характеристиками в VBA доступны два действия:

  • изменение значения характеристики, т.е. ее установка

  • считывание значения характеристики, т.е. ее получение.

При установке значения характеристики ей присваивается значение:

объект.имя_характеристики=значение

или

объект.имя_характеристики<значение

При получении характеристики считывается ее текущее значение. Для хранения результата обычно используется переменная.

Если значение является текстовым, результат можно присвоить переменной в операции присваивания:

переменная=объект.имя_характеристики

Если характеристика представляет собой объект, то ссылка на объект присваивается объектной переменной:

Set переменная=объект.имя_характеристики

Чтобы задать объекту выполнение одного из методов, достаточно вызвать данный метод, используя ссылку на объект и на имя метода, разделенные операцией точки:

объект.метод

Большинство методов не возвращает результат, но есть и такие, которые возвращают текстовые значения и даже объекты.

Если метод возвращает текстовое значение, то для его сохранения в переменной можно использовать оператор присваивания:

переменная=объект.метод

Если метод возвращает объект, для присваивания результата объектной переменной используется оператор Set:

Set переменная=объект.метод

Содержание лабораторной работы

Решается задача обработки поступления товаров на склад. База данных содержит две таблицы. Входная информация для решения задачи содержится в таблице «Наличие», а выходная – в таблице «Накладные». При решении этой задачи корректируются записи входной таблицы "Наличие" и формируются (добавляются) новые записи в выходную таблицу "Накладные".

Справочная информация о товарах, хранящихся на складе, имеется в таблице “Наличие, содержащей следующие данные:

  • Код товара

  • Наименование товара

  • Остаток

  • Дата

  • Единицы измерения

В форму осуществляется ввод информации о каждой поступившей на склад партии товаров:

  • номер накладной

  • код товара

  • дата поступления

  • количество

В таблице "Наличие" осуществляется поиск записи с введенным кодом детали. Если искомая запись найдена, то программа должна предусмотреть выполнение следующих операций:

  1. Произвести корректировку найденной записи в таблице "Наличие", заключающуюся в добавлении к значению поля "Остаток" введенного значения "количество" и в замещении значения поля "Дата" на введенное значение "дата поступления"

  2. Добавить новую запись в таблицу "Накладные".

Выходная таблица имеет следующий состав полей:

  • Номер накладной

  • Код товара

  • Дата поступления

  • Количество

Выполнение лабораторной работы

  1. Загрузить ACCESS

  2. Создать форму ( см.рис.2):

Рис.2 Форма для ввода данных

Задать имена кнопкам соответственно: Кнопка_ОК и Кнопка_выход, задать имена полям соответственно: Поле_нн (Номер накладной), Поле_кт (Код товара), Поле_дп (Дата поступления), Поле_кл (Количество).

  1. Ввести и текст VBA-кода в модуле класса формы "Поступление", для этого необходимо открыть указанную форму в режиме конструктора, перейти на ленту Конструктор, выбрать группу Сервис, команду Просмотреть код и набрать текст программы с использованием методов DAO:

Option Compare Database

Option Explicit

Dim n As String

Dim t As String

Dim d As Date

Dim k As Single

Private Sub Кнопка_ОК_Click()

On Error GoTo Err_Кнопка_ОК_Click

n = Поле_нн.Value

t = Поле_кт.Value

d = Поле_дп.Value

k = Поле_кл.Value

Obrabotka

Поле_нн.Value = Null

Поле_кт.Value = Null

Поле_дп.Value = Null

Поле_кл.Value = Null

Exit_Кнопка_ОК_Click:

Exit Sub

Err_Кнопка_ОК_Click:

MsgBox Err.Description

Resume Exit_Кнопка_ОК_Click

End Sub

Private Sub Кнопка_выход_Click()

On Error GoTo Err_Кнопка_выход_Click

DoCmd.Close

Exit_Кнопка_выход_Click:

Exit Sub

Err_Кнопка_выход_Click:

MsgBox Err.Description

Resume Exit_Кнопка_выход_Click

End Sub

Function Obrabotka()

Dim dbs As Database

Dim rst As DAO.Recordset

Dim nst As DAO.Recordset

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("Наличие")

Set nst = dbs.OpenRecordset("Накладные")

rst.MoveFirst

Do Until rst.EOF

If t = rst![Код товара] Then

rst.Edit

rst![Остаток] = rst![Остаток] + k

rst![Дата] = d

rst.Update

nst.AddNew

nst![Номер накладной] = n

nst![Код товара] = t

nst![Дата поступления] = d

nst![Количество] = k

nst.Update

End If

rst.MoveNext

Loop

End Function

  1. Создайте новый модуль. Подключите библиотеку ADO, выполнив команду Tools/References; отключите библиотеку DAO (уберите флажок), выберите в списке Microsoft ActiveX Data Objects 2.1 Library (установите флажок), стрелками «вверх» «вниз» выбрав приоритет выполнения, поместите его 4-м месте, вместо библиотеки DAO (см. рис.3).

Рис 3. Подключение библиотеки ADO

  1. Ввести и текст VBA-кода программы с использованием методов DAO в модуле класса формы "Поступление":

Option Compare Database

Option Explicit

Dim n As String

Dim t As String

Dim d As Date

Dim k As Single

Private Sub Кнопка_ОК_Click()

On Error GoTo Err_Кнопка_ОК_Click

n = Поле_нн.Value

t = Поле_кт.Value

d = Поле_дп.Value

k = Поле_кл.Value

Obrabotka

Поле_нн.Value = Null

Поле_кт.Value = Null

Поле_дп.Value = Null

Поле_кл.Value = Null

Exit_Кнопка_ОК_Click:

Exit Sub

Err_Кнопка_ОК_Click:

MsgBox Err.Description

Resume Exit_Кнопка_ОК_Click

End Sub

Private Sub Кнопка_выход_Click()

On Error GoTo Err_Кнопка_выход_Click

DoCmd.Close

Exit_Кнопка_выход_Click:

Exit Sub

Err_Кнопка_выход_Click:

MsgBox Err.Description

Resume Exit_Кнопка_выход_Click

End Sub

Function Obrabotka()

Dim rst As New ADODB. Recordset

Dim nst As New ADODB. Recordset

rst.Open”Наличие”,CurentProject.Connection,adOpenKeyset,_adLockOptimistic

rst.Open”Накладные”,CurentProject.Connection,adOpenKeyset,_adLockOptimistic

rst.MoveFirst

Do Until rst.EOF

If t = rst![Код товара] Then

rst![Остаток] = rst![Остаток] + k

rst![Дата] = d

nst.AddNew

nst![Номер накладной] = n

nst![Код товара] = t

nst![Дата поступления] = d

nst![Количество] = k

nst.Update

End If

rst.MoveNext

Loop

End Function