Возможность формирования отчёта в Crystal Reports с различной ориентацией страниц

Александр Бородовицын, технический специалист Interface Ltd.

В нашу фирму (Interface Ltd.) среди многих других вопросов по приобретению, установке, использованию или обучению работе с теми или иными программными продуктами, поступает немалая доля вопросов на тему: "А как мне сделать в той или иной программе так вот, как я хочу?"

Один из таких вопросов - это вопрос по продукту Crystal Reports фирмы Crystal Decisions, который является самым популярным на сегодняшний день средством формирования разнообразных отчётных документов, основанных на информации из различных баз данных.

Вопрос этот звучит примерно так: "Можно получить в Crystal Reports отчёт*, в котором присутствует различная ориентация сформированных страниц (портретная, ландшафтная)?" (см рис. 1).

Рис. 1. Пример отчёта с различной ориентацией страниц

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

* или результирующий многостраничный документ. Условимся в дальнейшем называть его просто "отчётом", тем более, что это понятие согласуется с терминологией пакета Crystal Reports.

!

Желательно, чтобы при разработке отчёта Вы в полной мере владели:

  • нормативами и стандартами на документацию;
  • средствами разработки документации (в нашем случае Crystal Reports), т.е. знанием всех его возможностей;
  • методами получения необходимых данных из конкретной БД, в частности, языком SQL.
    Т.к. в противном случае возможно получение отчёта не в том виде, в каком нужно (в т.ч. его усложнение), или неоправданная потеря расходных средств (бумага, тонер), или усложнённая процедура получения документа и т.п.

С другой стороны, не следует забывать, что все программные пакеты по формированию отчётов ориентированы сейчас на отображение полученных документов, прежде всего, на экранах компьютеров, т.е. в сетях Intranet/Internet. А пользователь далее может делать с ними, что захочет: сохранять, печатать, импортировать... В связи с этим нельзя не упомянуть такой замечательный продукт фирмы Crystal Decisions, как Crystal Enterprise ). Время доступа к информации - это тоже деньги (time как всегда money). И дело вовсе не в "безбумажной" технологии, хотя и это тоже.

!
Crystal Enterprise - система для управления корпоративной отчетностью в масштабе предприятия. Основанная на Web-архитектуре, система хранит отчеты Crystal Reports на сервере и обеспечивает моментальный доступ к ним как внутри предприятия (через Intranet) так и вне его (через Internet) Подробнее об этой системе см. Crystal Enterprise 

Т.е., прежде чем включать в отчёт листы "обеих" ориентаций, убедитесь, что такая форма отчёта:
  • согласуется с корпоративными и/или внешними стандартами на этот вид документации;
  • деление данных (как правило, таблицы) на два листа, в том числе их возможного склеивания, будет представлять данные значительно хуже, чем один "повёрнутый" лист;
  • сформированный отчёт скорей всего будет использоваться только для печати.
    Если всё-таки ваша ситуация такова, что выгоднее печатать отчёт с листами "обеих" ориентаций (например, из-за большой потери бумаги при печати на двух листах формата А4 портретной ориентации), то рассмотрим следующие возможности для этого.

1-й подход

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

Используя такие мощные механизмы Crystal Report, как программирование событий и признаков, т.е. задание формул в полях форматирования, выборку, сортировку, группировку и т.п., можно не только "разделить" данные на два отчёта, но и выполнять более сложные действия, связанные с "нестандартностью" отчёта. Так, например, требуется печатать на страницах "общего" отчёта сквозную нумерацию страниц, особенно если листы с различной ориентацией идут "вразброд". Для этого в оба отчёта необходимо вставить формулы для расчёта пропущенных/распечатанных страниц.

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

  1. Подготавливаем два отчёта с соответствующим форматированием и группировкой по клиентам (например, по коду).
  2. Вводим в каждый отчёт вычисляемое поле (Formula Fields) СуммДопУслуг:
    {Доп.услуга1} + {Доп.услуга2} + {Доп.услуга3} + ...
    где {Доп.услугаN} -поле суммы соответствующей услуги из БД.
  3. В Section Expert для секции Details для признака Suppress вводим формулу:
    СуммДопУслуг > 0 //Для отчёта с "портретной" ориентацией
    //СуммДопУслуг = 0 //Для отчёта с "ландшафтной",
    а для признака New Page After вводим формулу:
    СуммДопУслуг = 0 //Для отчёта с "портретной" ориентацией
    //СуммДопУслуг > 0 //Для отчёта с "ландшафтной"
    (Если была включена группировка, то это надо ввести и для Group Header и Group Footer)
  4. В секцию Page Footer вставляем Special Fields: Record Number (если один клиент на одном листе. Иначе придётся вводить переменную и самим считать номер страницы).

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

При необходимости и по желанию можно запрограммировать некоторую оболочку (Visual Basic, Delphi, Visual C++... , не принципиально) по автоматическому запуску одного, а затем другого отчёта. Причём, сложностей тут никаких, потеря только времени на программирование...

2-й подход

Второй подход заключается в возможности Crystal Reports выводить поля, повёрнутые на 90 или 270 градусов. Т.е., в одном отчёте формируются как листы "портретного" отображения, так и "ландшафтного". Естественно, это имеет смысл только для печати: вряд ли пользователь захочет читать на экране монитора "повёрнутый" текст) (см. всё сказанное во вступлении).
Итак, для того, чтобы реализовать предыдущий пример для этого подхода, сделаем следующее:

  1. Создадим отчёт с двойной секцией Details: Details a - для "портретной", Details b - для "ландшафтной". В каждой секции для признака Suppress вводим ту же формулу (см. п.3 первого подхода). Эту же формулу следует ввести и для признаков Suppress секций Group Header и Group Footer, а если нужно, и для Page Header и Page Footer.
  2. В Details a всё размещаем как обычно, а в Details b для каждого поля в Format Editor установить признак Text Rotation: 90 degrees, и соответствующим образом растянуть/сжать поле (рис.2).
  3. Кроме того, в секции Details b размещаем поля из тех секций, которые оказались скрыты (Group и Page Header и Footer), так же развернув их.

Рис. 2. Дизайн отчёта с секциями Details различного формата

Это достаточно легко реализуется, т.к. у нас нет группировок, и на одном листе выводится только одна запись из БД. Если же нам надо выводить таблицу (а зачем ещё отчёты?), то задача значительно усложняется. Надо будет "вручную" формировать текстовые поля, соответствующие одной записи таблицы, посчитать, сколько таких "повёрнутых" полей поместится на листе, разместить их и т.п. Конечно, это потребует более значительных усилий по сравнению с первым подходом.

3-й подход

Суть этого подхода такова. Мы формируем "нормальный" отчёт с форматом принтера, при котором у нас разместятся листы любой ориентации. Например, А3 "ландшафтная". В отчёте только нужно будет создать по две секции для Page Header, Page Footer, Group Header, Group Footer, Details для разных ориентаций (рис.3). И, наверное, будет проще, если в начале (и/или в конце) страниц с "ландшафтной" ориентацией добавите какие-то символьные метки.

Рис. 3. Дизайн отчёта с двумя различными секциями Group Header

А затем Вы экспортируете созданный отчёт в какой-нибудь формат, например, в MS Word. Создав там небольшой макрос, по внесённым меткам переформатируете Ваш отчёт, внеся разделы и установив для каждого свою ориентацию.
Процесс этот несложно автоматизировать, запуская MS Word и макрос в фоновом режиме.
Вряд ли можно считать представленные выше способы единственными и наилучшими. Выбирайте для себя наиболее приемлемый и простой вариант.


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