
- •Санкт-Петербургский
- •Оглавление
- •5. Формы 25
- •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. На добавление записей
- •Insert into Детали (номерд, имяд, цена )
- •Insert into Детали (номерд, имяд, цена )
- •Values ( 15, “ролик”,150);
- •Insert into Новая ( [номер поставщика], [номер детали], [имя детали], [город] )
- •4.7.4.2. Запрос на удаление записей
- •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. Создание пользовательских меню с помощью макросов
- •8. 3.2. Создание пользовательских меню с помощью своей панели инструментов
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(“*”;”Поставщики”)) |
|
Сообщение (Сообщение: Готово) |
Фиксирует окончание корректировки. |
Закрыть (Тип объекта: Форма, Имя объекта: Поставщики) |
|
ОткрытьТаблицу (Имя таблицы: Поставщики) |
Для контроля правильности корректировки. |
СдвизРазмер (По правому краю: 10см.)., От верхнего края: 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(выбрать из списка)
Свойству Нажатиекнопкидля кн.Редак_сохр- значение имени макросаРедак_цены . фун_редак_сохр
Свойству Нажатиекнопкидля кн.Выход_отменить- значение имени макросаРедак_цены . фун_вых_отм