Павел Дубнов - Access 2002: Самоучитель
6. Запускается макрос14, который передает фокус следующему полю – Название фирмы.
7. Заканчивается логическая конструкция If.
Проверка завершенной процедуры
На этом написание процедуры завершено. Вот ее полный текст:Private Sub Название_фирмы_LostFocus()
On Error GoTo Err Название_фирмы_LostFocus_Click
Dim Cod As Integer
Dim answer As Integer
answer = DCount(«[Haзвaниe фирмы]», «Фирмы», «[Название фирмы] = Forms![Фирмы]![Haзвaниe фирмы]»)
If answer = 1 Then
MsgBox Prompt:="Значение уже содержится в файле и повторно не вводится"
DoCmd.RunMacro «Макрос32»
Else
DoCmd.RunMacro «Макрос2»
DoCmd.RunMacro «Макрос1»
MsgBox Prompt:="Запись введена"
Cod = DMax(«[Kод фирмы]», «Фирмы») + 1
Forms![Фирмы]![Kод фирмы] = [Cod]
DoCmd.RunMacro «Макрос14»
End If
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, acMenuVer70
Exit Название_фирмы_LostFocus_Click:
Exit Sub
Err Название_фирмы_LostFocus_Click:
MsgBox Err.Description
Resume Exit Название_фирмы_LostFocus_Click
End SubПрограмма создавалась в окне модуля. За недостатком места мы не иллюстрировали выполнение каждого этапа работы после ввода очередного оператора. Покажем только, как выглядит в окне модуля завершенная процедура (см. рис. 12.8).
Рис. 12.8Теперь проверим, как работает написанная процедура. Откройте форму Фирмы и введите в поле Название фирмы имя организации, которое заведомо содержится в базе данных, например ORION (см. рис. 12.9).
Рис. 12.9Не заполняйте остальные поля: в данном случае важно просто проверить, дееспособна ли созданная программа. Чтобы ввести информацию в базу данных, щелкните по клавише Enter. Появится сообщение, показанное на рис. 12.10. Форма остается в том же состоянии, код новой записи не изменился, и все готово к вводу другой новой записи.
Рис. 12.10Добавьте ее, задав в качестве имени фирмы уникальное имя ORION1. Снова воспользуйтесь клавишей Enter для ввода записи. В результате появится другое сообщение (см. рис. 12.11). Как видите, добавление этой записи база данных «восприняла» совершенно нормально (рис. 12.12).
Рис. 12.11Рис. 12.12
Итак, вы умеете бороться с дублированием записей двумя способами (один из них был описан в главе 11). Мы рекомендуем иметь в своем арсенале оба. Отметим лишь, что последний вариант удобнее при вводе записей словарного типа, где определяющим является одно поле (в данном случае – поле Название фирмы). В принципе ничего невозможного нет, и нетрудно усовершенствовать программу настолько, чтобы она позволяла контролировать несколько полей. Но подобное усложнение процедуры вряд ли оправдано, тем более что для такого случая есть другой вариант отсева дублирующихся записей.
Установка на последнюю запись при открытии формы
В главе 11 уже упоминалось о том, что при активизации форма открывается на последней, еще пустой записи, чтобы пользователь не тратил время на поиски и мог сразу вводить новую информацию. Теперь рассмотрим программный механизм, который позволяет реализовать эту установку. В качестве примера возьмем ту же форму Фирмы.
Подготовка процедуры
По сути данная процедура представляет собой просто фрагмент предыдущей программы. Фокус передается новой записи, затем максимальное значение увеличивается на единицу и присваивается этой новой записи.
Как и в предыдущем примере, начните с окна свойств. Но теперь вам понадобится таблица свойств не какого-то отдельного поля, а всей формы в целом. Открыв форму Фирмы в режиме конструктора, щелкните по кнопке
Она расположена в левом верхнем углу формы, непосредственно под названием Фирмы: Form (см. рис. 12.13). На фоне окна конструктора откроется окно таблицы свойств формы. Активизируйте опцию Открыть. Щелкните в этом поле мышью и воспользуйтесь стрелкой прокрутки. В выпадающем списке выберите позицию Обработка событий и включите ее в поле Открыть. Если теперь вы щелкнете по кнопке
то в окне модуля будут выведены операторы, обрамляющие процедуру (см. рис. 12.6): Private Sub Form_Open (Cancel As Integer) и End Sub.
Рис. 12.13
Отметим, что само по себе окно модуля не содержит новой информации, необходимой читателю. Поэтому в дальнейшем мы не станем включать в главу рисунки, которые явно избыточны. Обсуждаться будет только текст программы. Однако не забывайте, что она формируется в окне модуля. Следующий стандартный шаг – установка операторов обработки ошибок. После этого заготовка программы принимает такой вид:
Private Sub Form_Open(Cancel As Integer)
On Error GoTo Err_Form_Open
. . . . . . . . . . .
Err_Form_Open:
MsgBox Err.Description
Resume Exit_Form_Open
End SubТеперь определите переменную Cod, которая необходима для выполнения процедуры:
Dim Cod As Integer
После этого введите содержательные операторы:
DoCmd.RunMacro «Макрос1»
Cod = DMax(«[Код Фирмы]», «Фирмы») + 1
Forms![Фирмы]![Код фирмы] = [Cod]
DoCmd.RunMacro «Макрос14»
Exit_Form_Open:
Exit SubКоманда Макрос1 задает переход к новой записи, а Макрос14 устанавливает курсор в следующем поле, куда должна вводиться информация. Приведем полный текст процедуры:
Private Sub Form_Open(Cancel As Integer)
On Error GoTo Err_Form_Open
Dim Cod As Integer
DoCmd.RunMacro «Макрос1»
Cod = DMax(«[Код Фирмы]», «Фирмы») + 1
Forms![Фиpмы]![Koд фирмы] = [Cod]
DoCmd.RunMacro «Макрос14»
Exit_Form_Open:
Exit Sub
Err_Form_Open:
MsgBox Err.Description
Resume Exit_Form_Open
End SubЕсли вы теперь откроете форму Фирмы, то обнаружите, что она сразу открывается на последней записи, которая еще пуста (рис. 12.14). Ее код уже установлен, а курсор находится в поле Название фирмы. Таким образом, форма готова к вводу новой информации. (Не будь написанной и выполненной процедуры, форма открылась бы на первой записи.)
Рис. 12.14Удаление записи с установкой на последнюю запись
В каждой форме базы данных Контрольно-измерительные приборы созданы две дополнительные кнопки: Изменить запись и Удалить запись (см. рис. 12.15).
Рис. 12.15
В этом разделе будет рассмотрена процедура, на которой основано действие кнопки Удалить запись.
В принципе удаление записи – совершенно рутинная операция. Она выполняется штатными средствами Access и не заслуживает особого внимания. Если в нашем случае для нее предусмотрена специальная кнопка, то лишь потому, что есть и вторая часть задачи – установка на последнюю запись. Это значит, что в программу следует добавить некоторые новые функции, чтобы показать новые возможности при использовании процедуры. Покажем это на примере формы Назначение. Как и во всех предыдущих случаях, выполнение процедуры привязано к событию Щелкнуть по кнопке в таблице свойств кнопки Командная кнопка – см. рис. 12.16. Далее следует выбрать опцию Удалить запись.
Рис. 12.16Как и раньше, с помощью кнопки
откройте окно модуля. Оно выглядит так же, как аналогичное окно, показанное на рис. 12.6. Процедура опять будет формироваться в окне модуля, но и на сей раз речь пойдет только о текстовых операторах.
Первые этапы работы уже хорошо вам знакомы: автоматическая вставка обрамляющих операторов, ввод операторов обработки ошибок и определение переменной Cod. Вот результат ваших трудов:Private Sub Удалить_запись_Click()
On Error GoTo Err_Назначение_Удалить_запись_Click
Dim Cod As Integer
…………………… Err_Назначение_Удалить_запись_Click:
MsgBox Err.Description
Resume Exit_Назначение_Удалить_запись_Click
End SubДалее вы блокируете вывод любых информационных сообщений, кроме сообщений об ошибках. Эту функцию выполняет программа МакросЗ (см. рис. 12.17). Чтобы запустить ее, выполните команду Установить сообщение, но в поле Аргументы команды укажите значение Нет, что и позволит блокировать вывод сообщений. Данная опция используется, когда пользователь не хочет, чтобы выполнение макроса прерывалось ради появления окон предупреждений. Однако сообщения об ошибках выводятся в любом случае. Кроме того, Microsoft Access выводит на экран все диалоговые окна, которые требуют от пользователя действий более сложных, чем щелчок по кнопке: например, когда надо ввести какой-либо текст или выбрать параметр из списка.
Рис. 12.17Макрос9 производит основную операцию – удаление записи. После этого выполняется цикл. Рассмотрим его подробнее.
При активной работе с БД может оказаться, что в какой-либо форме есть не одна, а несколько пустых записей. Например, вы нечаянно или с определенной целью не ввели в новую запись никаких данных, однако и не удалили ее. Щелкнув по кнопке Удалить запись, вы восстановите порядок, и все пустые записи будут уничтожены. Когда вы снова активизируете форму, она откроется на пустой записи, готовой к вводу информации.
Цикл имеет следующий синтаксис:A:
DoCmd.RunMacro «Макрос7»