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

7.4.2. Пример макроса с двусторонним ветвлением

Пример25. Требуется при просмотре деталей в формеДеталисделать так, чтобы на форме появлялась надписьДорогая, если цена детали превышает, например, 200 руб. В остальных случаях надпись появляться не должна. Эту задачу можно решить следующим способом.

  • Открыть форму Деталив режиме конструктора форм и создать на форме ЭУНадпись, написать текстДорогая. Отформатировать текст, используя соответствующие кнопки на ПИ. Сделать надпись невидимой:

  • открыть для надписи окно свойств

  • задать свойству Выводнаэкран(вкладкаМакет) значениенет

  • Создать условный макрос по имени Сигнал:

Условие

Макрокоманда

Примечание

Forms![Детали]![цена]>200

ЗадатьЗначение

(Элемент: Forms![Детали]![Дорогая].Visible

Выражение: Истина)

Not Forms![Детали]![цена]>200

ЗадатьЗначение

(Элемент: Forms![Детали]![Дорогая].Visible

Выражение: Ложь)

Здесь Visible- свойство элемента управленияНадпись. Это свойство можно найти в построителе выражений в окне свойств (правое окно в построителе выражений). КонстантыИстинаиЛожьтакже можно найти в построителе выражений в папкеКонстанты. Вместо этих констант можно использовать другие, допустимые значения для логических выражений (да,нетили-1,0).

  • Закрыть окно конструктора макросов, сохранив макрос и задав ему имя Сигнал.

  • Связать событие ТекущаязаписьформыДеталис макросомСигнал.

  • Открыть форму Деталив режиме формы и, переходя от записи к записи, убедиться в правильном решении поставленной задачи.

7.5. Реализация циклов в макросах

Для реализации циклов в макросах используется макрокоманда ЗапускМакроса. Рассмотрим примеры.

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

  • Создать макрос, содержащий единственную макрокоманду Сообщение, в аргументах которой укажем повторяемое сообщение. Сохраним макрос, задав ему имя, например,Сообщить.

  • Создать другой макрос по имени Запусксообщенияследующего вида:

Макрокоманда

Примечание

ЗапускМакроса

( Имя макроса: Сообщить,

Число повторов: 3)

  • Исполнить макрос Запусксообщения.

Рассмотрим более сложные примеры.

Пример 27. Пусть имеем загруженную данными таблицуПоставщики. Требуется отобрать в отдельную таблицу выделенных поставщиков (для которых значение логического поляВыделение-Истина), а в другую таблицу - невыделенных поставщиков (для которых значение поляВыделение-Ложь). Эту задачу можно решать несколькими способами.

Способ 1. С использованием запросов.

  • Создать запрос по имени Поствыделна создание таблицыВыделенныепоставщики, куда будут отбираться записи из таблицыПоставщики, с условием отбораИстинадля поляВыделение.

  • Создать запрос по имени Постневыделна создание таблицыНевыделенныепоставщики, куда будут отбираться записи из таблицыПоставщики, с условием отбораЛожьдля поляВыделение.

  • Создать макрос по имени Выделениепоставщиков следующего вида:

Макрокоманда

Примечание

УстановитьСообщения

(Включить сообщения: Нет)

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

ОткрытьЗапрос

(Имя запроса: Поствыдел)

ОткрытьЗапрос

(Имя запроса: Постневыдел)

  • Исполнить макрос Выделениепоставщиков. В результате будут созданы две таблицыВыделенныепоставщикииНевыделенныепоставщикис отобранными данными.

Способ 2.С использованием циклов в макросах.

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

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

  • выделить таблицу Поставщикиво вкладкеТаблицыокна БД

  • скопировать в буфер обмена

  • вставить из буфера обмена, указав в открывшемся окне факт копирования только структуры (соответствующий переключатель)

  • Аналогично создать пустую таблицу для невыделенных поставщиков по имени Постневыдел.

  • Создать автоформы ПоствыделиПостневыдел, источником данных для которых являются соответствующие таблицы.

  • Создать условный макрос по имени Отбор, который буде выполняться в цикле при условии, что формаПоставщикиоткрыта (предполагается, что формаПоставщикибыла заранее создана). Этот макрос в зависимости от значения поляВыделениев формеПоставщикибудет копировать запись из таблицыПоставщикив таблицуПоствыделилиПостневыделчерез соответсвующие формы.МакросОтбор:

Условие

Макрокоманда

Примечание

НаЗапись

(Тип объекта: Форма,

Имя объекта: Поставщики,

Запись: Первая)

Начальные установки указателя записи в форме Поставщики

Forms![Поставщики]![Выделение]

НаЗапись

(Тип объекта: форма,

Имя объекта: Поствыдел,

Запись: Новая)

Установка указателя записи на новую запись

...

ЗадатьЗначение

(Элемент: Forms![Поствыдел]![номерп],

Выражение: Forms![Поставщики]![номерп])

Перепись значения поля номерптаблицыПо-ставщикив поленомерптаблицыПоствыдел.

...

ЗадатьЗначение

(Элемент: Forms![Поствыдел]![имяп],

Выражение: Forms![Поставщики]![имяп])

и так далее по всем полям таблицы Поставщики

Not Forms![Поставщики]![Выделение]

НаЗапись

(Тип объекта: форма,

Имя объекта: Постневыдел,

Запись: Новая)

...

ЗадатьЗначение

(Элемент: Forms![Постневыдел]![номерп],

Выражение: Forms![Поставщики]![номерп])

...

ЗадатьЗначение

(Элемент: Forms![Постневыдел]![имяп],

Выражение: Forms![Поставщики]![имяп])

и так далее по всем полям таблицы Поставщики

НаЗапись

(Тип объекта: Форма,

Имя объекта: Поставщики,

Запись: Следующая)

Выполняется всегда

  • Создать макрос Отборв цикле:

Макрокоманда

Примечание

ОткрытьФорму

(Имя формы: Поствыдел)

Свернуть

До значка

ОткрытьФорму

(Имя формы: Постневыдел)

Свернуть

ЗапускМакроса

(Имя макроса: Отбор,

Число повторов: =DCount(“*”;”Поставщики”))

Знак “=“ означает вычислить значение указанного выражения, функция Dcount вычисляет количество записей (“*” - первый аргумент функции) в таблице Поставщики (второй аргумент ).

ЗапускМакроса

(Имя макроса: Завершение отбора)

Для контроля выполнения отбора и закрытия форм.

НаЗапись

(Тип объекта: Форма,

Имя объекта: Поставщики,

Запись: Первая)

Восстановление начального положения указателя записи в форме Поставщики.

Вместо аргумента Числоповторовможно указатьУсловиеповто-рения: Not IsNull(Forms![Поставщики]![имяп]), что означает “Пока не пусто значение поля имяп в таблицеПоставщики”. Это условие можно использовать, если для всех поставщиков введено имя. Здесь поленомерписпользовать нельзя, так как номерп является ключом.

  • Создать макрос Завершениеотбора, который открывает сформированные таблицы для контроля и закрывает формы:

Макрокоманда

Примечание

ОткрытьТаблицу

(Имя таблицы: Поствыдел)

Сообщение

Для приостановки макроса

Закрыть

(Тип объекта: Таблица,

Имя объекта: Поствыдел)

ОткрытьТаблицу

(Имя таблицы: Постневыдел)

Сообщение

Закрыть

(Тип объекта: Таблица,

Имя объекта: Постневыдел)

Закрыть

(Тип объекта: Форма,

Имя объекта: Поствыдел)

Закрыть

(Тип объекта: Форма,

Имя объекта: Постневыдел)

  • В форме Поставщикисоздать ЭУКнопкас надписьюОтбор вцикле. Связать событиеНажатиекнопкис макросомОтборвцикле.

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

Пример 28. Поставщики из города СПб переехали с Самару. Выполнить соответствующую корректировку таблицыПоставщики.

Решить эту задачу проще всего с помощью запроса на обновление. Однако здесь укажем способ решения этой задачи с использованием циклов в макросах.

  • Создать макрос Замена, который буде выполняться в цикле:

Макрокоманда

Примечание

НайтиЗапись

(Образец поиска: СПб,

Совпадение: Поля целиком,

Область поиска: Вниз)

ЗадатьЗначение

(Элемент: Forms![Поставщики]![город],

Выражение: “Самара”)

  • Создать макрос Переехал:

Макрокоманда

Примечание

ОткрытьФорму

(Имя формы: Поставщики)

КЭлементуУправления

(Имя элемента: город)

Перенос фокуса на поле город в форме Поставщики.

ЗапускМакроса

(Имя макроса: Замена,

Число повторов: =DCount(“*”;”Поставщики”))

Сообщение

(Сообщение: Готово)

Фиксирует окончание корректировки.

Закрыть

(Тип объекта: Форма,

Имя объекта: Поставщики)

ОткрытьТаблицу

(Имя таблицы: Поставщики)

Для контроля правильности корректировки.

СдвизРазмер

(По правому краю: 10см.).,

От верхнего края: 5см.)

Сообщение

Для приостановки макроса

Закрыть

(Тип объекта: Таблица,

Имя объекта: Поставщики)

  • Запустить макрос на выполнение и убедиться в правильности решения поставленной задачи.

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

Создадим в форме Деталичетыре новых элемента управления:

  • Поле, которому через свойства дадим имя ПолеРедак

  • Надпись Введитеновуюцену, которую расположим над полем по имениПолеРедак. Сделаем надпись невидимой (свойствоВыводнаэкран). Дадим надписи имяВвод_цены.

  • Кнопку, на которой напишем текст Редактировать. Дадим кнопке имяРедак_сохр

  • Кнопку, на которой напишем текст Выход. Дадим кнопке имяВыход_отменить

Обеспечим два режима работы при редактировании цены детали в текущей записи

  • Режим редактированияцены детали. Этот режим устанавливается сразу при открытии формыДетали. В этом режиме на форме имеется две кнопки, на одной из них написан текстРедактировать, на другой -Выход. Чтобы можно было вводить новую цену в полеПолеРедакнужнопо кн.Редактировать. Тогда становится видимой надписьВведитеновуюцену, в полеПолеРедакпоявляется курсор, и можно вводить новую цену для текущей записи (сразу после открытия формы - это первая запись). Ввод новой цены заканчивается нажатием клавишиEnterи осуществляется переход в другой режим. По кн.Выходможно закончить редактирование и закрыть формуДетали.

  • Режим сохранения новой ценыили отказа от редактирования. В этом режиме на тех же кнопках появляются другие надписи, на кнопке с надписьюРедактироватьтеперь появится надписьСохранить, а на кнопке с надписьюВыход- надписьОтменить. В этом режиме снова становится невидимой надписьВведитеновуюцену.по кн.Сохранитьпозволяет изменить цену детали, апо кнопкеОтменитьпозволяет отказаться от редактирования цены. Послепо любой из этих кнопок осуществляется снова переход в режим редактирования. При этом делаются все соответствующие установки, характерные для него.

Для решения поставленной задачи создадим групповой условный макрос по имени Редак_цены:

Имя макроса

Условие

Макрокоманда

Примечание

фун_редак_сохр

[Редак_сохр].Caption=“Редактировать”

КЭлементуУправления(Имя элемента:

ПолеРедак)

Поле ввода новой цены получает фокус, если по кн.Редактировать

...

ЗадатьЗначение

(Элемент:

Forms![Детали]![Ввод_цены].Visible,

Выражение: Истина)

Надпись Введитеновуюценустановится видимой

[Редак_сохр].Caption=“Сохранить”

ЗадатьЗначение

(Элемент: [цена]

Выражение: [ПолеРедак])

Сохраняем новую цену в поле цена

...

ЗапускМакроса

(Имя макроса:

Редак_цены.На1)

Этот макрос изменяет текст на кнопках, соответствующий первому режиму

На1

ЗадатьЗначение

(Элемент:

[Редак_сохр].Caption,

Выражение: “Редактировать”)

Переход в режим редактирования

ЗадатьЗначение

(Элемент:

[Выход_отменить].Caption,

Выражение: “Выход”)

ЗадатьЗначение

(Элемент:

Forms![Детали]![ПолеРедак],

Выражение: Null)

Очистка поля ПолеРедак

фун_вых_отм

[Выход_отменить].Caption=“Выход”

ЗапускМакроса

(Имя макроса:

Редак_цены.Закрыть)

[Выход_отменить].Caption=“Отменить”

ЗапускМакроса

(Имя макроса:

Редак_цены.На1)

Закрыть

Закрыть

(Тип объекта: Форма,

Имя объекта: Детали)

На2

ЗадатьЗначение

(Элемент:

[Выход_отменить].Caption,

Выражение: “Отменить”)

Переход в режим сохранения новой цены или отмены редактирования

ЗадатьЗначение

(Элемент:

Ввод_цены].Visible,

Выражение: Ложь)

Делает невидимой надпись

ЗадатьЗначение

(Элемент:

[Редак_сохр].Caption,

Выражение: “Сохранить”)

Теперь необходимо установить следующие значения свойствам элементов формы Детали:

  • Свойству Послеобновлениядля поляПолеРедак- значение имени макросаРедак_цены . На2(выбрать из списка)

  • Свойству Нажатиекнопкидля кн.Редак_сохр- значение имени макросаРедак_цены . фун_редак_сохр

  • Свойству Нажатиекнопкидля кн.Выход_отменить- значение имени макросаРедак_цены . фун_вых_отм

Соседние файлы в папке Материалы для лабораторных Базы данных