Макросы с условиями

 

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

Для создания макроса с условием необходимо применить столбец Условие (Condition). Обычно он не отображается. Для того чтобы сделать его видимым в конструкторе макроса, выберите на ленте Работа с макросами | Конструктор > Показать или скрыть > Условия (Macro Tools | Design > Show/Hide > Conditions).

Неудивительно, что именно в столбце Условие задаются условия. Условие похоже на выражение, но оно в результате всегда выдает одно из двух значений: Истина или Ложь. Программа Access проверяет условие и решает с его помощью выполнить или нет соответствующую макрокоманду. (На языке программистов это называется проверкой условия.)

Вот как действует этот механизм.

¦     если оставить столбец Условие пустым (как в случае обычных макросов), программа Access всегда выполняет данную макрокоманду, если она не сбрасывается из-за ошибки;

¦     если условие задано и оказывается Истиной, Access выполняет соответствующую макрокоманду;

¦     если условие задано и оказывается Ложью, Access пропускает макрокоманду и переходит к выполнению следующей команды в списке.

Вкратце — у вас есть способ выполнять макрокоманду только иногда, по мере необходимости.

 

 

Построение условия

 

В ходе этого обсуждения возникает интересный вопрос: как сформировать условие? В простейших типах условий сравниваются два разных значения. Вот пример:

[ProductName] = "Baloney"

Это условие сравнивает текущее значение элемента управления ProductName со словом "Baloney" (болонская копченая колбаса). Если в данный момент ProductName содержит этот текст (и только его), условие равно Истине. Если же ProductName содержит что-то еще, результат условия — Ложь.

 

Подсказка

Иногда вы получаете условие прямо противоположное тому, которое хотели создать. В трудный момент всегда можно изменить условие на противоположное, поместив в начало слово Not. Условие Not [ProductName] ="Baloney" равно Истине, только если текущий элемент не содержит любимый всеми мясной продукт.

 

Знак равенства (=) — один из основных компонентов условной логики, но не единственный вариант. Можно использовать знаки операций "больше чем" (>) и "меньше чем" (<) и оператор "не равно" (о). Далее приведено выражение, проверяющее, больше ли числовое поле определенного значения:

[Price]   >  49.99

Для пущей важности можно добавить в смесь ваши любимые функции Access. (В главах 4 и 7 описано множество полезных функций.) Далее приведено условие, проверяющее длину поля и возвращающее значение Истина, если поле меньше трех символов:

Len ( [FirstName] )   <  3

Вместо операторов, которые вы видели до сих пор, для создания собственных условий можно применять функцию, дающую результат Истина или Ложь. Знатоки программирования называют результат, который может быть Истиной или Ложью и ничем иным, булевым значением в честь британского суперматематика Джоржа Буля.

У программы Access есть лишь несколько функций, возвращающих булевы значения, но самая замечательная из этой звездной плеяды называется IsNull ( ). Как вы узнали раньше, незаполненные поля — это поля, не содержащие никаких данных. Функция IsNull ( ) проверяет, не пусто ли данное поле или элемент управления. Вот как можно ее применять для выявления пропущенной фамилии:

IsNull ( [LastName] )

Это условие дает в результате значение Истина, если в текущем поле LastName нет никаких данных.

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

В заключение, последний прием, который может применяться в условиях, — сочетание нескольких условий для создания более мощных суперусловий. Для этого есть два ключевых слова, способных помочь вам объединять условия: And (И) и Or (Или).

And требует одновременного выполнения обоих условий, таким образом, делая ваше условие более строгим. Следующее условие возвращает результат Истина, только если оба  поля и FirstName, и LastName длиннее трех символов каждое:

Len([FirstName])   <  3 And Len([LastName])   <  3

     Or предоставляет две альтернативы для удовлетворения условия. Следующее условие возвращает результат Истина, если поле FirstName или LastName пусто. Оно возвращает Ложь, только если в обоих полях есть текст.

 IsNull([FirstName])   Or  IsNull([LastName])

 С помощью этих строительных блоков — условных операторов, функций и ключевых слов Not, And и Or — можно создать множество условий. В следующем разделе вы увидите  пример, заставляющий условия работать.

 

 

Проверка данных с помощью условий

Многие гуру программы Access применяют макросы для предотвращения некорректного редактирования и других подозрительных операций над данными (например, вставок и удалений). Теперь, когда вы понимаете, как написать условие, вы сможете легко разработать проверочную логику такого сорта.

 

 

Примечание

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

 

 

Первый шаг — реагировать на подходящие события — главным образом события формы До вставки, До обновления и До подтверждения. Когда они возникают, можно выполнить условия и найти среди них ошибочные. Если вы видите что-то, что вам не нравится, используйте команду ОтменитьСобытие (CancelEvent) для полного прерывания процесса и, таким образом, отмены операции вставки, обновления или удаления.

 

Рис. 15.21. Когда устанавливается флажок Please notify me about special offers (Пожалуйста, сообщайте мне о специальных предложениях), в поле WantsEmail устанавливается значение Да. Но у этой записи есть проблема — в поле Email нет значения

 

Примечание

У команды ОтменитьСобытие нет аргументов — она просто прерывает выполняющийся в данный момент процесс. ОтменитьСобытие работает с любым событием, начинающимся со слова "До" ("Before"), что означает готовность реальной операции к выполнению, но еще не само ее выполнение.

 

 

Допустим, вы хотите создать простое условие, которое останавливает обновление определенной записи. Рассмотрите форму, показанную на рис. 15.21.

В данном примере пропущенный электронный адрес вызывает серьезную головную боль. Эту проблему можно решить, сделав поле EmailAddress обязательным, но вы хотите на самом деле нечто более замысловатое. Когда WantsEmail равно Да, поле EmailAddress не должно быть пустым. С помощью макроса с условием можно реализовать именно эту

логику.

Вам понадобится следующее логическое условие:

WantsEmail = Yes And IsNull ( [EmailAddress] )

Это условие возвращает значение Истина, если WantsEmail равно Да и EmailAddress пусто. Когда это выполняется, самое время отменить обновление с помощью макрокоманды ОтменитьСобытие.

 

Примечание

Другого варианта нет. Можно использовать макрокоманду ЗадатьЗначение для замены некорректных значений. Но, как правило, лучше дать возможность пользователю, выполняющему обновление, попытаться самостоятельно устранить проблему.

 

Когда событие отменяется, оно не выполняет откат всех изменений. Отмена события лишь мешает завершению операции. Если изменяется запись и делается попытка перейти к другой записи, возникает событие До обновления (Before Update). Если макрос отменяет это событие, программа Access запрещает переходить к другой записи и оставляет вас на прежнем месте. Но текущая запись остается в режиме редактирования со всеми отредактированными значениями. Ваше дело устранить проблему или нажать клавишу <Esc> для полного отказа от попытки обновления.

Условная макрокоманда ОтменитьСобытие — сердцевина многих проверочных макросов. Но вам нужен еще один завершающий штрих: сообщение об ошибке. Иначе пользователь, выполняющий обновление, не догадается, в чем дело. Он будет склонен считать, что Access совсем слетела с катушек.

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

У программы Access есть фантастическое средство ускорения, выручающее при необходимости применять одну и ту же макрокоманду дважды. Вместо повторения одинакового условия рядом с каждой макрокомандой (что немного досадно) просто вставьте три точки (…) в столбец Условие для каждой следующей макрокоманды. Эти три точки — сокращенный вариант указания программе Access применять условие из предыдущей макрокоманды.

На рис. 15.22 показан законченный макрос, а на рис. 15.23 — выполняющийся макрос.

 

Рис. 15.22. Этот макрос состоит из двух макрокоманд с условием. Для блокировки некорректных данных присоедините его к событиям До обновления и До вставки

 

Рис. 15.23. Макрос находит пропущенный электронный адрес и поясняет возникшую проблему

 

 

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100