Инструкция Resume Next используется для обработки ошибок внутри самого обработчика. При этом команда, которая вызвала ошибку, больше не будет выполняться, когда управление вернется в процедуру.
Наконец, для передачи управления в другую строку процедуры применяется последняя форма инструкции – Resume метка. Например, управление может передаваться процедуре выхода, описанной в следующем разделе. Обычно используется именно этот вид инструкции Resume, если нет каких-либо особых требований:
Resume Exit_Название_фирмы_LostFocus_Click Выход из процедуры Включая в создаваемую программу процедуру обработки ошибок, необходимо предусмотреть такой путь выхода из нее, чтобы впоследствии обработчик активизировался только при возникновении ошибки. Процедура выхода отмечается меткой строки точно так же, как и процедура обработки ошибок. Если ошибки не произойдет, то после выполнения программы запустится процедура выхода. Если же ошибка случится, то сначала выполнится обработчик ошибок, а затем управление будет передано в процедуру выхода. Она содержит инструкцию Exit:
Exit Название_фирмы_LostFocus_Click
Итоговый синтаксис программы обработки ошибок выведен в окне модуля (см. рис. 12.7).
Рис. 12.7
Теперь перейдем к созданию самой программы с помощью VBA – как вы помните, такова была наша изначальная цель.
Функция создаваемой программы
Прежде всего зададимся вопросом, зачем нужна создаваемая процедура.
Когда мы включаем новую запись в форму Фирмы, то должны проверить, не дублирует ли содержимое поля Название_фирмы_ те одноименные поля, которые уже введены в форму в предшествующих записях. Тестирование заключается в следующем. Для каждой новой вводимой записи подсчитывается количество совпадений поля Название_фирмы_ с таким же полем для уже введенных записей. Если это число равно 1, то программа извещает пользователя о наличии дубликата, обнуляет поля текущей записи и ждет ввода очередной. Если количество совпадений равно 0, то процедура:
1. Вводит значение в базу данных.
2. Сообщает об этом пользователю.
3. Устанавливает следующее значение кода фирмы (в поле Код фирмы предусмотрена последовательная нумерация).
4. Переходит к новой записи.
5. Активизирует поле Название фирмы.
Теперь форма готова к вводу новой записи. Если процедура, которая построена описанным выше образом, будет запущена одновременно с вводом первой записи, то число совпадений может равняться либо нулю, либо единице; других вариантов нет.
Программная реализация Для работы процедуры нужны две переменные. Одна будет указывать на количество совпадений (дублирующихся записей), другая – сохранять код текущей записи. Назовите их соответственно answer и Cod. Первое, что вы должны сделать, – определить обе переменные как целые числа. Используйте для этого операторы:
Dim Cod As Integer Dim answer As Integer
Теперь определите выражение, которое формирует количественное значение переменной answer. Выражение будет иметь такую структуру:
answer = DCount(«[Haзвание фирмы]», «Фирмы», «[Название фирмы] = Forms![Фирмы]![Название фирмы]»)
Здесь необходимы пояснения. Функция DCount Функция DCount возвращает число записей в заданном наборе (подмножестве) записей. Ее синтаксис таков:
DCount(вырaжeниe, набор[, условие])
Здесь:
• выражение – определяет поле, для которого производится подсчет значений. Данный аргумент может задаваться строковым выражением, определяющим поле в таблице или запросе, или представлять выражение, задающее выполнение вычислений над данными, содержащимися в поле. Допускается использовать в аргументе выражение имя поля в таблице или элемента управления в форме, константы, а также имя встроенной или определяемой пользователем функции. Не допускается в аргументе выражение других статистических функций по подмножеству или статистических функций SQL;
• набор – строковое выражение, которое определяет набор записей, образующих подмножество. Может представлять имя таблицы или запроса;
• условие – необязательное строковое выражение, ограничивающее диапазон данных, для которых подсчитывается число значений. Например, аргумент условие часто является эквивалентом предложения WHERE инструкции SQL, но без ключевого слова WHERE. Если аргумент условие опущен, DCount выполняет расчеты над полем, заданным в аргументе выражение, для всего набора записей. Любое поле, указанное в аргументе условие, должно принадлежать подмножеству, заданному аргументом набор; в противном случае функция DCount возвращает значение Null.
С помощью функции DCount подсчитывается количество записей в подмножестве, когда не требуется использовать конкретные значения. Хотя в аргументе выражение можно указать любые расчеты, DCount всегда возвращает число записей.
В нашем случае выражение – это имя поля "[Название фирмы]". (Вспомним: когда в тексте строки есть пробелы, она заключается в квадратные скобки. Кавычками полагается обрамлять текстовую строку.) Значением аргумента набор является форма Фирмы, а аргумента условие – "[Название фирмы] = Forms![Фирмы]![Haзвaниe фирмы]". Последнее означает, что здесь сравнивается содержимое поля текущей записи с содержимым поля открытой формы (в правой части выражения Forms – класс форм, [Фирмы] – имя какой-либо фирмы из этого класса, [Название фирмы] – конкретное поле формы). Восклицательные знаки указывают на то, что следующие за ними элементы определяются пользователем. В данном случае речь идет о ссылке на открытую форму и на поле в ней.
Логическая конструкция If…Then…Else
Так как функция Dcount возвращает значение переменной answer (0 или 1), то и логическая проверка выполняется относительно этой переменной. Утверждение, подлежащее тестированию, – answer = 1. Если оно верно (дубликат действительно обнаружен), то логическое выражение принимает значение True (Истина). Затем сразу после проверяемого утверждения выполняется ряд операторов:
1. Исполняется команда MsgBox Prompt, и в результате на экране появляется сообщение «Значение уже содержится в файле и повторно не вводится».
2. Запускается макрос, который стирает значения всех полей текущей записи, кроме поля Код фирмы: в нем сохраняется текущее значение кода. Макрос имеет рабочий номер 32. (В выборе этой цифры нет какого-либо специального умысла, и макрос можно назвать как угодно.) Чтобы запустить его из программы VBA, задайте команду DoCmd.RunMacro «Макрос32».
Если проверяемое утверждение неверно (answer не равно 1), значит, дубликат не обнаружен. Логическое выражение принимает значение False (Ложь), и после инструкции Else выполняется ряд операторов:
1. Запускается макрос, запоминающий запись (макрос2);
2. Запускается макрос, реализующий переход к новой записи (макрос1). В обоих случаях аналогично предыдущему используется команда макрос1 DoCmd.RunMacro" Макрос№";
3. С помощью команды MsgBox Prompt выдается сообщение «Запись введена».
4. Вычисляется новое значение кода записи. Оно равно максимальному значению, увеличенному на единицу. Для вычисления используется функция Dmax (), которая возвращает максимальное значение кода в указанном наборе (подмножестве) записей. Вот ее синтаксис:
DMax(вырaжeниe, набор[, условие])
Здесь:
– выражение – выражение, определяющее нужное поле. Данный аргумент может задаваться строковым выражением, определяющим поле в таблице или запросе, или представлять выражение, которое задает выполнение вычислений над данными, содержащимися в поле. Допускается использовать в аргументе выражение имя поля в таблице или элемента управления в форме, константы, а также имя встроенной или определяемой пользователем функции;
– набор – строковое выражение, определяющее набор записей, образующих подмножество. Может содержать имя таблицы или запроса;
– условие – необязательное строковое выражение, ограничивающее диапазон данных, для которых определяется минимальное или максимальное значение поля. Если аргумент условие опущен, DMax выполнит действия над полем, заданным в аргументе выражение, для всего набора записей. Любое поле, указанное в аргументе условие, должно принадлежать подмножеству, заданному аргументом набор; в противном случае функция DMax возвращает значение Null.
В данном случае значение набора (например, имя таблицы) в аргументах не указывается, так как речь идет о поле, еще не включенном в базу данных. Но прямые кавычки, которые обрамляют пустую строку, все равно должны присутствовать.
5. Значение вычисленного кода присваивается полю Код фирмы новой записи. В этой инструкции также необходимо соблюдать правила, касающиеся употребления квадратных скобок и восклицательных знаков.
6. Запускается макрос14, который передает фокус следующему полю – Название фирмы.
7. Заканчивается логическая конструкция If.
Проверка завершенной процедуры
На этом написание процедуры завершено. Вот ее полный текст: