Помощь Выход

Глава 10. Использование диаграмм в отчете

Диаграммы - это представление табличных данных в наглядной графической форме, наиболее удобной для их анализа и сравнения.

Построить диаграмму в отчете можно двумя способами: в существующий отчет вставить диаграмму (команда Вставка\Диаграмма) или предусмотреть включение диаграммы при создании нового отчета (на первом шаге построения отчета выбрать пункт Мастер диаграмм).

На практике при построении диаграмм зачастую представляется целесообразным осуществлять группировку данных, и такая возможность в Access предусмотрена. Например, по полю, имеющему тип Дата/время, можно сгруппировать данные по годам, кварталам, месяцам, дням, часам и минутам. Здесь мы построим диаграмму объема продаж товаров некоторого поставщика, сгруппировав данные по дням.

Сначала построим запрос, обеспечив данные для построения диаграммы. Запрос должен предоставлять следующую информацию: имя поставщика (таблица Поставщик), дату и объем продаж (таблица Продажи), наименование и розничную цену товара (таблица Товары). Эта информация даст нам возможность проанализировать темпы продаж товаров. Таким образом, в запрос следует включить таблицы Товары, Продажи и Поставщик. Отбирать будем данные только по продажам, т.е. не будем учитывать списание и возврат; тогда условие отбора записей будет иметь вид Прод_возвр = ‘Пр’. Для подсчета объема продаж добавим в запросе вычисляемое поле Сум: [Количество]*[Цена_розн]. Назовем этот запрос Продажи поставщика.

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

Изображенное на рисунке расположение полей на шаблоне диаграммы было выбрано мастером диаграмм. Единственное числовое поле ([Сум]) помещено в область данных диаграммы, т.е. значения этого поля (просуммированные по наименованиям и датам продажи) и будут откладываться на диаграмме. По оси абсцисс откладывается дата продажи (по дням), а наименования товаров и соответствующие им обозначения приводятся в легенде диаграммы. Если предложенный мастером вариант вас не устраивает, его легко можно изменить простым перемещением полей при помощи протяжки мыши. Изменить порядок группировки или вид вычислений (скажем, не сумма, а максимальное значение) позволяет двойной щелчок по соответствующему полю на макете диаграммы.

По завершении работы с мастером в отчет помещается объект OLE, источником которого является приложение MS Graph, предназначенное для построения диаграмм в тех офисных приложениях фирмы Microsoft, которые не имеют своих средств построения диаграмм (например, в Excel). Поэтому для форматирования диаграммы в MS Graph, следует выполнить двойной щелчок на диаграмме в режиме конструктора отчета.

Для редактирования данных диаграммы следует выделить диаграмму в режиме конструктора отчета и воспользоваться Построителем для поля Источник строк в окне свойств.

Например, чтобы получить диаграмму для конкретного поставщика, можно в условиях отбора для поля Код_поставщика указать конкретный код (на рисунке выбрано значение 5 для кода поставщика) или же для поля ФИО_поставщика указать конкретную фамилию. Как видно, источник строк для диаграммы представляет собой некий запрос, который можно сохранить как объект базы данных, что нами и будет сделано.

Те, кто строил диаграммы в MS Excel, будут разочарованы, узнав, что здесь нет возможности вернуться к диалогу с мастером диаграмм для ранее построенной диаграммы. Однако в этом нет особой необходимости, поскольку у нас имеются средства, как для форматирования, так и для изменения данных для диаграммы. Если редактирование запроса, служащего источником строк для диаграммы, не приведет вас к успеху, создайте новый отчет.

Создание запроса средствами VBA

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

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

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

Эти действия нам уже знакомы. Единственная проблема, которую нужно в данном случае решить, это - каким образом данные из списка включать в условия отбора для запроса, служащего источником данных для построения диаграммы. Можно использовать запросы с параметрами (глава 9). Однако это постоянно будет вызывать появление окна для ввода значения параметра и, таким образом, использование списка окажется, по существу, ненужным. Кроме того, поскольку информацию можно выбрать из списка, хотелось бы избежать ее ввода с клавиатуры.

Поступим следующим образом. Будем создавать запрос, служащий источником строк для диаграммы, непосредственно в событийной процедуре нажатия кнопки на форме Выбор поставщика. При этом в условия отбора записей будем включать поставщика, выбранного в списке этой формы. Этот запрос должен формулироваться на языке SQL. Причем для решения нашей задачи досконального знания этого языка не требуется, поскольку в Access можно любой запрос, построенный в конструкторе, перевести на язык SQL с помощью команды Вид/Режим SQL. Предлагаемый алгоритм будет создавать запрос как объект базы данных, поэтому сначала сохраним запрос, служащий источником строк диаграммы (назовем его Запрос для диаграммы по поставщикам - смотри рисунок), а из запроса Продажи поставщика уберем условия отбора. В событийной процедуре нужно будет предусмотреть еще один момент, а именно: попытка создать запрос с именем уже имеющегося запроса будет вызывать сообщение об ошибке. Чтобы избежать этого, сначала будем удалять (в коде VBA) имеющийся запрос, а затем создавать новый с тем же именем. Наконец, будем печатать отчет с диаграммой.

Чтобы реализовать описанный выше алгоритм, выполним следующие действия.


1. Дадим имя выбор полю со списком на форме Продажи по поставщикам.
2. Скопируем запрос (источник строк) в виде оператора SQL в буфер обмена и сохраним его в базе данных под именем Запрос для диаграммы по поставщикам. Для этого:
- В отчете, содержащем диаграмму (Диаграмма продаж), выделим диаграмму и в окне свойств на вкладке Данные нажмем кнопку построителя выражений в строке Источник строк.
- Выберем команду Файл\Сохранить (даем имя Запрос для диаграммы по поставщикам).

- Теперь выполним команды Вид\Режим SQL и Правка\Копировать. (Совет: перед копированием целесообразно добавить в запрос условие отбора по полю Код_поставщика. Это упростит редактирование SQL-запроса).
3. Вставим в событийную процедуру нажатия кнопки на форме скопированный ранее SQL-запрос. Он будет выглядеть примерно так:
TRANSFORM Sum([Продажи поставщика].Сум) AS Сумма
SELECT [Продажи поставщика].Дата_продажи
FROM [Продажи поставщика]
WHERE ((([Продажи поставщика].Код_поставщика)=5))
GROUP BY [Продажи поставщика].Дата_продажи
PIVOT [Продажи поставщика].Наименование;
4. Отредактируем событийную процедуру нажатия кнопки печати отчета в соответствии с предложенным алгоритмом (сравните окончательное выражение запроса с выражением из пункта 3):
Dim запрос As QueryDef, nameQuery As String
Dim stDocName As String
nameQuery = "Запрос для диаграммы по поставщикам"
‘ Удаляем существующий запрос
CurrentDb.QueryDefs.Delete nameQuery
‘ Создаем новый запрос с тем же именем
Set запрос = CurrentDb.CreateQueryDef(nameQuery)
‘ Ниже отредактирован скопированный запрос для источника строк диаграммы. Обратите внимание на предложение WHERE - в условиях отбора используются данные из списка Выбор». Сравните выражение ‘запроса с выражением из пункта 3.

запрос.SQL = "TRANSFORM Sum([Продажи поставщика].Сум) _
AS Сумма "
"SELECT [Продажи поставщика].Дата_продажи "
_
"FROM [Продажи поставщика] "
_
"WHERE ((([Продажи поставщика].Код_поставщика) = "
_
Me!Выбор
")) "
_
"GROUP BY [Продажи поставщика].Дата_продажи "
_
"PIVOT [Продажи поставщика].Наименование"
stDocName = "Диаграмма продаж
‘ Открываем отчет в режиме просмотра
DoCmd.OpenReport stDocName, acPreview

Параметры запуска и главная форма


Законченное приложение должно предоставлять все средства для работы с базой данных максимально просто и надежно. Использование стандартных средств, предоставляемых оболочкой MS Access, нежелательно, поскольку это требует высокой квалификации от пользователя. Кроме того, возможность редактирования всех объектов базы данных может привести к нарушению работоспособности приложения.
Access позволяет обеспечить защиту различных объектов базы данных предоставлением разных прав группам и отдельным пользователям. При этом используется система регистрации пользователей при помощи файла рабочих групп. Например, можно запретить изменение данных, редактирование форм отчетов, запросов и модулей (команда Сервис\Защи¬та\Раз¬решения). Помимо этого, можно создать так называемый MDE-файл, который не допускает возможности редактирования и создания новых объектов, представляющих собой элементы интерфейса приложения, а также не содержит текстов VBA-процедур, которые предварительно компилируются. MDE-файл можно создать при помощи команды Сервис\Служебные программы\Создать MDE-файл....

Пароль на открытие приложения базы данных, который задается при помощи команды Сервис\Защита\Задать пароль базы данных..., не позволит работать с базой данных и ознакомиться с информацией лицам, не имеющим на это прав.

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


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

Для создания главной кнопочной формы можно воспользоваться обычной формой с кнопками для запуска других форм, отчетов и т.д. Пример такой формы показан на рисунке. (Кнопка Доходы открывает форму Финансовая деятельность).

На форму можно поместить рисунок (свойство Рисунок на вкладке Макет в окне свойств), а также обеспечить всплывающие подсказки ко всем кнопкам (свойство Всплывающая подсказка на вкладке Другие).

Чтобы эта форма автоматически запускалась при открытии файла-приложе¬ния, нужно выбрать ее из списка Вывод формы/страницы в диалоговом окне Параметры запуска (команда Сервис\Параметры запуска). Кроме того, как видно на рисунке 10.6, имеется возможность задать заголовок приложения, который будет использован вместо заголовка Microsoft Access, и выбрать значок приложения (вместо стандартного значка Access в виде ключа).

Таким образом, можно создать приложение, которое будет запускаться так, как будто MS Access вовсе нет, хотя для работы приложения на компьютере должен быть установлен пакет MS Access (или, по крайней мере, необходимые библиотеки доступа к данным). Можно даже заменить стандартную заставку, которая появляется на экране в течение нескольких секунд при загрузке MS Access. Для этого достаточно в папку, содержащую используемое приложение, поместить графический файл с тем же, что и у приложения именем и расширением .BMP, который и будет использован в качестве заставки при запуске приложения.

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

Однако вернемся к кнопочным формам. В MS Access имеется программа мастер для разработки и редактирования стандартной кнопочной формы. Этот мастер называется Диспетчером кнопочных форм, который запускается из меню Сервис\Служебные программы. Диспетчер кнопочных форм позволяет создать многостраничную кнопочную форму, каждая кнопка которой позволяет выполнить одну из команд:


• Переход к кнопочной форме (другой странице)
• Открытие формы в режиме добавления
• Открытие формы в режиме редактирования
• Открытие отчета
• Изменение кнопочной формы
• Выход из приложения
• Запуск макроса
• Запуск программы

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

Форма Главная, которую мы создали с помощью конструктора форм, содержит две кнопки – Прием товаров и Список товаров. Эти кнопки будут открывать одну и ту же форму Прием товаров в разных режимах. Как уже обсуждалось нами ранее при разработке этой формы, при вводе новой информации нежелательно выводить все записи, поскольку можно непреднамеренно «отредактировать» ранее введенную информацию. Поэтому по кнопке Прием товаров мы будем открывать форму в режиме ввода данных с помощью команды


DoCmd.OpenForm "Прием товаров", , , , acFormAdd

Константа acFormAdd в аргументе Режим данных макрокоманды OpenForm позволяет открыть форму в режиме добавления новых записей, при котором вся остальная информация не выводится на экран. С остальными аргументами этой макрокоманды можно ознакомиться по справке. Заметим, что использование диспетчера кнопочных форм избавит вас от написания событийной процедуры, поскольку соответствующую команду можно просто выбрать в диалоге с мастером. Также не потребует программирования использование макроса, при конструировании которого значения аргументов макрокоманды выбираются из списка, после чего этот макрос можно выбрать для обработки события нажатия соответствующей кнопки.

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


DoCmd.OpenForm "Прием товаров", , , , acFormReadOnly