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

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(“*”;”Поставщики”))

Сообщение

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

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

Закрыть

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

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

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

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

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

СдвизРазмер

(От левого края: 1см.,

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

Сообщение

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

Закрыть

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

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

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

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

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

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

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

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

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

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

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

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

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

Имя макроса

Условие

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

Примечание

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

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

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

ПолеРедак)

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

...

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

(Элемент:

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

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

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

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

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

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

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

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

...

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

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

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

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

На1

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

(Элемент:

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

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

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

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

(Элемент:

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

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

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

(Элемент:

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

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

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

фун_вых_отм

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

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

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

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

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

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

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

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

Закрыть

Закрыть

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

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

На2

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

(Элемент:

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

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

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

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

(Элемент:

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

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

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

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

(Элемент:

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

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

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

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

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

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