- •Оглавление
- •1. Запуск access
- •2. Создание новой бд
- •3. Таблицы
- •3.1. Создание структуры таблицы
- •3.2. Загрузка таблицы данными
- •3.3. Модификация структуры таблицы
- •3.4. Работа с макетом таблицы
- •3.5. Схема данных
- •3.6. Печать таблицы
- •4. Запросы
- •4.1.Типы запросов
- •4.2.Создание qbe-запроса
- •4.3. Заполнение бланка запроса
- •4.4. Работа с построителем выражений
- •4.5. Редактирование запроса
- •4.6. Печать динамического набора данных
- •4.7. Примеры запросов
- •4.7.1. Запрос на выборку данных
- •4.7.2.Запрос с параметром (параметрический запрос)
- •4.7.3. Запрос на создание таблицы
- •4.7.4. Запросы на изменение данных
- •4.7.4.1. На добавление записей
- •4.7.4.3. Запрос на обновление (корректировку) данных
- •4.7.5. Группирование данных в запросе
- •4.7.6. Перекрестный запрос
- •4.7.7. Подчиненные (вложенные) запросы
- •4.8.Фильтрация данных
- •Фильтр по выделенному фрагменту данных
- •Фильтр для
- •5. Формы
- •5.1. Создание однотабличной формы
- •5.2. Редактирование формы
- •5.3. Часто используемые свойства формы
- •5.4. Элементы управления и их свойства
- •6. Отчеты
- •6.1. Создание отчета
- •6.2. Работа с отчетом в режиме конструктора
- •6.3. Сортировка и группировка данных
- •7. Макросы
- •7.1. Создание макросов
- •7.2. Краткая характеристика макрокоманд
- •7.3. Групповые макросы
- •7.4. Реализация ветвлений в макросах
- •7.4.1. Примеры макросов с односторонним ветвлением
- •7.4.2. Пример макроса с двусторонним ветвлением
- •7.5. Реализация циклов в макросах
- •8. Основы создания пользовательского интерфейса
- •8. 1. Взаимодействие форм
- •Интерфейс.Открыть просмотр
- •Интерфейс.Открыть редактирование
- •Интерфейс.Закрыть просмотр
- •8. 2. Создание кнопочных меню с помощью диспетчера кнопочных форм
- •8. 3. Создание пользовательских меню
- •8. 3.1. Создание пользовательских меню с помощью макросов
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![Поставщики]![имяп]), что означает “Пока не пусто значение поля имяп в таблице Поставщики”. Это условие можно использовать, если для всех поставщиков введено имя. Здесь поле номерп использовать нельзя, так как номерп является ключом.
Создать макрос Завершение отбора, который открывает сформированные таблицы для контроля и закрывает формы:
Макрокоманда |
Примечание |
ОткрытьТаблицу (Имя таблицы: Поствыдел) |
|
Сообщение |
Для приостановки макроса |
Закрыть (Тип объекта: Таблица, Имя объекта: Поствыдел) |
|
ОткрытьТаблицу (Имя таблицы: Постневыдел) |
|
Сообщение |
|
Закрыть (Тип объекта: Таблица, Имя объекта: Постневыдел) |
|
Закрыть (Тип объекта: Форма, Имя объекта: Поствыдел) |
|
Закрыть (Тип объекта: Форма, Имя объекта: Постневыдел) |
|
В форме Поставщики создать ЭУ Кнопка с надписью Отбор в цикле. Связать событие Нажатие кнопки с макросом Отбор в цикле.
Открыть форму Поставщики в режиме формы, 1с по кнопке Отбор в цикле и убедиться, что поставленная задача решается правильно.
Пример 28. Поставщики из города СПб переехали с Самару. Выполнить соответствующую корректировку таблицы Поставщики.
Решить эту задачу проще всего с помощью запроса на обновление. Однако здесь укажем способ решения этой задачи с использованием циклов в макросах.
Создать макрос Замена, который буде выполняться в цикле:
Макрокоманда |
Примечание |
НайтиЗапись (Образец поиска: СПб, Совпадение: Поля целиком, Область поиска: Вниз) |
|
ЗадатьЗначение (Элемент: Forms![Поставщики]![город], Выражение: “Самара”) |
|
Создать макрос Переехал:
Макрокоманда |
Примечание |
ОткрытьФорму (Имя формы: Поставщики) |
|
КЭлементуУправления (Имя элемента: город) |
Перенос фокуса на поле город в форме Поставщики. |
ЗапускМакроса (Имя макроса: Замена, Число повторов: =DCount(“*”;”Поставщики”)) |
|
Сообщение (Сообщение: Готово) |
Фиксирует окончание корректировки. |
Закрыть (Тип объекта: Форма, Имя объекта: Поставщики) |
|
ОткрытьТаблицу (Имя таблицы: Поставщики) |
Для контроля правильности корректировки. |
СдвизРазмер (От левого края: 1см., От верхнего края: 5см.) |
|
Сообщение |
Для приостановки макроса |
Закрыть (Тип объекта: Таблица, Имя объекта: Поставщики) |
|
Запустить макрос на выполнение и убедиться в правильности решения поставленной задачи.
Пример 29. Предоставим пользователю редактировать цену детали в каждой текущей записи формы Детали следующим образом.
Создадим в форме Детали четыре новых элемента управления:
Поле, которому через свойства дадим имя ПолеРедак
Надпись Введите новую цену , которую расположим над полем по имени ПолеРедак. Сделаем надпись невидимой (свойство Вывод на экран). Дадим надписи имя Ввод_цены.
Кнопку, на которой напишем текст Редактировать. Дадим кнопке имя Редак_сохр
Кнопку, на которой напишем текст Выход. Дадим кнопке имя Выход_отменить
Обеспечим два режима работы при редактировании цены детали в текущей записи
Режим редактирования цены детали. Этот режим устанавливается сразу при открытии формы Детали. В этом режиме на форме имеется две кнопки, на одной из них написан текст Редактировать, на другой - Выход. Чтобы можно было вводить новую цену в поле ПолеРедак нужно 1с по кн. Редактировать. Тогда становится видимой надпись Введите новую цену, в поле ПолеРедак появляется курсор, и можно вводить новую цену для текущей записи (сразу после открытия формы - это первая запись). Ввод новой цены заканчивается нажатием клавиши Enter и осуществляется переход в другой режим. По кн. Выход можно закончить редактирование и закрыть форму Детали.
Режим сохранения новой цены или отказа от редактирования. В этом режиме на тех же кнопках появляются другие надписи, на кнопке с надписью Редактировать теперь появится надпись Сохранить, а на кнопке с надписью Выход - надпись Отменить. В этом режиме снова становится невидимой надпись Введите новую цену. 1с по кн. Сохранить позволяет изменить цену детали, а 1с по кнопке Отменить позволяет отказаться от редактирования цены. После 1с по любой из этих кнопок осуществляется снова переход в режим редактирования. При этом делаются все соответствующие установки, характерные для него.
Для решения поставленной задачи создадим групповой условный макрос по имени Редак_цены:
Имя макроса |
Условие |
Макрокоманда |
Примечание |
фун_редак_сохр |
[Редак_сохр].Caption=“Редактировать” |
КЭлементуУправления (Имя элемента: ПолеРедак) |
Поле ввода новой цены получает фокус, если 1с по кн. Редактировать |
|
... |
ЗадатьЗначение (Элемент: Forms![Детали]![Ввод_цены].Visible, Выражение: Истина) |
Надпись Введите новую цену становится видимой |
|
[Редак_сохр].Caption=“Сохранить” |
ЗадатьЗначение (Элемент: [цена] Выражение: [ПолеРедак]) |
Сохраняем новую цену в поле цена |
|
... |
ЗапускМакроса (Имя макроса: Редак_цены.На1) |
Этот макрос изменяет текст на кнопках, соответствующий первому режиму |
На1 |
|
ЗадатьЗначение (Элемент: [Редак_сохр].Caption, Выражение: “Редактировать”) |
Переход в режим редактирования |
|
|
ЗадатьЗначение (Элемент: [Выход_отменить].Caption, Выражение: “Выход”) |
|
|
|
ЗадатьЗначение (Элемент: Forms![Детали]![ПолеРедак], Выражение: Null) |
Очистка поля ПолеРедак |
фун_вых_отм |
[Выход_отменить].Caption=“Выход” |
ЗапускМакроса (Имя макроса: Редак_цены.Закрыть) |
|
|
[Выход_отменить].Caption=“Отменить” |
ЗапускМакроса (Имя макроса: Редак_цены.На1) |
|
Закрыть |
|
Закрыть (Тип объекта: Форма, Имя объекта: Детали) |
|
На2 |
|
ЗадатьЗначение (Элемент: [Выход_отменить].Caption, Выражение: “Отменить”) |
Переход в режим сохранения новой цены или отмены редактирования |
|
|
ЗадатьЗначение (Элемент: Ввод_цены].Visible, Выражение: Ложь) |
Делает невидимой надпись |
|
|
ЗадатьЗначение (Элемент: [Редак_сохр].Caption, Выражение: “Сохранить”) |
|
Теперь необходимо установить следующие значения свойствам элементов формы Детали:
Свойству После обновления для поля ПолеРедак - значение имени макроса Редак_цены . На2 (выбрать из списка)
Свойству Нажатие кнопки для кн. Редак_сохр - значение имени макроса Редак_цены . фун_редак_сохр
Свойству Нажатие кнопки для кн. Выход_отменить - значение имени макроса Редак_цены . фун_вых_отм