Подготовка отчетов в Crystal Reports. Урок 4

Игорь Кузнецов

Урок 1 / Урок 2 / Урок 3 / Урок 5 / Урок 6

При генерации отчета в зависимости от его сложности Seagate Crystal Reports выполняет формирование отчета в три этапа, которым могут предшествовать некоторые подготовительные действия. Первым предварительным действием является вычисление всех формул, значения которых постоянны и не будут изменяться, то есть не зависят от содержимого записей. Это действие носит название «BeforeReading Records». После этого начинается первый этап чтения записей базы данных. На данном этапе выполняются следующие действия:

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

На предварительном шаге перед вторым этапом Seagate Crystal Reports упорядочивает группы в соответствии с заданной иерархией (например, Top/Bottom N). На этом шаге чтения записей не происходит, а осуществляется только просмотр групп, сформированных на первом этапе.

На втором этапе Seagate Crystal Reports выполняет требуемое форматирование данных на страницах, осуществляя следующие действия:

  • выбор групп по заданному фильтру,
  • вычисление полей Running totals,
  • вычисление значений формул, использующих итоги (это действие носит название «WhilePrintingRecords»),
  • создание диаграмм и карт,
  • создание подчиненных отчетов,
  • выполнение генерации страниц отчета по требованию.

На третьем и последнем этапе создания отчета выполняется подсчет общего числа страниц отчета (рис. 17).


Рис. 17. Граф процесса генерации отчета в Crystal Reports

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

Поля Running totals. Специальные поля, позволяющие контролировать подсчет итогов, могут использоваться для решения следующих задач:

  • подсчет значений итогов по каждой записи,
  • создание итогов, независимых от группирования записей,
  • вычисление итогов с использованием условий,
  • вычисление итогов для таблиц со связью «один-ко-многим».

В зависимости от той области отчета, в которой будет помещено поле Running totals, результат, возвращаемый формулой, будет различным.

Report Header возвращает только первую запись отчета.
Page Header cоздает итог и включает в него первую запись текущей страницы.
Group Header cоздает итог и включает в него первую запись текущей группы.
Details area cоздает текущий итог для каждой записи (с накоплением).
Group Footer cоздает общий итог для каждой группы.
Report Footer cоздает итог и включает в него первую запись со следующей страницы.
Page Footer cоздает общий итог для всех записей.

Создадим текущие итоги (Running totals) для каждой записи. Для этого создадим простой отчет на базе таблиц Customers и Orders из базы данных Xtreme.mdb. В отчет включаем поля customer.

CUSTOMER NAME, orders.ORDER ID, orders.ORDER AMOUNT. Дополним отчет полем с текущим итогом, для чего осуществим следующие действия:

1. Выполним команду Insert - Running Total Fields. В появившемся окне «Field Explorer» щелкнем по кнопке New.

2. В окне «Create Running Total Field» в строку Running Total Name введем текст «TotalOrders». В области «Available Tables and Fields» выделим orders.ORDER AMOUNT и щелчком по первой из кнопок со стрелкой вправо перенесем его в строку «Field to summarize». В раскрывающемся списке «Type of summary» выбираем функцию SUM. В области «Evaluate» выберем значение переключателя «On change of field» и в одноименную строку с помощью второй кнопки со стрелкой вправо занесем имя поля - orders.ORDER ID. Это приведет к подсчету итоговых значений при каждом изменении содержимого этого поля. В области «Reset» сохраним значение переключателя «Never», что приведет к накоплению итоговых значений по всем данным отчета (рис. 18). Щелчок по кнопке ОК сохранит выбранные установки и возвратит нас к окну «Field Explorer».


Рис. 18. Окно определения параметров поля Running Total

3. С помощью кнопки Insert to Report вставим поле TotalOrders правее всех полей отчета в области Detail. Перейдя на вкладку Preview, можно увидеть текущие итоги в правом столбце отчета.

Аналогичным образом можно создать текущие итоги для групп записей, но предварительно следует осуществить требуемое группирование. Снова создадим простой отчет на базе таблиц Customers и Orders из базы данных Xtreme.mdb, в который включим поля customer.CUSTOMER NAME, orders.ORDER ID, orders.ORDER AMOUNT, и проделаем следующее:

1. Выполним команду Insert - Group и создадим группировку по полю cus tomer.USTOMER NAME.

2. Выполним команду Insert - Running Total Fields. В появившемся окне «Field Explorer» щелкнем по кнопке New.

3. В окне «Create Running Total Field» в строку Running Total Name введем Group RunningTotal. В области «Available Tables and Fields» выделим orders.ORDER AMOUNT и щелчком по первой из кнопок со стрелкой вправо перенесем его в строку «Field to summarize». В раскрывающемся списке «Type of summary» выбираем функцию SUM. В области «Evaluate» выберем значение переключателя «For each record». В области «Reset» выберем значение переключателя «On change of group» и оставим предложенное по умолчанию имя группы (рис. 19). Щелчок по кнопке ОК сохранит выбранные установки и возвратит в окно «Field Explorer».


Рис. 19. Определение параметров поля Running Total для групп запсей.

.

4. С помощью кнопки Insert to Report вставим поле GroupRunningTotal правее всех полей отчета в области Detail. Перейдя на вкладку Preview, можно увидеть текущие итоги в правом столбце отчета. Если необходимо создать общий итог для каждой группы, то поле Group RunningTotal следует поместить в область Group Footer.

Если в отчете не следует группировать записи или требуется оставить их рассортированными по другому признаку, но необходимо подсчитать итоги с учетом определенных условий, можно воспользоваться текущими итогами по условию. Для примера таких итогов предварительно создадим простой отчет на базе таблиц Customers и Orders из базы данных Xtreme.mdb. В отчет включим поля customer.

CUSTOMER NAME, customer.COUNTRY, customer.LAST YEAR’S SALES.

Дополним отчет полем с текущим итогом по условию, для чего осуществим следующие действия:

1. Выполним команду Report - Sort Records и выберем сортировку по полю customer.CUSTOMER NAME.

2. Выполним команду Insert - Running Total Fields. В появившемся окне «Field Explorer» щелкнем по кнопке New.

3. В окне «Create Running Total Field» в строку Running Total Name введем USTotal.

В области «Available Tables and Fields» выделим customer.LAST YEAR’S SALES и щелчком по первой из кнопок со стрелкой вправо перенесем его в строку «Field to summarize». В раскрывающемся списке «Type of summary» выберем функцию SUM.

В области «Evaluate» выберем значение переключателя «Use a formula» и щелкнем по кнопке Formula. В открывшемся окне «Running Total Condition Formula Editor» в строку Formula вводим [Customer.Country] = «USA». Это значит, что при вычислении текущих итогов будут использованы только записи, значение поля customer.COUNTRY, которых равно USA. Проверяем синтаксис и закрываем окно щелчком по кнопке Save and Close.

В области «Reset» выберем значение переключателя «Never».

Щелчок по кнопке ОК сохранит выбранные установки и возвратит в окно «Field Explorer».

3. С помощью кнопки Insert to Report вставим поле USTotal правее всех полей отчета в области Detail. Перейдя на вкладку Preview можно увидеть условные текущие итоги в правом столбце отчета.

Урок 1 / Урок 2 / Урок 3 / Урок 5 / Урок 6


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=4062