Глава 9
лее выберите макрокоманду
Создать запись
(CreateRecord) с аргументом
Изме-
ненныеЗаписи
, отображаемую в макросе как
Создать запись в
(Create a Record
In), и три макрокоманды
ЗадатьПоле
(SetFeeld) для присвоения значений полям
таблицы
ИзмененныеЗаписи
.
Рис. 9.27.
Именованный макрос данных с параметрами
6.
Закройте макрос. По умолчанию макрос получит имя
ТОВАР.МакросДанных1
.
7.
Организуйте вызов именованного макроса при изменении цены в таблице
ТОВАР. Для этого при открытой таблице ТОВАР выберите опцию
ПослеОб-
новления
(AfterUpdate) и дополните ранее созданный для нее макрос данных
макрокомандой
ЗапускМакросаДанных
(RunDataMacro) (рис. 9.28).
8.
Для вывода в макросе строки параметров выберите опцию
Обновить
парамет-
ры
(UpdateParameters). Присвойте параметрам значения из обновленной записи
таблицы ТОВАР, а для получения значения старой цены используйте функцию
[Old].[ЦЕНА]
. Закройте макрос, сохранив внесенные изменения.
9.
Измените в таблице цену одного из товаров и убедитесь, что в таблице
ОТГРУЗКА во всех записях с кодом товара с обновленной ценой сумма отгруз-
ки пересчиталась, а в таблицу
ИзмененныеЗаписи
внесена новая запись. Об-
новления в таблицы вносятся вне зависимости от того, открыты они или закры-
ты. Если таблица открыта, может понадобиться обновить ее отображение, на-
пример, закрыв и повторно открыв.
Разработка приложений с использованием макросов
395
Рис. 9.28.
Вызов именованного макроса данных и передача ему параметров
Задача 2
Пусть необходимо при отгрузке товара по накладной уменьшать его остаток на
складе. Предположим, в нашей базе данных склад и товар находятся в отношении
1 : М. Если товар хранится только на одном складе, остаток товара можно размес-
тить в поле таблицы ТОВАР. Дополните таблицу ТОВАР полем
Остаток
.
1.
Откройте таблицу ОТГРУЗКА в режиме таблицы и щелчком мыши на кнопке
ПослеВставки
(AfterInsert) создайте макрос данных, который будет выполнять-
ся при добавлении в нее новых записей. В макросе используйте макрокоманду
Найти запись в
(Look Up a Record In) с аргументом ТОВАР и для найденной
записи макрокоманду
ИзменитьЗапись
(EditRecord). В рамках последней с по-
мощью макрокоманды
ЗадатьПоле
(SetField) присвойте полю
Остаток
новое
значение, уменьшенное на количество отгруженного товара (рис. 9.29).
2.
Убедитесь, что при добавлении новой записи в таблицу ОТГРУЗКА через форму
также будет выполняться макрос данных таблицы. Откройте форму
Накладная
,
построенную на таблицах НАКЛАДНАЯ и ОТГРУЗКА. В последней хранятся
данные из спецификации накладной. Дополните одну из накладных строкой
396
Глава 9
спецификации, указав, какой товар и в каком количестве отгружается по на-
кладной. Откройте таблицу ТОВАР и в поле
Остаток
увидите обновленное зна-
чение.
Рис. 9.29.
Макрос данных, выполняющийся после вставки записи в таблицу ОТГРУЗКА
Задача 3
Пусть необходимо при добавлении новой записи об отгрузке товара рассчитать,
какое количество товара всего отгружено по договору. Такой расчет позволит
отслеживать выполнение плана отгрузки по каждому товару. Ввод данных по от-
грузке может осуществляться непосредственно в таблицу ОТГРУЗКА или через
форму.
Количество каждого товара, которое должно быть отгружено покупателю в соот-
ветствии с договором в конкретном месяце, хранится в записях таблицы
ПОСТАВКА_ПЛАН. Для сохранения количества товара, уже отгруженного по до-
говору, можно предусмотреть в этой таблице дополнительное поле
ВыполнениеПлана
.
Макрос для решения этой задачи, так же как и при расчете остатка товара на скла-
де, должен выполняться при наступлении действия
ПослеВставки
(AfterInsert).
Поиск в таблице ПОСТАВКА_ПЛАН, требующей обновления записи, может быть
выполнен как в макросе
ПослеВставки
, так и вынесен в именованный макрос.
В последнем случае вызов именованного макроса и подготовка необходимых для
него параметров выполняются в макросе
ПослеВставки
.
На рис. 9.30 представлен именованный макрос таблицы ОТГРУЗКА
МакросДан-
ных1
, в котором определены параметры, необходимые для поиска записи и обнов-
ления значения в поле
ВыполнениеПлана
таблицы ПОСТАВКА_ПЛАН. Напомним,
что поля Номер договора, Месяц отгрузки и Код товара составляют ключ этой
таблицы. Макрокоманда
Найти запись в
(Look Up a Record In) таблице
ПОСТАВКА_ПЛАН возвращает запись, соответствующую заданному условию
отбора:
Разработка приложений с использованием макросов
397
([ПОСТАВКА_ПЛАН].[НОМ_ДОГ]= Параметр4 And
[ПОСТАВКА_ПЛАН].[СРОК_ПОСТ]=[Параметр3] And
[ПОСТАВКА_ПЛАН].[КОД_ТОВ]=[Параметр1])
Макрокоманда
ИзменитьЗапись
(EditRecord), входящая в блок макрокоманды
Найти запись в
(Look Up a Record In), ссылаясь на псевдоним найденной записи,
выполняет макрокоманду
ЗадатьПоле
(SetField), которая прибавляет указанное
в записи об отгрузке количество к имеющемуся в поле
ВыполнениеПлана
.
З
АМЕЧАНИЕ
Чтобы выражение могло быть вычислено при первой отгрузке товара, полю
Выполнение-
Плана
по умолчанию должно присваиваться нулевое значение.
Рис. 9.30.
Именованный макрос поиска и обновления записи в таблице ПОСТАВКА_ПЛАН
При открытой таблице ОТГРУЗКА в режиме таблицы щелчком мыши на кнопке
ПослеВставки
(AfterInsert) откройте существующий макрос данных (см. рис. 9.29).
Дополните макрос макрокомандами, которые позволят получить значения необхо-
димых в именованном макросе параметров, и макрокомандой вызова именованного
макроса (рис. 9.31). Код товара и количество отгруженного выбираются из встав-
ленной новой записи таблицы ОТГРУЗКА, а два недостающих Номер договора и
Месяц отгрузки надо выбрать из таблицы НАКЛАДНАЯ.
Чтобы найти запись в накладной, нужно задать значения ее ключевых полей: Но-
мер накладной и Код склада. Значения этих полей имеются в добавленной в табли-
398
Глава 9
цу ОТГРУЗКА записи. Однако использование в условии отбора логического выра-
жения с оператором
And
приводит к необходимости определения локальных пере-
менных. Сформируйте логическое выражение, как показано на рис. 9.31, и заклю-
чите его в круглые скобки. Аргумент
ПсевдонимНакладной
макрокоманды
Найти
запись в
(Look Up a Record In) НАКЛАДНОЙ можно опустить, т. к. он в рассмат-
риваемой программе не используется.
Чтобы запомнить значения полей из найденной записи, определите в рамках мак-
рокоманды
Найти запись в
НАКЛАДНОЙ локальные переменные. Для выделения
из даты отгрузки номера месяца, необходимого при поиске записи в таблице
ПОСТАВКА_ПЛАН, используйте в выражении присваиваемом переменной функ-
цию
Month
.
После того как значения всех параметров подготовлены и доступны, вызовите име-
нованный макрос
ОТГРУЗКА.МакросДанных1
. Для вывода строк с параметрами
и присвоения им значений щелкайте по надписи
Обновить параметры
(UpdateParameters).
Рис. 9.31.
Вызов именованного макроса с параметрами
Разработка приложений с использованием макросов
399
З
АМЕЧАНИЕ
Если в логическом выражении условия отбора использованы логические операторы
And
,
Or
или другие, то вместо имен полей нужно использовать локальные переменные
и заключать такое выражение в круглые скобки.
Регистрация событий
Возникающие при выполнении макросов ошибки заносятся системой в журнал ре-
гистрации — системную таблицу с именем
USysApplicationLog
. При этом в строке
состояния отображается надпись
Новые ошибки приложения
. Щелкните на ней,
чтобы просмотреть эти ошибки. Обнаруженные системой ошибки отмечены
в столбце
Category
значением
Execution
.
Использовав макрокоманду
РегистрацияСобытия
(LogEvent), пользователь может
включать в журнал свои замечания. Они отмечаются в столбце категории значени-
ем
User
.
Если в параметрах навигации установить значок
Показать системные объекты
(Show System Objects), то можно увидеть таблицу журнала регистрации наряду
с пользовательскими таблицами. Щелкните правой кнопкой мыши в нижней части
области навигации в ее свободном пространстве и в контекстном меню найдите
команду
Параметры навигации
(Navigation Options). В окне
Параметры навига-
ции
устанавливаются
Параметры отображения
(Display Options), в том числе
По-
казать системные объекты
.
При отсутствии ошибок, обнаруживаемых системой, просмотреть пользователь-
ские сообщения в журнале регистрации можно, открыв соответствующую таблицу
в области навигации.
Задание 9.1
Измените рассмотренный выше макрос данных
ПослеВставки
(AfterInsert)
для
таблицы ОТГРУЗКА так, чтобы в поле
ВыполнениеПлана
отображалось недопостав-
ленное количество товара.
Задание 9.2
Создайте макрос данных, который будет выполняться при изменении цены в таб-
лице ТОВАР и изменять стоимость в таблице ПОСТАВКА_ПЛАН для договоров,
заключенных после текущей даты, для которых еще не было отгрузок.
Контрольные вопросы
1.
Чем определяется последовательность выполнения макрокоманд?
2.
Какая макрокоманда позволяет изменить текущую запись в объекте?
3.
Должен ли объект, в котором меняется текущая запись, быть текущим?
400
Глава 9
4.
Сделается ли объект текущим после выполнения макрокоманды, изменяющей
текущую запись в нем?
5.
Какая макрокоманда позволяет изменить значение поля записи?
6.
Какой объект будет текущим в макросе, если он не установлен явно?
7.
Можно ли в логическом выражении условия использовать функцию?
8.
Как записывается ссылка на элемент управления в форме?
9.
В ссылке на свойство каким знаком отделяется имя свойства от имени элемента
управления?
10.
Как организовать последовательное выполнение нескольких запросов дей-
ствия?
11.
Какие аргументы имеет макрокоманда
ОткрытьЗапрос
(OpenQuery)?
12.
Какое значение должен иметь аргумент
Режим
(View), чтобы макрокоманда
ОткрытьЗапрос
(OpenQuery) приводила к выполнению запроса?
13.
Какая макрокоманда позволяет из макроса вывести на экран сообщение?
14.
Какая команда позволяет начать выполнение макроса из области навигации?
15.
Как просмотреть все внедренные в формы макросы?
16.
Как просмотреть, какие именованные макросы имеются в базе данных?
17.
Как вставить содержимое одного макроса в другой?
18.
Как организовать выполнение макроса при открытии формы?
19.
Какая макрокоманда позволяет создать в макросе группу макросов, каждый из
которых доступен для выполнения?
20.
Как записывается ссылка на макрос, который включен в группу?
21.
Какая макрокоманда позволяет выполнить фильтрацию записей?
22.
К какому объекту применяется команда фильтрации записей?
23.
Какая макрокоманда позволяет снять действие фильтра?
24.
Почему в макрокоманде
ЗадатьЗначение
(SetValue) в выражении
[Формы]!
[Отгрузки покупателям]![СКОЛ_ОТГР]+[КОЛ_ОТГР]
при записи ссылки на поле
СКОЛ_ОТГР
использован полный синтаксис, а для ссылки на поле
КОЛ_ОТГР
в фор-
ме ОТГРУЗКА_ПФ
нет?
25.
Может ли одно действие пользователя приводить к возникновению нескольких
событий?
26.
Отображается ли внедренный макрос среди объектов области навигации?
27.
С какими объектами работает макрос данных?
28.
При каких действиях в таблице выполняются макросы данных?
29.
Можно ли для таблицы создать несколько макросов данных
ПослеВставки
(AfterInsert)?
Разработка приложений с использованием макросов
401
30.
Можно ли именованный макрос данных вызвать из внедренного макроса формы?
31.
Какая макрокоманда позволяет организовать цикл в макросе данных?
Ответы
1.
Порядком размещения макрокоманд в программе и условиями, заданными в
блоке
Если
(
If
).
2.
НаЗапись
(GoToRecord).
3.
Нет.
4.
Нет.
5.
ЗадатьЗначение
(SetValue).
6.
Объект, из которого вызывается макрос.
7.
Да.
8.
Forms![
Имя_формы
]![
Имя_элемента_управления
]
.
9.
Точкой.
10.
Записать в макросе соответствующее число макрокоманд
ОткрытьЗапрос
(OpenQuery).
11.
Имя
запроса
(Query Name),
Режим
(View) и
Режим
данных
(Data Mode).
12.
Таблица
(Datasheet).
13.
ОкноСообщения
(MsgBox).
14.
Выполнить
(Run) в контекстном меню или на вкладке
Работа с базами дан-
ных
(Database Tools).
15.
В
каталоге макрокоманд
в блоке
В этой базе данных/Формы
(In this
Database|Forms).
16.
В каталоге макрокоманд
в блоке
В этой базе данных/Таблицы
(In this
Database|Tables).
17.
Открыть принимающий макрос и, выбрав вставляемый в каталоге макрокоманд
в блоке
В этой базе данных
(In this Database), выполнить двойной щелчок.
18.
Записать в строку свойства события формы
Открытие
(On Open) имя макроса
или создать внедренный макрос.
19.
Вложенный макрос
(Submacro).
20.
ИмяГруппыМакросов.имяВложенногоМакроса
.
21.
ПрименитьФильтр
(ApplyFilter).
22.
К текущему объекту.
23.
ПоказатьВсеЗаписи
(ShowAllRecords).
24.
Форма ОТГРУЗКА_ПФ является текущей.
402
Do'stlaringiz bilan baham: |