Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практические задания / Prakticheskaya_rabota_11.docx
Скачиваний:
21
Добавлен:
09.12.2018
Размер:
225.81 Кб
Скачать

Практическая работа №11

Создание процедуры поиска по первичному ключу

Цель работы: научиться создавать процедуру обработки событий с помощью мастера, анализировать её, научиться корректировать процедуру, выполнять запросы в процедуре обработки события . создавать процедуру поиска по первичному ключу.

Теоретическая часть

Программы VВAмогут создаваться не только пользователем, но и автоматически при работе мастеров Access. Рас­смотрим пример процедуры обработки события, созданной мастером кнопок.

Пусть в форме для просмотра информации о группе по желанию пользователя необходимо открывать список студентов текущей группы

Практическая часть

Создадим форму группа на основе одноименной таблицы, воспользовавшись режимом Автоформа: в столбец (AutoForm:Columnar) Создадим форму студент на основе одноименной таблицы, воспользовавшись режимом Автоформа: ленточная (AutoForm: Tabular).

Откроем форму группа в режиме конструктора и добавим в неё кнопку для открытия формы студент, воспользо­вавшись мастером. Для отображения в открываемой форме Студент только связанных записей необходимо при создании кнопки вобрать в окне мастера строку Открыть форму для отобранных записей и далее выбрать поле НГ, по которому осуществляется связь форм и отбор записей подчи­ненной формы. Присвоим кнопке имя Список студентов (рис.1).

Рис. 1. Форма Группа с кнопкой для вызова формы Студент

Создав такую кнопку, перейдем в режим формы и убедимся, что при щелчке мышью на этой кнопке открывается форма Студент, и в ней отображаются все записи, связанные с текущей записью формы Группа. При этом через форму можно произвести корректировку и добавление новых записей.

Рассмотрим процедуру, которую сформировал мастер для открытия формы при нажатии кнопки. Откроем форму группа в режиме конструктора. Установив курсор на кнопку список студентов, выберем в контекстном меню команду Обработка событий (BuildEvent). Открывается окно модуля формы (рис. 2), связанного с формой Группа.

В окне отображается процедура обработки для события - щелчок мыши (Click) на кнопке Список студентов, подготовленная мастером.

Рис. 2. Окно модуля формы Группа с процедурой обработки события Click для элемента список студентов

Процедура обработки события является личной процедурой типа Sub. Инструкция subобъявляет процедуру с со­ставным именем список_студентов_click(), включающим имя кнопки и имя события Пустые круглые скобки говорят об отсутствии аргументов.

Рассмотрим текст программы, записанный между инструкциями sub и EndSub.

Инструкция DoCmd.OpenFormst DocName…stLinkCriteria реализует главную функцию процедуры —открывает форму СТУДЕНТ.

DoCmd является объектом активного приложения Access, предназначенным для выполнения макрокоманд.OpenForm — метод, применяемый к данному объекту. Методу передаются два аргумента. Первый из передаваемых аргументов задает имя открываемой формы, второй передает строковое выражение, задающее условие отбора за­писей в открываемой форме. В данной инструкции для хранения значений аргументов используются перемен­ные строкового типа StDocName…stLinkCriteria.

В процедуре эти переменные ранее явно описываются инструкцией Dim.

DimstDocNameAs Siring

DimstLinkCriteriaAs String

Для переменных указываются именаstDocNameиSiLinkCriteriaистроковый тип данных String.

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

ИнструкцииstDocName = "Студент" и stLinkCriteria = "[НГ]=" &’’’’&Мe! [нг] &’’’ являются инструкциями присваи­вания, благодаря которым переменные получают конкретные значения. Первая переменная сохраняет имя фор­мы студент, вторая — выражение, указывающее, что связь таблиц осуществляется по полю нг и выборка данных в открываемой форме Студент должна производиться по значению этою поля в текущей записи формы группа. В процедурах VBA для ссылок на элементы управления текущей формы или отчета может быть использовано ключевое слово Me, заменяющее полный идентификатор текущего объекта — формы группа Forms! [группа]

Аргументы, записываемые в инструкции, разделяются запятыми. Два аргумента в инструкции DoCmdOpenForm ... были пропущены, запятые фиксируют их отсутствие. В конце инструкции отсутствие недостающих аргументов не помечается.

Инструкция OnErrorGoTo Егг_Список_студентов_Сlick позволяет при возникновении ошибки передать управле­ние программе обработки ошибок.. Метка Егг_список_студентов_click: определяет начало этой программы.

Программа обработки ошибок помещена между инструкциями ExitSub и EndSub, что позволяет отделить ее от части программы, соответствующей нормальному выполнению процедуры. В этой процедуре программа обра­ботки ошибок включает две инструкции.

MsgBox выводит стандартное сообщение об ошибке. Аргумент Err.Description определяет строковое значение, которое возвращается при ошибке. Description является свойством объекта Error. Значением свойстваDescription является краткое предупреждающее сообщение с описанием ошибки.

Инструкция Resume указывает, с какой инструкции необходимо возобновить выполнение процедуры. В данном случае — передает управление на метку, за которой стоит инструкция, осуществляющая выход из процедуры.

Корректировка процедуры, созданной мастером

Процедура, созданная мастером, может быть откорректирована и дополнена пользователем. Например, для под­тверждения необходимости вывода списка студентов текущей группы можно записать инструкции, организующие диалог, после описания строковых переменных (см. рис. 2).

Dim Ответ AsInteger

Ответ = MsgBox(" Вывести список студентов группы " &НГ& "?",vbOKCancel)

IfОтвет = vbCancelThen

ExitSub

EndIf

Первая инструкция определяет переменную Ответ для сохранения числового значения. Вторая присваивает этой переменной значение, возвращаемое функцией MsgBox. Функция MsgBox выводит в диалоговом окне (рис. 3) во­прос, включающий номер группы нг из текущей записи формы, и кнопки ОК и Отмена (Cancel). Возвращаемое функцией значение 1 или 2 соответствует нажатой кнопке.

Третья инструкция

If условие Then

[инструкция]

[Else

[инструкции] ]

EndIf

выполняет группу инструкций в зависимости от значения выражения (True или False), заданного в условии. Ес­ли была нажата кнопка Cancel, выполняется инструкция, завершающая процедуру по Exitsub, иначе выпол­нение процедуры продолжается с инструкции, следующей за Endif. Приставка указывает на использование зна­чений встроенных констант VBA.

Рис. 3. Диалоговое окно функции MsgBox

Для открытия списка студентов только в режиме чтения достаточно дополнить инструкцию DoCmd. OpenForm… пятым аргументом acFormReadOnly.

Приставка ас указывает, что в качестве аргумента используется значение встроенной константы Access. Замените в процедуре ключевое слово Ме наForms! [Группа] и убедитесь, что процедура работает по-прежнему. Запишите в качестве аргумента, задающего условие отбора, прямо в инструкцию выражение “[нг]=”&’’’’&Me![нг]&’’’’.При этом можно удалить инструкцию описания переменной stLinkCriteria и присваи- вания ей значения.

Выполнение запросов в процедуре обработки события

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

Для подсчета изменившегося числа студентов в группе и обновления поля кол в таблице ГРУППА воспользуйтесь созданными для этих целей запросами Число студентов в группах и Обновление ГРУППА_КОЛ.

Кроме того, поскольку для некоторых групп могут быть уничтожены все записи о студентах, а два предыдущих запроса не решают задачу обновления поля кол, в этом случае потребуется запрос обнуление ГРУППА_КОЛ без под- чиненных в СТУДЕНТ (рис 4).

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

Поскольку при работе с формой может и не производиться изменения числа записей о студентах, предусмотрите в процедуре диалоговый режим с пользователем, в результате которого определитесь, нужно ли выполнять обнов- ление таблицы группа. Для этого используйте функцию MsgBox,которая выводит в диалоговом окне текст, задан- ный ее первым аргументом, а также определяемые вторым аргументом кнопки, например, Да и Нет(рис. 5) и, как любая функция, возвращает значение.

Рис.4. Запрос на обновление полей в таблице Группа для записей, не

имеющих подчиненных

Рис. 5. Диалоговое окно функции MsgBox

Для анализа возвращенного функцией значения и принятия решения дальнейших действиях используйте инструкцию условного перехода.

Ifусловие Then

[инструкции]

[Else

[инструкции]]

1ndif

о

Эта инструкция в зависимости от значения выражения, заданного вусловии (Trueили False), выполняет ту или иную группу инструкций. Для создания процедуры выполните следующие действия:

l. Откройте форму студент в режиме конструктора.

2. Откройте окно свойств формы на вкладке События (Events). В раскрывающемся списке Закрытие (Close) выберите значение [Процедура обработки события]и щелкните по значку построителя в конце строки. Таким образом, связывается выполнение создаваемой процедуры с закрытием формы. В открывшемся окне модуля формы в шаблон процедуры обработки события PrivateSubForm_Close() (рис 6) запишите инструкции процедуры.

Рис. 6. Инструкции начала и конца процедуры обработки события Closeдля формы Студент

3. Для определения переменных, сохраняющих строковые значения имен запросов и числовое значение, воз- вращаемое функцией MsgBox, запишите инструкциюDim.

DimstDocName,stDocNamel,stDocName2AsString, ОтветAsInteger

  1. Запишите инструкцию присваивания переменной ответ значения, возвращаемого функцией MsgBox.

Ответ =MsgBox("Вы добавляли или удаляли записи о студентах в группах?", vbYesNo)

Приставка vb в значении второго аргумента указывает на использование значения встроенной константы VBA, определяющего вывод в диалоговом окне кнопок Да и Нет.

  1. Для проверки, нажата ли пользователем в диалоговом окне кнопка Нет и выполнения в этом случае инст- рукции выхода из процедуры ExitSub, запишите инструкцию условного перехода, опустив необязательную ее часть.

IfОтвет=vbNoThen

ExitSub

EndIf

Если переменная Ответ получила значение, соответствующее нажатию кнопки Нет, выполняется инструкция, следующих за Then и завершающая процедуру по ExitSub, иначе выполнение процедуры продолжается с ин- струкции, следующей за Endif.

  1. Для обновления поля кол в таблице группа запишите инструкции выполнения перечисленных выше запросов. Используйте объект DoCmd и применяемый к данному объекту метод openQuery.Аргументом этого метода яв- ляется имя выполняемого запроса. Если для сохранения имен запросов предусмотрены переменные, им, пре- жде чем они будут использованы, должны быть присвоены эти имена.

StDocName="Числoстудентов вгруппах”

stDocNamel="06нoвлениеГРУППА_КОЛ"

stDocName2="Обнуление ГРУППА_КОЛ без подчиненных вСТУДЕНТ"

DoCmd.SetWarningsFalse

DoCmd.OpenQuery(stDocName)

DoCmd.OpenQuery(stDocNamel)

DoCmd.OpenQuery(stDocName2)

DoCmd.SetWarningsTrue

Метод Setwarnings с аргументом Falseпозволяет отключить вывод стандартных предупреждений на экран во время выполнения запросов. После выполнения запросов этот режим восстанавливается.

В окончательном виде процедура может иметь вид, представленный на рис. 7.

7. Закройте окно редактора VBA и возвратитесь вAccess, выбрав команду File|CloseandReturntoMicrosoftAccess.

8.Откройте форму Студент. Добавьте или удалите несколько записей о студентах Откройте таблицу группа и убе- дитесь, что ваша процедура работает.

9.Измените инструкцию DoCmd,заменив в ней имена переменных на имена запросов. Удалите из инструкции описания переменные stDocName,stDocNamelиstDocName2иинструкции присваивания им значений. Убе- дитесь, что и в этом случае процедура работает правильно.

Рис. 7. Процедура обработки события (Close) для формы Студент

Соседние файлы в папке Практические задания