FastReport.NetРуководство
пользователя

© 2008-2016 ООО "Фаст Репортс"Содержание
Глава IОсновы

12ОтчетДизайнер отчетов
Настройки отчета
Страницы отчета
Управление страницами
Свойства страницы
БэндыОтображение бэндов в дизайнере
Настройка бэндов
Порядок печати бэндов
Свойства бэндов
Объекты отчетаОбщ ие свойства объектов
Объект "Текст"Редактирование текста
Отображение выражений
Отображение полей данных
HTML тэги
Свойства объекта "Текст"Объект "Форматированный текст"Объект "Рисунок"Объект "Линия"Объект "Фигура"Объект "Штрих-код"Объект "Флажок"Объект "Таблица"Объект "Матрица"Объект "Диаграмма"Объект "Почтовый индекс"Объект "Текст в ячейках"Первый отчет в FastReportПример 1. Создание отчета вручную
Пример 2. Создание отчета с помощ ью мастера

12
12
14
16
17
18
21
22
23
25
26
27
27
29
30
30
31
32
33
35
37
40
41
41
44
45
46
47
48
49
50
50
52

Глава IIПостроение отчетов

58Выбор данных для отчета
Автоматический подбор высоты объектов
Свойства "Может расти", "Может сжиматься" (CanGrow, CanShrink)Свойство "Сдвиг" (ShiftMode)Свойство "Расти вниз" (GrowToBottom)
Свойство "Якорь" (Anchor)Свойство "Стыковка" (Dock)Форматирование

59
60
60
61
61
62
63
64

Содержание

3Рамка и заливка
Формат текста
СтилиФормат данных
Условное выделение
Скрытие нулевых значений
Скрытие повторяющ ихся значений
Выделение строк данных через однуОтчет с одним бэндом "Данные"Подключение бэнда к данным
Печать текстовых данных
Сортировка данных
Фильтрация данных
Заголовок и подвал данных
Разрыв и удерживание данных
Печать пустых строк данных
Печать текста "Нет данных"Печать иерархии
Отчет "Главный-подчиненный" (Master-detail)Отчет типа master-masterОтчет типа master-detail-detailМногоколоночный отчет
Колонки страницы
Колонки бэнда "Данные"Многостраничный отчет типа "Буклет"Добавление страницы в отчет
Настройка страниц
Печать на четных и нечетных страницах
Группировка, итоги
Создание группы
Сортировка данных
Вложенные группы
Управление группами
Печать итоговых значений
Повторение заголовков и подвалов
Свойства группы
Вложенные отчеты
Режимы печати
Печать нескольких отчетов рядом (side-by-side)Несколько уровней вложенности
Табличные отчеты
Настройка колонок
Управление размером колонок
Настройка строк
Управление размером строк
Настройка ячеек
Объединение ячеек
Объекты в ячейках
Печать таблицы
Печать сложных заголовков

4

64
65
65
66
68
70
71
72
73
73
73
74
75
76
77
80
81
82
85
88
90
91
91
92
94
94
94
95
97
99
101
102
104
104
106
108
109
109
110
110
111
111
112
112
113
113
114
114
115
117

Содержание

Печать итогов
Развертка таблицы
Примеры использования
Пример 1. Печать всей таблицы сверху внизПример 2. Печать таблицы сверху вниз, с повторением строк
Пример 3. Печать всей таблицы слева направо
Пример 4. Печать таблицы слева направо, с повторением колонок
Пример 5. Печать таблицы с повторением строк и колонок
Пример 6. Привязка к источникам данных
Пример 7. Вставка разрыва страницы
Пример 8. Печать итогов
Матричные (сводные) отчеты
Немного теории
Настройка структуры
Настройка заголовка
Настройка ячеек
Настройка внешнего видаУправление размерами строк и колонок
Примеры использования
Пример 1. Простая матрица
Пример 2. Многоуровневые заголовки
Пример 3. Печать названия месяца вместо номера
Пример 4. Условное выделение
Пример 5. Выделение четных строк
Пример 6. Использование выражений
Пример 7. Рисунки в ячейках
Пример 8. Объекты в ячейках
Пример 9. Заполнение матрицы вручную
Интерактивные отчеты
Гиперссылки
Настройка гиперссылки
Ссылка на адрес URL
Ссылка на номер страницы
Ссылка на закладку
Ссылка на детальный отчет
Ссылка на детальную страницу
Прочая ссылка
Структура отчета
Примеры использования
Пример 1. Ссылка на веб-страницу
Пример 2. Построение детального отчета
Пример 3. Интерактивный объект "Матрица"Пример 4. Отчет с оглавлением, навигацией и структурой
Наследование отчетов
Создание отчета
Изменение базового отчета
Ограничения
Отчеты с диаграммами
Элементы диаграммы
Редактор диаграммы

Содержание

119
119
120
120
120
121
122
122
123
124
125
126
126
127
129
129
130
131
132
133
134
135
136
138
139
140
142
144
147
147
147
148
149
149
149
150
151
152
154
154
155
160
164
166
167
168
168
170
170
171

5

Управление сериями
Настройка внешнего видаПодключение к данным
Сортировка данных
Группировка данных
Объединение значений
Выделение значений
Настройка авто-серий
Интерактивные диаграммы
Отчеты с картами
Элементы карты
Управление отображением
Редактор карты
Добавление слоёв
Настройка внешнего видаНастройка отображаемых значений
Подключение к данным
Выделение данных цветом
Выделение данных размером

Глава III

172
173
175
176
177
178
179
180
181
184
184
184
185
186
187
188
189
191
193

Работа с данными

196

Окно "Данные"Источники данных
Создание источника данных
Создание запроса на языке SQLПараметры запроса
Передача значения в параметр запроса
Редактирование подключения
Редактирование источника данных
Добавление источника данных в сущ ествующ ее подключение
Псевдонимы (aliases)Иерархические источники данных
Связи (relations)Создание связи
Редактирование связи
Системные переменные
Функции
Математические
Abs
Acos
Asin
Atan
Ceiling
Cos
Exp
Floor
Log
Maximum
Minimum
Round

196
197
198
201
204
205
206
206
207
207
208
208
212
212
213
213
214
214
215
215
215
216
216
216
216
217
217
217
218

6

Содержание

Sin
Sqrt
Tan
TruncateТекстовыеAsc
Chr
InsertLengthLowerCase
PadLeft
PadRight
RemoveReplace
Substring
TitleCase
Trim
UpperCaseДата и время
AddDays
AddHours
AddMinutes
AddMonths
AddSeconds
AddYears
DateDiff
DateSerial
Day
DayOfWeek
DayOfYear
DaysInMonth
Hour
MinuteMonthMonthName
SecondYearФорматирование
FormatFormatCurrency
FormatDateTime
FormatNumber
FormatPercentКонвертирование
ToBoolean
ToByteToChar
ToDateTime
ToDecimal
ToDoubleСодержание

218
218
219
219
219
219
220
220
220
220
221
221
222
222
222
223
223
223
224
224
224
224
224
225
225
225
225
226
226
226
226
227
227
227
227
228
228
228
228
232
232
233
233
234
234
234
234
234
235
235

7

ToInt32
ToRoman
ToSingle
ToString
ToWords
ToWordsEnGb
ToWordsRuУсловия
ChooseIIf
SwitchИтоговые значения
Создание итога
Вычисление итога по условию
Печать нарастающ его итога
Итоги по странице
Печать итога в заголовке
Параметры отчета
Создание параметра
Использование параметров в отчете

Глава IVВыражения

Редактор выражений
Обращ ение к объектам отчета
Использование функций .NetОбращ ение к данным отчета
Обращ ение к источникам данных
Обращ ение к системным переменным
Обращ ение к итоговым значениям
Обращ ение к параметрам отчета

Глава V

235
235
236
236
236
237
238
239
239
239
239
240
240
243
244
244
244
245
246
246

250
251
251
252
253
253
254
255
255

Скрипт

258

Общ ая информация
Обработчики событий
События
Обращ ение к объектам .NetОбращ ение к объектам отчета
Объекты Report и EngineОбращ ение к источникам данных
Обращ ение к системным переменным
Обращ ение к итоговым значениям
Обращ ение к параметрам отчета
Примеры использования
Пример 1. Изменение внешнего вида объекта
Пример 2. Выделение четных строк бэнда
Пример 3. Фильтрация данных
Пример 4. Вычисление итогов
Пример 5. Смещ ение позиции печати

260
261
261
262
263
264
267
268
268
269
270
270
271
271
272
273

Глава VI
8Диалоговые формы

276
Содержание

Элементы управления
Обращ ение к элементу из кодаФильтрация данных
Автоматическая фильтрация - как это работает
Операция фильтра
Добавление фильтра в отчет
Фильтрация по диапазону значений
Фильтрация по связанному полюФильтрация с каскадными списками
Управление фильтрацией из кодаПримеры использования
Пример 1. Диалог "Hello, FastReport!"Пример 2. Запрос строки у пользователя
Пример 3. Управление элементами диалога
Пример 4. Управление объектами отчета
Пример 5. Простой фильтр
Пример 6. Автоматическая фильтрация
Пример 7. Автоматическая фильтрация по диапазону
Пример 8. Фильтрация по полю связанного источника данных

Глава VII Просмотр, печать, экспорт
Редактирование отчета
Печать отчета
Экспорт отчета
Сохранение в формате FPX
Экспорт в Adobe Acrobat (PDF)Экспорт в Word (RTF)Экспорт в HTMLЭкспорт в MHT (веб-архив)Экспорт в Excel (XML)Экспорт в Excel 2007Экспорт в PowerPoint 2007Экспорт в OpenOffice Calc
Экспорт в CSVЭкспорт в TXT
Экспорт в файлы рисунков
Экспорт на FTPЭкспорт в DropboxЭкспорт в Google DriveЭкспорт в SkyDriveРекомендации по разработке отчетов
Отправка отчета по emailСодержание

276
277
278
279
280
281
281
282
282
283
283
283
284
285
286
287
288
289
290

294
295
296
298
298
299
301
301
302
303
304
305
306
307
308
309
310
312
313
315
316
318

9

Глава

IОсновы

ОсновыВ этой главе будут рассмотрены принципы работы с отчетом в FastReport, а также
подробно описаны основные элементы любого отчета:страницы отчета;бэнды;
объекты отчета.

ОтчетПроцесс работы с отчетом можно представить в следующем виде:Шаблон отчета (далее – отчет) – это то, что мы видим в дизайнере. Отчеты хранятся вфайлах с расширением .FRX. Отчет можно создать с помощью дизайнера или программным
способом.
Данные могут быть любыми: это данные, определенные в программе, либо данные из СУБД,например, MS SQL. FastReport также может работать с объектами бизнес-логики (далее –бизнес-объекты).
Готовый отчет – это то, что мы видим в окне предварительного просмотра. Готовый отчет
можно просмотреть, распечатать, сохранить в одном из поддерживаемых форматов (.doc, .
xls, .pdf и прочих) или отправить по электронной почте.

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

12Основы

Дизайнер отчетов является составной частью FastReport и не зависит от среды
разработки (например, MS Visual Studio). Если вы являетесь разработчиком приложений,вы можете использовать дизайнер в своих приложениях. Это даст возможность вашим
пользователям самостоятельно изменять существующие или создавать новые отчеты.

Основы

13Настройки отчета
Окно с настройками отчета можно вызвать в меню "Отчет|Настройки...". Вы увидите
диалоговое окно с несколькими закладками:На закладке "Основные" вы можете управлять следующими параметрами отчета:параметр "Двойной проход" позволяет включить два прохода у отчета. Это может бытьнеобходимо в случае, если вы печатаете в отчете информацию об общем количестве
страниц;параметр "Сжать файл отчета" позволяет сохранить отчет в сжатом виде. Для сжатия
используется алгоритм zip, поэтому вы легко сможете извлечь оригинальное содержимоес помощью любого архиватора;параметр "Использовать файловый кэш" позволяет сэкономить память при построении
отчета. Используйте этот параметр, если ваш отчет содержит большое количество
страниц;параметр "Преобразовывать null значения" управляет преобразованием null значений
полей данных в значения по умолчанию (0, пустая строка, false в зависимости от типаданных поля);параметр "Качество текста" позволяет выбрать режим отображения текста в отчете.
Этот режим не влияет на печать отчета;параметр "Плавная отрисовка графики" включает режим сглаживания при отрисовке
графических объектов (линий, рамок, рисунков).
На закладке "Описание" вы можете задать описание отчета. Все эти параметры являются
необязательными и служат для информационных целей:14ОсновыНа закладке "Скрипт" можно выбрать язык скрипта для текущего отчета. Подробнее
работа со скриптом рассматривается в главе "Скрипт".
На закладке "Безопасность" вы можете задать пароль, который будет запрошен приоткрытии отчета. Отчет с паролем хранится в зашифрованном виде, поэтому не забывайте
введенный пароль! Восстановить отчет в этом случае будет практически невозможно.
На закладке "Наследование" можно управлять наследованием отчета. Этафункциональность будет рассмотрена позже.

Основы

15Страницы отчета
Отчет состоит из одной (чаще всего) или нескольких страниц. Страница отчета, в своюочередь, содержит бэнды (англ. band – полоска). На бэндах располагаются объекты
отчета, такие как "Текст", "Рисунок" и прочие.

Особенность FastReport – шаблон отчета может состоять из нескольких страниц.
Например, вы можете создать шаблон, содержащий титульную страницу и страницу сданными. При построении такого отчета сначала будет напечатана первая страница,затем вторая и т.д. Каждая страница шаблона может генерировать одну или несколько
страниц готового отчета – это зависит от содержащихся на ней данных:Страницы отчета также используются при работе с вложенными отчетами (subreport). Вотличие от других генераторов отчетов, вложенные отчеты в FastReport хранятся наотдельной странице шаблона, а не в отдельном файле.
Кроме страниц отчета, шаблон может содержать одну или несколько диалоговых форм.
Диалоговые формы могут быть использованы для запроса параметров перед построением
отчета. Подробнее работа с диалогами будет рассмотрена в главе "Диалоговые формы".

16Основы

Управление страницами
Когда вы создали новый отчет, он уже содержит одну страницу с несколькими бэндами.
Для добавления новой страницы нажмите кнопкуна панели инструментов. Страницу
можно также добавить, нажав кнопку "Новый..." и выбрав в окне пункт "Новая страница
отчета":Аналогичным образом в отчет добавляется диалоговая форма. Для этого используйте
кнопку

.

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

Основы

. Эта кнопка неактивна, если отчет состоит

17Свойства страницы
Каждая страница отчета может иметь свои настройки, такие как размер бумаги,ориентация (альбомная или портретная), отступы, колонки, источник бумаги и прочие.
Шаблон отчета может содержать несколько страниц с разной ориентацией и размерами
бумаги. Окно с настройками страницы можно вызвать кнопкойили выбрав в менюпункт "Файл|Параметры страницы...". Окно содержит несколько групп настроек, которые
можно выбирать в списке слева:Группа "Бумага" позволяет задать размер и ориентацию листа бумаги. Можно выбрать одноиз значений размера, используя выпадающий список. Он содержит все размеры бумаги,которые поддерживаются текущим принтером.
Текущий принтер можно настроить, вызвав меню "Файл|Параметры принтера...".
Группа "Поля" позволяет задать поля страницы. Здесь же можно указать, что левое иправое поле должны меняться местами для четных страниц готового отчета:18Основы

Группа "Источник бумаги" позволяет выбрать источник бумаги. Заметьте, что источник
можно задать отдельно для первой страницы готового отчета и для остальных страниц:Источник бумаги можно выбрать непосредственно перед печатью, в окне "Печать".
Группа "Колонки" позволяет задать параметры колонок для многоколоночного отчета. Дляэтого надо указать число колонок и (необязательно) поправить ширину колонки ипозицию каждой из колонок:Группа "Прочее" позволяет задать некоторые вспомогательные свойства страницы. Можно
указать режим дуплекса для двусторонней печати, если ваш принтер поддерживает такой
режим. Также здесь можно настроить водяной знак, который будет печататься настраницах готового отчета:Основы

19Флажок "Широкая страница в дизайнере" позволяет увеличить ширину страницы в режиме
дизайнера. Это может пригодиться, если вы работаете с объектами, которые могут расти вширину и разбиваться на страницы. Это объекты "Таблица" и "Матрица".
Режим двусторонней печати можно выбрать непосредственно перед печатью, в окне"Печать".

20Основы

Бэнды
Бэнд (англ. band – полоска) – это объект, который размещается непосредственно настранице отчета и является контейнером для остальных объектов, таких, как "Текст","Рисунок" и прочих.
Всего в FastReport есть 13 типов бэндов. В зависимости от своего типа, бэнд печатается вопределенном месте отчета:БэндКак печатается

Заголовок отчета

Печатается один раз в самом начале отчета. Вы можете
выбрать порядок печати – перед бэндом "Заголовок страницы"или после него – с помощью свойства страницы
"TitleBeforeHeader". Изменить это свойство можно с помощью
служебного окна "Свойства". По умолчанию свойство равно
true, т.е. заголовок отчета печатается перед заголовком
страницы.

Подвал отчета

Печатается один раз в конце отчета, после последней строки
данных, но перед бэндом "Подвал страницы".

Заголовок страницы

Печатается вверху на каждой странице отчета.

Подвал страницы

Печатается внизу на каждой странице отчета.

Заголовок колонки

Этот бэнд используется при печати многоколоночного отчета
(когда в настройках страницы указано количество колонок >1). Он печатается вверху каждой колонки, после заголовка
страницы.

Подвал колонки

Печатается внизу каждой колонки, перед подвалом страницы.

Данные

Этот бэнд подключается к источнику данных и печатается
столько раз, сколько строк в источнике.

Заголовок данных

Этот бэнд подключается к бэнду "Данные" и печатается перед
первой строкой данных.

Подвал данных

Этот бэнд подключается к бэнду "Данные" и печатается после
последней строки данных.

Заголовок группы

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

Подвал группы

Печатается в конце каждой группы.

Дочерний

Этот бэнд может быть подключен к любому бэнду, в том числе
другому дочернему бэнду. Он печатается сразу после своего
родителя.

Фоновый

Печатается в виде фона на каждой странице отчета.

Основы

21Отображение бэндов в дизайнере
Бэнд в дизайнере отображается в виде прямоугольной области:Бэнд, как и многие другие объекты отчета, может иметь рамку и заливку (по умолчаниюони отключены). Кроме этого, бэнд отображает сетку. Для настройки вида сетки зайдитев меню "Вид|Настройки..." и выберите "Страница отчета". В группе "Сетка" можно задать
видимость и тип сетки, а также расстояние между ее узлами. Сетку можно также
включить или выключить в меню "Вид".
Если подвести курсор мыши к нижней границе бэнда, то курсор меняет вид – теперь
можно менять высоту бэнда. Бэнд предварительно выбирать не обязательно. Также менять
высоту бэнда можно, таская мышью перекладину бэнда на левой линейке.
Дизайнер имеет два режима отображения бэндов, между которыми можно переключитьсяв любой момент. В первом режиме каждый бэнд имеет заголовок, содержащий название
бэнда и полезную информацию о нем (например, имя источника данных, к которому онподключен).

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

22ОсновыУ этого режима есть один недостаток – ширины экрана может не хватить для отображения
бэнда целиком. В этом случае можно свернуть служебные окна, либо переключиться напервый режим. Это можно сделать, нажав кнопкуна пересечении линеек или в меню"Вид|Настройки..." выбрать "Страница отчета" и в группе "Вид бэндов" выбрать нужный
вид.

Настройка бэндов
Добавление и удаление бэндов выполняется в окне "Настройка бэндов". Его можно
вызвать из меню "Отчет|Настроить бэнды...", либо с помощью кнопки "Настроить бэнды...",
расположенной над деревом бэндов:Основы

23В этом окне можно добавить в отчет бэнды, удалить их или изменить их порядок. Длядобавления бэнда нажмите кнопку "Добавить" или щелкните правой кнопкой мыши надереве бэндов. Появится контекстное меню, содержащее список бэндов. Бэнды, которыене могут быть добавлены, отображаются серым цветом:Операция добавления зависит от того, какой бэнд выбран в дереве бэндов. Например,добавить бэнды "Заголовок данных" и "Подвал данных" можно лишь в том случае, есливыбран бэнд "Данные".
Существует и другой способ настроить бэнды. Это можно сделать из меню "Отчет":Как видно, можно включить или выключить бэнды – заголовки и подвалы отчета,страницы, колонки.
Наконец, удалить бэнд можно, если выделить его в окне дизайнера и нажать клавишу
Delete.

24Основы

При настройке бэндов FastReport не позволит выполнить действия, которые приведут ксозданию неправильного шаблона отчета. Например, вы не можете удалить бэнд "Данные",который присоединен к группе (бэнд "Заголовок группы") – для этого сначала надоудалить группу. Другой пример – при удалении бэнда "Данные" автоматически удаляютсяего заголовок и подвал. Также нельзя удалить бэнд, если он единственный на странице.

Порядок печати бэндов
Итак, на странице расположено несколько бэндов. Как FastReport будет формировать
готовый отчет? Рассмотрим следующий пример.

Сначала будет напечатан заголовок отчета. Сразу за ним – заголовок страницы. Далее
будет печататься бэнд "Данные". Он будет напечатан столько раз, сколько строк висточнике данных, к которому подключен бэнд. После того, как все строки бэнда
"Данные" напечатаны, печатается бэнд "Подвал отчета" и внизу страницы – бэнд "Подвал
страницы". На этом печать отчета заканчивается. Готовый отчет будет выглядеть
примерно так:В процессе печати FastReport проверяет, достаточно ли места на текущей странице
готового отчета, чтобы напечатать бэнд. Если места нет, происходит следующее:Основы

25

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

Свойства бэндов
Каждый бэнд имеет несколько полезных свойств, влияющих на процесс печати. Настроитьих можно, используя контекстное меню бэнда. Для этого щелкните правой кнопкой мышина пустом месте бэнда, не занятом другими объектами. Также можно щелкнуть назаголовке бэнда (если включен классический режим отображения) или на структуре
бэндов (в противном случае). Другой способ – выбрать бэнд и поменять соответствующее
свойство в окне "Свойства".
Свойство

Описание

"Может расти", "Может
сжиматься"(CanGrow, CanShrink)Свойства определяют, может ли бэнд расти илисжиматься в зависимости от размера объектов,которые на нем расположены. Подробнее обиспользовании этого свойства можно почитать в главе
"Построение отчетов".

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

"Формировать новую
страницу"(StartNewPage)Печать бэнда с таким свойством начинается с новой
страницы. Обычно это свойство используется припечати групп; при этом каждая группа печатается нановой странице.

"Печатать внизу страницы"(PrintOnBottom)

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

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

26Основы

Объекты отчетаВ отчете можно использовать широкий набор объектов:Иконка

Название

Описание

"Текст"(TextObject)Показывает одну или несколько строк
текста.

"Рисунок"(PictureObject)Показывает рисунок.

"Линия"(LineObject)Показывает линию. Линия может бытьвертикальной, горизонтальной илидиагональной.

"Фигура"(ShapeObject)Показывает одну из геометрических фигур
– прямоугольник, эллипс, треугольник идр.

"Форматированный текст"(RichObject)Показывает форматированный текст (вформате RTF).

"Штрих-код"(BarcodeObject)Показывает штрих-код.

"Флажок"(CheckBoxObject)Показывает флажок, который может иметьдва состояния – "включен" или "выключен".

"Таблица"(TableObject)Показывает таблицу, состоящую из строк,колонок и ячеек.

"Матрица"(MatrixObject)Показывает матрицу (также известную подназваниями "сводная таблица", "кросстаб").

"Диаграмма"(MSChartObject)Показывает диаграмму.

"Почтовый индекс"(ZipCodeObject)Показывает почтовый индекс.

"Текст в ячейках"(CellularTextObject)Показывает текст, каждый символ которого
печатается в отдельной ячейке.

Объекты можно использовать как для отображения информации (объект "Текст"), так идля оформления отчета (объекты "Рисунок", "Линия", "Фигура"). Сложные объекты типа"Таблица" и "Матрица" могут содержать в себе другие простые объекты.

Общие свойства объектовВсе объекты отчета наследуются от одного базового класса (ReportComponentBase) иимеют некоторый общий набор свойств. Прежде чем изучать каждый объект, рассмотримэти свойства.
Вы можете менять значение свойств с помощью окна "Свойства". Там, где это возможно
(например, при работе с рамкой и заливкой), лучше использовать панели инструментовили контекстное меню объекта.

Основы

27

Свойство

Описание

Координаты и размеры
(Left, Top, Width, Height)Объект отчета в FastReport представляет собой
прямоугольник. У него есть координаты (свойства Left,
Top) и размеры (свойства Width, Height).

"Якорь"(Anchor)Это свойство определяет, как будет изменяться позиция
объекта и/или его размеры при изменении размеров
контейнера, на котором он лежит. Используя якорь, можно
сделать так, чтобы объект расширялся или сдвигался
синхронно с контейнером. Подробнее об использовании
этого свойства можно прочитать в разделе
"Автоматический подбор высоты объектов".

"Стыковка"(Dock)

Это свойство определяет, к какой стороне контейнера
будет пристыкован объект. Подробнее об использовании
этого свойства можно прочитать в разделе
"Автоматический подбор высоты объектов".

Рамка и заливка
(Border, Fill)Эти свойства содержат настройки рамки и заливки
соответственно. Их можно менять, используя панели
инструментов.

"Может расти", "Может
сжиматься"(CanGrow, CanShrink)Эти свойства позволяют подбирать высоту объекта таким
образом, чтобы он вмещал весь текст. Подробнее обиспользовании этих свойств можно прочитать в разделе
"Автоматический подбор высоты объектов".

"Сдвиг"(ShiftMode)Объект, у которого свойство включено, будет сдвинут
вниз или вверх, если над ним имеется объект, который
расширяется или сжимается. Подробнее об использовании
этого свойства можно прочитать в разделе
"Автоматический подбор высоты объектов".

"Расти вниз"(GrowToBottom)

Объект с таким свойством при печати растягивается донижней границы бэнда. Подробнее об использовании этого
свойства можно прочитать в разделе "Автоматический
подбор высоты объектов".

"Может разрываться"(CanBreak)Это свойство есть у текстовых объектов – "Текст" и"Форматированный текст". Оно определяет, может лисодержимое объекта разрываться на части. Это может
произойти, если у бэнда, на котором лежит объект,включено аналогичное свойство.

"Печатать на..."(PrintOn)

Это свойство определяет, на каких страницах может бытьнапечатан объект. Подробнее об использовании этого
свойства можно прочитать в разделе "Многостраничный
отчет типа "Буклет".

"Курсор"(Cursor)Это свойство определяет вид указателя мыши, когда оннаходится над объектом. Свойство работает только в окнепредварительного просмотра.

"Видимый"(Visible)Свойство определяет, будет ли объект отображаться вотчете. Невидимый объект не отображается в окнепредварительного просмотра и не печатается на принтере.

"Печатаемый"Свойство определяет, будет ли объект печататься на28Основы(Printable)принтере. Если это свойство отключено, объект будет
виден в окне предварительного просмотра, но не попадетна распечатку.

"Гиперссылка"(Hyperlink)Это свойство позволяет сделать объект отчета
интерактивным. Подробно работа с гиперссылками будет
рассмотрена в разделе "Интерактивные отчеты".

"Закладка"(Bookmark)Это свойство используется совместно со свойством
"Гиперссылка". Оно может содержать любое выражение.
Выражение будет вычислено при работе отчета, и егозначение будет использовано в качестве имени закладки.

"Ограничения"(Restrictions)Это свойство позволяет задавать ограничения нанекоторые операции над объектом. По умолчанию
свойство пустое, т.е. над объектом можно совершать всеоперации.

"Стиль"(Style)Данному свойству можно присвоить имя стиля. При этомобъект станет выглядеть так, как указано в стиле. Еслипараметры стиля поменяются, внешний вид объекта также
изменится.

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

Основы

29

Редактирование текстаДля редактирования текста объекта сделайте на нем двойной щелчок мыши. Вы увидите
редактор текста:В правой части редактора находится окно данных, которые можно добавлять в текст. Этоможно сделать, перетащив (drag&drop) элемент мышкой в нужное место текста. Другой
способ вставки элемента в текст – сделайте двойной щелчок на элементе, и он будет
добавлен в текущую позицию курсора.
Чтобы сохранить изменения и закрыть окно редактора, нажмите кнопку ОК, либокомбинацию клавиш Ctrl+Enter.
Другой способ редактирования текста – редактирование на месте (прямо на странице
отчета). Для этого выделите объект "Текст" и нажмите клавишу Enter. Для окончания
редактирования щелкните мышкой за пределами объекта либо нажмите комбинацию
клавиш Ctrl+Enter. Клавиша Esc отменяет изменения.
Во время редактирования объекта на месте можно изменять его размеры мышкой.

Отображение выражений
Объект "Текст" может содержать как обычный текст, так и выражения. Причем выражения
могут содержаться в объекте вперемешку с текстом. Например:Се годня [Da t e ]При печати такого объекта все выражения, содержащиеся в тексте, будут вычислены. Втекст будет подставлено значение выражения, например:Се годня 12 с е нт я бря 2010г.
Как видно, выражения обозначаются с помощью квадратных скобок. Это настраивается всвойстве Brackets, которое по умолчанию содержит строку "[,]". При необходимости выможете указать другую пару символов, например "<,>" или "<!,!>". В последнем случае
выражения в тексте будут выглядеть так:30ОсновыСе годня <!Da t e !>Кроме того, можно запретить обработку выражений – за это отвечает свойство
AllowExpressions. В этом случае текст будет отображаться "как есть".
В квадратных скобках может содержаться любое выражение, корректное с точки зрения
компилятора. Подробнее о выражениях читайте в главе "Выражения".
Например, объект со следующим текстом:2 * 2 = [2 * 2]будет напечатан так:2 * 2 =4Частая ошибка – попытка написать выражение за пределами квадратных скобок.
Напоминаем, что считается выражением и вычисляется только то, что находится вквадратных скобках. Остальной текст печатается "как есть". Например:2 * 2 = [2] * [2]Такой текст будет напечатан следующим образом:2 * 2 =2 * 2
В выражениях могут встречаться элементы, заключенные в собственные квадратные
скобки (см. главу "Выражения|Обращение к данным отчета"). Например, это обращения ксистемным переменным. Рассмотрим следующий пример содержимого объекта "Текст":Сле ду ю щ а я с т ра ниц а : [[Pa ge ] + 1]Текст содержит выражение [Pa ge ] + 1: это содержимое внешней пары скобок. Page – этосистемная переменная, которая возвращает номер текущей страницы отчета. Оназаключена в собственные скобки. Это обязательно должны быть квадратные скобки,независимо от настройки объекта "Текст" (свойство Brackets, которое мы рассматривали
ранее).
Строго говоря, мы должны были использовать две пары квадратных скобок при попытке
распечатать системную переменную Date в ранее рассмотренных примерах:Се годня [[Da t e ]]Здесь внешняя пара скобок обозначает выражение, внутренняя необходима, так как мыобращаемся к системной переменной. Однако FastReport позволяет опускать лишнюю
пару скобок, если в выражении есть только один член.

Отображение полей данныхДля обращения к полям источников данных используется следующая форма записи:[Им я ис т оч ника .Им я поля ]Как видно, здесь так же используются квадратные скобки. Имя источника отделяется отимени поля точкой, например:Основы

31

[Em ploy e e s.F irst Na m e ]Подробнее об использовании полей в выражениях см. главу "Выражения|Поля источников
данных".
Для вставки поля в объект "Текст" можно использовать несколько способов.
Способ 1: в редакторе объекта "Текст" пишем название поля вручную. Этот способ самый
неудобный, так как можно легко допустить ошибку.
Способ 2: в редакторе объекта выбираем нужное поле и перетаскиваем его в текст
(также можно сделать двойной щелчок на поле):Способ 3: щелкаем мышкой на маленькой стрелочке в верхнем правом углу объекта и воткрывшемся списке выбираем нужное поле:Способ 4: перетаскиваем нужное поле из окна "Данные" на страницу отчета с помощью
мыши (drag&drop). В данном случае создается объект "Текст", который содержит ссылкуна выбранное поле.

HTML тэгиВ объекте "Текст" можно использовать некоторые простейшие тэги HTML. По умолчанию
тэги отключены; чтобы их включить, в окне "Свойства" установите свойство "HtmlTags" вtrue. Вот список поддерживаемых тэгов:32Основы

ТэгОписание

<b>...</b>Жирный текст.

<i>...</i>Наклонный текст.

<u>...</u>Подчеркнутый текст.

<strike>...</strike>Зачеркнутый текст.

<sub>...</sub>Подстрочный текст.

<sup>...</sup>Надстрочный текст.

<font color=...>...</font>Цвет шрифта. В качестве цвета можно использовать
именованный цвет (например, DarkGray), либошестнадцатиричное значение цвета в формате #RGB,
например #F F 8030.

Продемонстрируем применение тэгов на примерах.

т е кс т <b>ж ирный т е кс т </b> <i>на клонный т е кс т </i> <b><i>ж ирный и на клонный</b></i>
E = m c <sup>2</sup>A<sub>1</sub> = B<sup>2</sup>э т о обыч ный т е кс т , <font c olor=re d>а э т о кра с ный</font >э т о обыч ный т е кс т , <font c olor=#F F 8030>а э т о ора нж е в ый</font >Этот текст будет отображен следующим образом:Свойства объекта "Текст"Свойство

Описание

"Выражения в тексте"(AllowExpressions)Это свойство позволяет отключать обработку выражений втексте объекта. По умолчанию оно включено.

"Поворот"(Angle)В этом свойстве можно указать угол поворота текста вградусах.

"Автосжатие шрифта"(AutoShrink)Это свойство позволяет автоматически уменьшить размер
шрифта (Font.Size) или его ширину (FontWidthRatio) так,чтобы вместить весь текст.

"Минимальный размер
шрифта"(AutoShrinkMinSize)Это свойство определяет минимальный размер шрифта илиминимальное значение свойства FontWidthRatio, взависимости от значения свойства AutoShrink.

"Автоширина"(AutoWidth)Это свойство позволяет автоматически подобрать ширину
объекта так, чтобы поместить самую длинную строку
текста целиком, без переноса слов.

Основы

33

"Скобки"(Brackets)Это свойство определяет пару символов, которые
используются для обозначения выражений в тексте
объекта.

"Разрываться в..."(BreakTo)

С помощью этого свойства можно организовать
"перетекание" текста между двумя объектами "Текст".
Допустим, у нас есть объекты А и В. Объект А содержит
большой объем текста, часть которого не помещается вобъекте. Если в свойстве BreakTo этого объекта указать
объект В, в нем будет напечатан текст, не поместившийсяв объекте А.

"Обрезать"(Clip)

Это свойство определяет, надо ли обрезать текст, непоместившийся в объекте. По умолчанию свойство
включено.

"Повторяющиеся значения"(Duplicates)Это свойство определяет, как будут печататься
повторяющиеся значения. Подробнее об использовании
этого свойства можно почитать в разделе
"Форматирование".

"Первая табуляция"(FirstTabOffset)Это свойство определяет, на сколько пикселов сдвинуть
первый символ табуляции.

"Ширина шрифта"(FontWidthRatio)В этом свойстве можно указать коэффициент
масштабирования шрифта по ширине. По умолчанию
свойство равно 1. Чтобы увеличить ширину шрифта,укажите значение > 1; чтобы уменьшить ширину, укажите
значение между 0 и 1.

"Скрывать значение"(HideValue)Это строковое свойство позволяет скрывать значения
выражений, которые равны заданному значению.
Подробнее об использовании этого свойства можно
почитать в разделе "Форматирование".

"Скрывать нули"(HideZeros)Это свойство позволяет скрывать нулевые значения
выражений. Подробнее об использовании этого свойства
можно почитать в разделе "Форматирование".

"Условное выделение"(Highlight)Свойство позволяет настроить условное выделение.
Подробнее об использовании этого свойства можно
почитать в разделе "Форматирование".

"Html тэги"(HtmlTags)Это свойство позволяет использовать простые html тэги втексте объекта. Подробнее об этом смотрите в разделе "Html тэги".

Выравнивание текста
(HorzAlign, VertAlign)Эти свойства задают выравнивание текста внутри объектапо горизонтали и вертикали.

"Межстрочный интервал"(LineHeight)Свойство позволяет задать межстрочный интервал, впикселах. Значение по умолчанию = 0, при этомиспользуется стандартный межстрочный интервал.

"Нулевое значение"(NullValue)Строка, которая будет выводиться вместо null значения.
Вам также надо отключить флажок "Преобразовывать nullзначения" в меню "Отчет/Настройки...".

"Отступы"(Padding)Свойство позволяет задать отступы текста от краев
объекта, в пикселах.

34Основы

"Справа налево"(RightToLeft)Это свойство позволяет выводить текст справа налево.

"Ширина табуляции"(TabWidth)Это свойство позволяет указать ширину символа
табуляции, в пикселах.

"Текст"(Text)

Это свойство содержит текст объекта.

"Цвет текста"(TextFill)Это свойство определяет цвет текста. С помощью
редактора этого свойства вы можете выбрать любую издоступных заливок.

"Отсечение"(Trimming)Это свойство определяет, как показывать текст, который
выходит за границы объекта. Это свойство используется
только в том случае, если свойство "Перенос слов"отключено.

"Подчеркивание"(Underlines)Свойство позволяет включить линии подчеркивания подкаждой строкой текста. Подчеркивание можно
использовать только для текста, выровненного поверхнему краю.

"Перенос слов"(WordWrap)Это свойство определяет, надо ли переносить текст пословам.

WysiwygЭто свойство меняет режим отображения текста таким
образом, чтобы добиться максимального соответствия
между отображением текста на экране и на распечатке.
Этот режим неявно включается, если вы используете
выравнивание текста по ширине или нестандартный
межстрочный интервал.

Объект "Форматированный текст"Этот объект позволяет отображать форматированный текст в формате RTF. Он выглядит
следующим образом:По возможности старайтесь обходиться объектом "Текст" для отображения текста. Приэкспорте отчета в другие форматы объект "Форматированный текст" экспортируется ввиде картинки.

Объект поддерживает только сплошной тип заливки. Градиентные и прочие заливки неподдерживаются.

Основы

35

Для редактирования текста сделайте двойной щелчок на объекте:Вы также можете использовать пакет Microsoft Word для создания текста. После того каквы создали текст, сохраните его в формате RTF. Затем вызовите редактор объекта инажмите кнопку

, чтобы загрузить текст из файла RTF.

Объект поддерживает далеко не все возможности Microsoft Word.
Подключить объект к данным из поля БД можно двумя способами:в текст объекта можно вставлять выражения. Они обрабатываются таким же образом,как и в объекте "Текст". Вставьте ссылку на поле в текст объекта;используйте свойство DataColumn, чтобы напечатать содержимое поля БД целиком.
Объект имеет следующие свойства:Свойство

Описание

"Выражения в тексте"(AllowExpressions)Это свойство позволяет отключать обработку выражений втексте объекта. По умолчанию оно включено.

"Скобки"(Brackets)Это свойство определяет пару символов, которые
используются для обозначения выражений в тексте объекта.

"Поле данных"(DataColumn)Поле данных, из которого загружать текст объекта.

"Текст"(Text)

Свойства содержит текст объекта в формате RTF.

"Отступы"(Padding)Свойство позволяет задать отступы текста от краев объекта, впикселах.

36Основы

Объект "Рисунок"С помощью объекта "Рисунок" вы можете вставить в отчет логотип вашей фирмы,фотографию сотрудника или любую другую графическую информацию. Объект может
отображать графику в форматах BMP, PNG, JPG, GIF, TIFF, ICO, EMF, WMF. Он выглядит
следующим образом:Объект может показывать данные из следующих источников:Источник

Описание

Файл с картинкой

Рисунок загружается из файла и хранится внутри отчета.
Рисунок хранится в свойстве Image.

Поле данных

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

Имя файла

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

URL

Рисунок загружается из Интернета каждый раз, когда отчет
строится. Внутри отчета рисунок не хранится. Адрес хранится всвойстве ImageLocation.

Чтобы выбрать один из источников данных для рисунка, сделайте двойной щелчок мышьюна объекте. Вы увидите редактор объекта "Рисунок":Основы

37Быстро подключить объект к полю данных можно, нажав мышкой на маленькой стрелочкев верхнем правом углу объекта и в открывшемся списке выбрав нужное поле:Также можно перетащить нужное поле из окна "Данные" на страницу отчета с помощью
мыши (drag&drop). В данном случае создается объект "Рисунок", который содержит ссылкуна выбранное поле.
В контекстном меню объекта можно настроить режим отображения рисунка:Авторазмер (AutoSize). Объект принимает размеры рисунка.
Центрировать (CenterImage). Рисунок центрируется внутри объекта.
Нормальный (Normal). Рисунок выводится в левом верхнем углу объекта безмасштабирования.
Растянуть (StretchImage). Рисунок растягивается до размеров объекта. Пропорции
рисунка не соблюдаются.
Масштабировать (Zoom). Рисунок растягивается до размеров объекта с соблюдением
пропорций.
Различия между режимами показаны на следующем рисунке:38Основы

Объект имеет следующие свойства:Свойство

Описание

"Угол поворота"(Angle)Угол, на который нужно повернуть рисунок. Возможные
значения для этого свойства - 0, 90, 180, 270.

"Режим отображения"(SizeMode)Режим отображения рисунка.

"Прозрачность"(Transparency)Степень прозрачности картинки. Свойство может иметь
значение между 0 до 1. Значение 0 (по умолчанию)означает, что картинка непрозрачна.

"Прозрачный цвет"(TransparentColor)Цвет, который будет прозрачным при отображении картинки.

"Рисунок"(Image)Собственно рисунок.

"Поле данных"(DataColumn)Поле данных, из которого загружать рисунок.

"Месторасположение
рисунка"(ImageLocation)Свойство может содержать имя файла или URL. Рисунок
будет загружен из указанного места при построении отчета.

"Отступы"(Padding)Свойство позволяет задать отступы рисунка от краев
объекта, в пикселах.

"Показывать ошибку"(ShowErrorImage)Показывает значок "Нет рисунка" в случае, если рисунок
пустой. Это свойство имеет смысл использовать, еслирисунок загружается из Интернета.

Основы

39

Объект "Линия"Объект "Линия" может отображать горизонтальную, вертикальную или диагональную
линию. Линии могут использоваться для оформления отчета. Объект выглядит следующим
образом:Там, где это возможно, используйте вместо линий рамки объектов. Это упростит отчет (внем не будет лишних объектов), а также избавит от возможных проблем при экспорте
отчета в различные форматы.
Дизайнер FastReport имеет удобные средства для рисования линий. Для того чтобы
добавить в отчет линию, нажмите кнопкуна панели инструментов "Объекты" и в менювыберите объект "Линия" или "Диагональная линия". Поместите курсор мыши в то место,где будет начинаться линия. Затем нажмите и удерживайте левую кнопку мыши, чтобы
нарисовать линию. После этого вы снова можете нарисовать линию. Когда все линии
нарисованы, нажмите кнопкуна панели инструментов "Объекты".

Обычная линия отличается от диагональной тем, что вы можете сделать ее только
вертикальной или горизонтальной.
Для объекта "Линия" нельзя выбрать стиль линии – "Двойная". Хотя этот стиль и доступенв выпадающем списке на панели инструментов "Рамка и заливка", он относится только крамке вокруг объектов.
Объект "Линия" имеет следующие свойства:Свойство

Описание

"Диагональная"(Diagonal)Свойство определяет, является ли линия
диагональной. Обычную линию можно превратить вдиагональную, включив это свойство.

Наконечники линии(StartCap, EndCap)Эти свойства позволяет задать один из следующих
типов наконечников для линии:эллипс;прямоугольник;ромб;стрелка.
Размеры наконечника (ширина и высота) задаются всвойствах Width, Height наконечника. Вы можете
настроить наконечник для каждого конца линии.

40Основы

Объект "Фигура"Объект "Фигура" используется для оформления отчета. Он позволяет отображать одну изследующих геометрических фигур:прямоугольник;скругленный прямоугольник;эллипс;треугольник;ромб.
Объект выглядит следующим образом:Для вставки фигуры в отчет нажмите кнопку
выберите нужный тип фигуры из списка.

на панели инструментов "Объекты" иФигура, как и другие объекты отчета, может иметь заливку и рамку. В отличие от объекта
"Текст", вы не можете управлять отдельными линиями рамки. Также нельзя использовать
стиль линии "Двойная".
Там, где это возможно, используйте для оформления отчета рамки объектов.
Объект имеет следующие свойства:Свойство

Описание

"Тип фигуры"(Shape)Это свойство позволяет выбрать тип фигуры.

"Закругление"(Curve)Это свойство позволяет задать закругление для фигуры типа"Скругленный прямоугольник".

Объект "Штрих-код"Объект позволяет отображать в отчете штрих-код. Он выглядит следующим образом:Объект поддерживает следующие типы штрих-кодов:КодОсновы

ДлинаТаблица символов

41

2 of 5 Interleaved

0-9

2 of 5 Industrial

0-9

2 of 5 Matrix

0-9

Codabar

0-9, -$:/.+

Code128

128 ASCII символов

Code390-9,A-Z, -. *$/+%

Code39 Extended

128 ASCII символов

Code930-9,A-Z, -. *$/+%

Code93 Extended

128 ASCII символов

EAN8

8

0-9

EAN13

13

0-9

MSI

0-9

PostNet

0-9

UPC A

12

0-9

UPC E06

0-9

UPC E1

6

0-9

2-Digit Supplement

20-9

5-Digit Supplement

5

0-9

PDF417

любые символы

Datamatrixлюбые символы

QR Codeлюбые символы

Более полное описание типов штрих-кодов можно найти в Интернет, например, здесь:http://www.barcodeisland.com
Данные штрих-кода поступают в объект в виде строки. Строка может содержать любые
символы, разрешенные для выбранного типа штрих-кода. Некоторые типы кодов являются
цифровыми, остальные могут отображать символьную информацию.
Выбрать тип штрих-кода можно в контекстном меню объекта.
Вы можете подключить объект к данным одним из следующих способов:указать строку, содержащую текст объекта, в свойстве Text;
подключить объект к полю данных с помощью свойства DataColumn;указать в свойстве Expression выражение, которое возвращает текст объекта.
Объект имеет следующие свойства:Свойство

42Описание

Основы

"Код"(Barcode)Свойство содержит настройки, специфичные для выбранного
типа штрих-кода.

"Поворот"(Angle)Свойство позволяет задать поворот объекта на один изфиксированных углов – 0, 90, 180, 270 градусов.

"Масштаб"(Zoom)

Свойство задает масштабирование штрих-кода. Это свойство
используется только вместе со свойством "Авторазмер".

"Авторазмер"(AutoSize)Если это свойство включено, объект будет растягиваться, чтобы
показать штрих-код целиком. Если свойство отключено, штрихкод будет растянут до размеров объекта.

"Показывать текст"(ShowText)

Свойство определяет, надо ли показывать ли текст в нижней
части штрих-кода.

"Поле данных"(DataColumn)Поле данных, из которого загружать текст объекта.

"Выражение"(Expression)Выражение, которое возвращает текст объекта.

"Текст"(Text)

Текст объекта.

"Отступы"(Padding)Свойство позволяет задать отступы от краев объекта, впикселах.

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

Описание

"Ширина полосок"(WideBarRatio)Это свойство имеется у всех линейных штрих-кодов. Оноопределяет относительный размер широких полосок штрихкода.

"Контрольная сумма"(CalcCheckSum)Это свойство имеется у всех линейных штрих-кодов. Оноопределяет, надо ли считать контрольную сумму автоматически.
Если это свойство отключено, контрольная сумма должна
присутствовать в тексте объекта.

"Автокодировка"(AutoEncode)Это свойство имеется у кода Code128. Этот тип штрих-кодаимеет три кодировки – A, B, C. Вы должны либо прямо указать
кодировку в тексте, используя управляющие коды, либовключить это свойство, и кодировка будет подобрана
автоматически.
В тексте можно использовать следующие управляющие коды:Основы

КодЗначение

&A;

START A / CODE A&B;

START B / CODE B&C;START C / CODE C

&S;

SHIFT

43

&1;

FNC1

&2;

FNC2

&3;

FNC3

&4;

FNC4

Если вы включили свойство "Автокодировка", все управляющие
коды будут игнорированы.
Пример использования управляющих кодов в тексте объекта:&C;1234&B;ABC"Отношение сторон"(AspectRatio)Относится к коду PDF417. Это свойство определяет отношение
сторон штрих-кода и используется при автоматическом
вычислении размеров (если свойства Columns, Rows не заданы).

"Кодовая страница"(CodePage)Относится к кодам PDF417 и Datamatrix. Это свойство
определяет номер кодовой страницы, которая используется прикодировании символов. Например, для корректной работы срусскими символами задайте значение свойства = 1251.

"Колонки", "Строки"(Columns, Rows)Относится к коду PDF417. Эти свойства определяет количество
колонок и строк в штрих-коде. Если значения свойств равны 0,размер штрих-кода будет подобран автоматически. В этомслучае также используется свойство AspectRatio.

"Режим упаковки"(CompactionMode)Относится к коду PDF417. Это свойство определяет режим
упаковки информации.

"Коррекция ошибок"(ErrorCorrection)Относится к коду PDF417. Это свойство определяет режим
коррекции ошибок.

"Размер точки"(PixelSize)Относится к коду PDF417. Это свойство определяет размер
точки штрих-кода, в пикселах. Как правило, высота пиксела
должна быть больше его ширины как минимум в 3 раза.

"Кодирование"(Encoding)Относится к коду Datamatrix. Это свойство определяет типкодирования информации.

"Размер точки"(PixelSize)Относится к коду Datamatrix. Это свойство определяет размер
точки штрих-кода, в пикселах.

"Размер символа"(SymbolSize)Относится к коду Datamatrix. Это свойство определяет размер
блока штрих-кода.

Объект "Флажок"Объект позволяет отображать в отчете флажок. Он выглядит следующим образом:44Основы

Объект может отображать два состояния: "включен" и "выключен". Вы можете задать
состояние объекта следующим образом:указать состояние в логическом свойстве Checked;
подключить объект к полю данных с помощью свойства DataColumn;указать в свойстве Expression выражение, возвращающее "истину" или "ложь".
Объект имеет следующие свойства:Свойство

Описание

Символы флажка
(CheckedSymbol,
UncheckedSymbol)

Эти свойства определяют тип символа, который
отображается во включенном и выключенном состоянии.

"Цвет флажка"(CheckColor)В этом свойстве можно указать цвет символа флажка.

"Ширина флажка"(CheckWidthRatio)В этом свойстве можно указать относительную ширину
флажка. Ширина флажка зависит от размеров объекта.
Вы можете установить любое значение из диапазона 0.2 –2. По умолчанию свойство равно 1.

"Прятать, если выключен"(HideIfUnchecked)

Свойство позволяет скрыть объект, если он имеет
состояние "Выключен".

"Включен"(Checked)Свойство позволяет напрямую управлять состоянием
объекта.

"Поле данных"(DataColumn)Поле данных, из которого загружать состояние объекта.
Поле данных должно быть логического типа (Boolean).

"Выражение"(Expression)Выражение, которое возвращает состояние объекта.
Выражение должно возвращать true или false.

Объект "Таблица"Объект "Таблица" состоит из строк, колонок и ячеек и представляет собой упрощенный
аналог таблицы Microsoft Excel. Он выглядит следующим образом:Подробнее об использовании этого объекта можно прочитать в главе "Построение отчетов".
Объект имеет следующие свойства:Свойство

Основы

Описание

45

"Количество колонок"(ColumnCount)Это свойство позволяет быстро создать нужное количество
колонок. Если колонок в таблице меньше, они добавляются,если больше – удаляются.

"Количество строк"(RowCount)Это свойство позволяет быстро создать нужное количество
строк. Если строк в таблице меньше, они добавляются, еслибольше – удаляются.

"Фиксированные
колонки"(FixedColumns)

Свойство определяет, сколько колонок в начале таблицы
являются фиксированными. Фиксированные колонки
образуют заголовок таблицы. Печатью заголовков управляет
свойство "Повторять заголовки". Это свойство работает
только для таблиц, которые строятся динамически.

"Фиксированные строки"(FixedRows)Свойство определяет, сколько строк в начале таблицы
являются фиксированными. Фиксированные строки образуют
заголовок таблицы. Печатью заголовков управляет свойство
"Повторять заголовки". Это свойство работает только длятаблиц, которые строятся динамически.

"Повторять заголовки"(RepeatHeaders)Свойство позволяет печатать заголовки таблицы на каждой
новой странице. Это свойство работает только для таблиц,которые строятся динамически.

Объект "Матрица"Объект "Матрица" является разновидностью таблицы и, как и объект "Таблица", состоитиз строк, колонок и ячеек. Причем заранее неизвестно, сколько строк и столбцов будет вматрице - это зависит от данных, к которым она подключена.
Объект выглядит следующим образом:Подробнее об использовании этого объекта можно прочитать в главе "Построение отчетов".
Объект имеет следующие свойства:Свойство

Описание

"Повторять заголовки"(RepeatHeaders)Если матрица при печати разбивается на несколько страниц,это свойство позволяет печатать заголовки матрицы накаждой новой странице.

"Ячейки одной строкой"(CellsSideBySide)Свойство определяет, как будут располагаться ячейки
матрицы, если матрица имеет несколько значений в ячейках
данных. Возможные варианты:ячейки выводятся рядом (одной строкой);ячейки выводятся друг под другом.

46Основы

"Стиль"(Style)Используя это свойство, можно задать стиль для всейматрицы. Вы можете выбрать один из предустановленных
стилей.

"Авторазмер"(AutoSize)Это свойство, будучи включенным, позволяет подбирать
размеры матрицы автоматически. Выключите его, если выхотите управлять размером объекта вручную.

"Источник данных"(DataSource)Свойство позволяет подключить матрицу к источнику данных.
Это свойство заполняется автоматически при перенесении
поля данных в матрицу. Однако, если вы используете
выражения в ячейках, проверьте, чтобы это свойство былоустановлено корректно.

"Фильтр"(Filter)Это свойство содержит выражение для фильтрации данных,которое будет применено к источнику данных матрицы (см.
свойство DataSource).

Объект "Диаграмма"Объект "Диаграмма MS Chart" позволяет строить диаграммы. Всего доступно более 30различных видов диаграмм - гистограммы, области, линии, пузырьки, круговые,лепестковые, финансовые, пирамидальные, диапазоны. Объект выглядит следующим
образом:Подробнее об использовании этого объекта можно прочитать в главе "Построение отчетов".
Объект имеет следующие свойства:Свойство

Описание

"Диаграмма"(Chart)Ссылка на объект Microsoft Chart.

"Выравнивать значения"(AlignXValues)Свойство позволяет выравнивать значения в нескольких
сериях (вставлять недостающие значения). Используется привыводе двух и более серий в одной диаграмме.

"Автосерии"(AutoSeriesColumn,
AutoSeriesColor,Эти свойства позволяют настроить автоматически
создаваемые серии. Подробнее см. в главе "Построение
отчетов".

Основы

47

AutoSeriesSortOrder)"Источник данных"(DataSource)Свойство позволяет подключить диаграмму к источнику
данных.

"Фильтр"(Filter)Это свойство содержит выражение для фильтрации данных,которое будет применено к источнику данных (см. свойство
DataSource).

Объект "Почтовый индекс"Объект "Почтовый индекс" предназначен для печати почтового индекса на конвертах. Онспособен отображать цифры от 0 до 9. Объект соответствует требованиям, изложенным встандарте ГОСТ Р 51506-99.
Объект выглядит следующим образом:Вы можете подключить объект к данным одним из следующих способов:указать строку, содержащую текст объекта, в свойстве Text;
подключить объект к полю данных с помощью свойства DataColumn;указать в свойстве Expression выражение, которое возвращает текст объекта.
Объект имеет следующие свойства:Свойство

Описание

"Количество
сегментов"(SegmentCount)Свойство определяет количество сегментов в почтовом индексе.
По умолчанию оно равно 6.

"Размер сегмента"(SegmentWidth,
SegmentHeight)Свойства определяют размер одного сегмента. Согласно
стандарту, размер сегмента равен 0.5х1см.

"Расстояние между
сегментами"(Spacing)Свойство определяет расстояние между левыми краями двухсоседних сегментов. Согласно стандарту, расстояние равно
0.9см.

"Показывать сетку"(ShowGrid)Свойство определяет, надо ли показывать точечную сетку.

"Показывать маркеры"(ShowMarkers)Свойство определяет, надо ли показывать маркеры (жирные
горизонтальные линии над почтовым индексом).

"Поле данных"(DataColumn)Поле данных, из которого загружать текст объекта.

"Выражение"(Expression)Выражение, которое возвращает текст объекта.

"Текст"Текст объекта.

48

Основы(Text)Объект "Текст в ячейках"Объект предназначен для печати текста, каждый символ которого выводится в отдельной
ячейке. Такой объект часто используется при печати форм, например, налоговой
отчетности. Он выглядит следующим образом:В сущности, объект является наследником объекта "Текст". Вы можете подключить его кданным аналогичным образом. Для этого в текст объекта поместите ссылку на поледанных, например:[Em ploy e e s.F irst Na m e ]Объект имеет следующие свойства:Свойство

Описание

"Размеры ячейки"(CellWidth, CellHeight)Свойства определяют размеры ячейки. Если оба свойства
равны 0 (по умолчанию), размеры ячейки вычисляются
автоматически, в зависимости от размера шрифта.

"Промежуток между
ячейками"(HorzSpacing, VertSpacing)Свойства определяют горизонтальный и вертикальный
промежуток между соседними ячейками.

Основы

49

Первый отчет в FastReportДавайте создадим простой отчет, который печатает список продуктов. В качестве
источника данных будет использована таблица Products, которая входит вдемонстрационную базу данных.
Предполагается, что вы будете выполнять описанные ниже действия в демонстрационной
программе Demo.exe, из которой можно вызвать дизайнер отчетов.

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

50Основы

перетащите поле "ProductName" на бэнд "Данные". FastReport создаст объект "Текст",который подключен к этому полю, и заголовок для него;второе поле - "UnitPrice" мы создадим другим способом. Для этого на панели
инструментов "Объекты" нажмите кнопку "Текст":отпустите кнопку мыши и переместите ее указатель на рабочее поле дизайнера - выувидите, что FastReport предлагает вставить объект. Выберите нужную позицию инажмите кнопку мыши для вставки объекта;поместите указатель мыши над объектом и нажмите маленькую стрелку в верхнем
правом углу объекта. Вы увидите список полей, из которого надо выбрать поле
"UnitPrice":Основы

51создайте объект "Текст" - заголовок для поля "UnitPrice", добавив описанным вышеспособ новый объект на бэнд "Заголовок страницы". Сделайте на объекте двойной
щелчок и впишите текст "Unit Price";создайте объект "Текст" - заголовок отчета. Расположите его на бэнде "Заголовок
отчета" и впишите текст "PRODUCTS";установите стиль шрифта "жирный" для объектов, лежащих на заголовке отчета изаголовке страницы. Для этого выделите три объекта, нажав клавишу Shift, и нажмите
кнопкуна панели инструментов "Текст". После этого отчет будет выглядеть так:Чтобы запустить отчет, нажмите кнопкуна панели управления. Отчет будет построени показан в окне предварительного просмотра:Пример 2. Создание отчета с помощью мастераВ этом примере мы создадим отчет с помощью "Мастера стандартного отчета". Для этого
выполните следующие действия:нажмите кнопкуна панели инструментов и в окне "Создать" выберите "Мастер
стандартного отчета":52Основына первом шаге мастера выберите таблицу "Products" и нажмите кнопку "Вперед":на втором шаге мастера выберите поля "ProductName" и "UnitPrice" и перенесите их всписок выбранных полей:Основы

53

остальные шаги мастера можно пропустить, нажимая кнопку "Вперед";на последнем шаге мастера выберите стиль Blue и нажмите кнопку "Готово":54Основы

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

55

Глава

IIПостроение отчетов

Построение отчетовВ этой главе будут описаны способы построения основных типов отчетов. Для построения
любого отчета, как правило, нужно выполнить следующие действия:1. Выбрать или создать данные, которые будут использованы в отчете.
2. Создать структуру отчета, добавив в него необходимые бэнды.
3. Подключить бэнды к источникам данных.
4. Разместить на бэндах объекты "Текст" для печати данных.
5. Задать форматирование у объектов.

58Построение отчетов

Выбор данных для отчета
Прежде чем вы начнете построение отчета, вам необходимо выбрать данные, которые
будут печататься в отчете. Вы можете сделать это двумя способами:вы выбираете один из источников данных, которые были зарегистрированы в отчете
программным способом. Это можно сделать в меню "Данные|Выбрать данные дляотчета...", отметив галочками нужные источники:вы создаете новый источник данных в меню "Данные|Новый источник данных...".
Подробнее об источниках данных можно прочитать в главе "Работа с данными".
Как только вы выбрали источник данных, он появляется в окне "Данные". С этого моментавы можете использовать этот источник в отчете. Как правило, большинство отчетов
использует один источник данных. Для отчетов типа "master-detail" нужно выбрать дваисточника, между которыми установлена связь (о связях можно прочитать в главе "Работас данными"). Несколько источников также может понадобиться в отчете, который
печатает данные из связанных источников (например, из справочников).

Построение отчетов

59

Автоматический подбор высоты объектов
Часто приходится печатать текст, размер которого на этапе создания отчета неизвестен.
Например, это может быть описание товара. В этом случае приходится решать следующие
задачи:подобрать высоту объекта так, чтобы он вместил весь текст;подобрать высоту бэнда так, чтобы он вместил объекты с переменным количеством
текста;сдвинуть или изменить высоту других объектов, имеющихся на бэнде, так, чтобы ненарушить общее оформление отчета.
Эти задачи можно решить, используя некоторые свойства объектов и бэндов:свойства "Может расти" и "Может сжиматься" позволяют подбирать высоту объекта
автоматически;свойство "Сдвиг" позволяет сдвигать объекты, расположенные под расширяемыми
объектами;свойство "Расти вниз" позволяет дотягивать объекты до нижнего края бэнда;свойства "Якорь" и "Стыковка" позволяют управлять размером объектов в зависимостиот размера бэнда.
Все эти свойства будут рассмотрены ниже.

Свойства "Может расти", "Может сжиматься" (CanGrow, CanShrink)Эти свойства имеются у бэндов и объектов отчета. Свойства определяют, может лиобъект расти или сжиматься в зависимости от размера своего содержимого. Если обасвойства отключены, объект всегда имеет размер, заданный в дизайнере.
Эти свойства очень полезны, если надо напечатать текст, размер которого неизвестен наэтапе дизайна. Для того, чтобы объект смог вместить весь текст, у него нужно включить
свойства "Может расти"/"Может сжиматься":Также эти свойства надо включить у бэнда, чтобы он расширился или сжался взависимости от размера объектов, которые на нем расположены. Менять размер бэнда
могут следующие объекты:"Текст";"Форматированный текст";"Рисунок" (с включенным свойством "Авторазмер");"Таблица".

60Построение отчетов

Свойство "Сдвиг" (ShiftMode)Это свойство имеется у объектов отчета. Его можно изменить в окне "Свойства". Объект свключенным свойством будет сдвинут вниз или вверх, если над ним имеется объект,который расширяется или сжимается:Свойство ShiftMode может иметь одно из значений:Всегда (Always). Означает, что объект нужно сдвигать всегда. Это значение поумолчанию.
Никогда (Never). Означает, что объект сдвигать не нужно.
При перекрытии (WhenOverlapped). Означает, что объект сдвигать нужно в том случае,если расширяющийся объект находится строго над ним (т.е. оба объекта перекрываютсяпо горизонтали).
Это свойство удобно использовать при печати информации табличного вида, когда
несколько ячеек таблицы находятся друг над другом и могут иметь переменное
количество текста.

Свойство "Расти вниз" (GrowToBottom)
Это свойство имеется у объектов отчета. Объект с включенным свойством при печати
растягивается до нижней границы бэнда, независимо от того, сколько в нем текста:Это бывает необходимо при печати информации табличного вида. На бэнде может
находиться несколько объектов, которые могут растягиваться. Это свойство позволяет
"дотягивать" остальные объекты, чтобы не нарушать внешний вид таблицы.

Построение отчетов

61Свойство "Якорь" (Anchor)Это свойство есть у объектов отчета. Оно определяет, как будет изменяться позиция
объекта и/или его размеры при изменении размеров контейнера, на котором он лежит.
Используя якорь, можно сделать так, чтобы объект расширялся или сдвигался синхроннос контейнером.
Контейнер, о котором идет речь, в большинстве случаев является бэндом. Но это может
быть и объект "Таблица" или "Матрица", которые могут содержать внутри другие объекты.
Свойство может иметь одно из следующих значений, а также любую комбинацию этихзначений:Значение

Описание

LeftЗаякорен левый край объекта. При изменении ширины
контейнера объект не будет смещаться влево/вправо.

TopЗаякорен верхний край объекта. При изменении высоты
контейнера объект не будет смещаться вверх/вниз.

RightЗаякорен правый край объекта. При изменении ширины
контейнера расстояние между правыми краями объекта иконтейнера будет постоянным. Если при этом заякорен левый
край объекта, объект будет расти и сжиматься синхронно сконтейнером.

BottomЗаякорен нижний край объекта. При изменении высоты
контейнера расстояние между нижними краями объекта иконтейнера будет постоянным. Если при этом заякорен
верхний край объекта, объект будет расти и сжиматься
синхронно с контейнером.

По умолчанию значение этого свойства равно Left, Top. Это значит, что при изменении
размеров контейнера объект меняться не будет. В таблице ниже приведены некоторые
часто используемые комбинации значений:Значение

Описание

Left, TopЗначение по умолчанию. Объект не меняется при изменении
размеров контейнера.

Left, BottomОбъект смещается вверх/вниз при изменении высоты
контейнера. Положение объекта относительно нижнего краяконтейнера остается неизменным.

Left, Top, BottomПри изменении высоты контейнера высота объекта изменяется
синхронно с ним.

Left, Top, Right,
BottomПри изменении ширины и высоты контейнера объект растет/сжимается синхронно с ним.

62Построение отчетов

Свойство "Стыковка" (Dock)Это свойство есть у объектов отчета. Оно определяет, к какой стороне контейнера будет
пристыкован объект.
Свойство может иметь одно из следующих значений:Значение

Описание

NoneЗначение по умолчанию. Объект не стыкуется.

LeftОбъект пристыкован к левому краю контейнера. При этом высота
объекта будет равна высоте контейнера*.

TopОбъект пристыкован к верхнему краю контейнера. При этом ширина
объекта будет равна ширине контейнера*.

RightОбъект пристыкован к правому краю контейнера. При этом высота
объекта будет равна высоте контейнера*.

BottomОбъект пристыкован к нижнему краю контейнера. При этом ширина
объекта будет равна ширине контейнера*.

FillОбъект занимает все свободное место контейнера.

* это не совсем так, если одновременно стыкуется несколько объектов. На рисунке нижепоказано два объекта, первый пристыкован к верхнему краю контейнера, второй – клевому:Как видно, высота второго объекта равна высоте свободного места, которое осталось
после стыковки первого объекта.
Стыковка объектов зависит от порядка их создания. Его можно изменить в контекстном
меню объекта с помощью пунктов "На передний план" и "На задний план".

Построение отчетов

63ФорматированиеВ этом разделе рассматриваются следующие вопросы:изменение внешнего вида объекта;изменение формата печатаемых значений;автоматическое изменение внешнего вида объекта при выполнении какого-либоусловия;скрытие ненужных значений;выделение четных строк данных другим цветом.

Рамка и заливка
Практически все объекты имеют рамку (свойство Border) и заливку (свойство Fill). Дляработы с ними используйте панель инструментов "Рамка и заливка":Рамка объекта состоит из четырех линий, каждая из которых может иметь разную
толщину, цвет и стиль. Кнопки на панели инструментов меняют настройки для всех линий
рамки. Кнопка
отдельно:вызывает диалоговое окно, в котором можно настроить каждую линиюДля работы с заливкой на панели "Рамка и заливка" есть две кнопки. Кнопка

64Построение отчетов

позволяет сделать сплошную заливку выбранным цветом. Кнопка
вызывает
диалоговое окно, в котором можно выбрать тип заливки и настроить все ее параметры:Формат текстаДля изменения внешнего вида объекта "Текст" используйте панель инструментов "Текст":СтилиДля оформления объектов можно использовать стили. Стиль – это набор следующих
свойств:рамка;
заливка;шрифт;
цвет текста.
Список стилей содержится в отчете. Вы можете управлять им из меню "Отчет|Стили..."или с помощью кнопки

Построение отчетовна панели инструментов "Стиль":65

Выбрать стиль для объекта можно двумя способами:установить значение свойства "Style" в окне "Свойства";использовать панель инструментов "Стили":Если панель отсутствует на экране, ее можно показать в меню "Вид|Панели
инструментов|Стиль".
При этом объект станет выглядеть так, как указано в стиле. Если параметры стиля
поменяются, внешний вид объекта изменится автоматически.

Формат данныхДля печати текстовой информации в отчете используется объект "Текст". По умолчаниюон печатает данные в том виде, в котором они представлены в источнике данных.
Например, поле данных типа "Дата" помимо даты содержит и время (это особенность типаDateTime в .Net). При печати такого поля в отчете вы увидите примерно следующее:11.10.2008 18:04:52
Если вам нужно напечатать только дату, используйте форматирование данных. Для этого
выделите объект "Текст" и нажмите правую кнопку мыши, чтобы вызвать контекстное
меню. В меню выберите пункт "Формат данных...". Вы увидите следующий диалог:66Построение отчетовВ диалоге можно выбрать один из доступных форматов, а также задать собственную
строку форматирования, выбрав формат "Пользовательский". Если в тексте объекта естьнесколько выражений, вы можете задать форматирование для каждого из них. Для этого вверхней части окна выберите нужное выражение и задайте формат:Построение отчетов

67Вы также можете форматировать данные, используя системную функцию String.Format.
Справку по этой функции можно найти в справочной системе MSDN.

Се годня [St ring.F orm a t ("{0:d}", [Da t e ])], с т ра ниц а [Pa ge ]Условное выделениеВ объекте "Текст" предусмотрена возможность смены внешнего вида объекта взависимости от заданных условий. Например, объект можно выделить красным цветом,если он содержит отрицательное значение. Эта возможность называется "условное
выделение". Для ее настройки выберите объект и нажмите кнопку
инструментов "Текст". Вы увидите следующее диалоговое окно:на панели

Здесь можно определить одно или несколько условий и задать стиль для каждого условия.
Стиль может содержать одно или несколько свойств:заливка;цвет текста;параметры шрифта;видимость объекта.
Вы можете указать, какие свойства необходимо менять при срабатывании условия. Дляэтого используйте флажки в правой части окна. По умолчанию новый стиль имеет однунастройку – цвет текста.
Для того чтобы создать новое условие, нажмите кнопку "Добавить". Вы увидите редактор
выражения:68Построение отчетов

Здесь можно написать любое выражение, которое возвращает логический результат (да/нет). В большинстве случаев в выражении участвует текущее печатаемое значение,которое доступно через переменную Value.
Рассмотрим следующий пример: у нас есть объект "Текст", в котором печатается остаток
товара на складе:[Produc t s.Unit sInSt oc k]Мы хотим подсветить объект красным цветом, если количество товара = 0. Для этого
создадим следующее условие:V a lue == 0В данном случае мы использовали переменную Value, которая содержит печатаемое
значение. Если в объекте есть несколько выражений, эта переменная будет содержать
значение последнего выражения. Вместо Value можно использовать поле из источника
данных, например:[Produc t s.Unit sInSt oc k] == 0Операция сравнения написана в стиле C#. Это верно, если в качестве языка отчета
выбран C#. Для языка VisualBasic.Net операция сравнения – одиночный знак "=".
Напоминаем, что язык отчета можно поменять в меню "Отчет|Свойства...".
Настроим стиль для данного условия так, чтобы использовалась только заливка, и укажем
цвет заливки – красный:Построение отчетов

69

При печати объекты, содержащие нулевое значение, будут красными. Теперь усложнимнаш пример, добавив еще одно условие. Если остаток товара меньше 10, он должен бытьнапечатан желтым цветом. Для этого откроем редактор условий и нажмем кнопку
"Добавить". Второе условие будет выглядеть так:V a lue < 10
В случае, когда указано несколько условий, FastReport проверяет все условия, начиная спервого. Если какое-то условие выполняется, FastReport применяет его стиль к объекту, ипроцесс завершается. Здесь важно расставить условия в правильном порядке. Так,порядок, который мы рассмотрели в этом примере, правильный:1. V a lue == 0
2. V a lue < 10Если условия поменять местами, то выделение будет работать неправильно.

1. V a lue < 10
2. V a lue == 0В данном случае условие "Value == 0" выполняться не будет, потому что при нулевом
значении сработает первое условие. Для того чтобы поменять порядок условий,используйте кнопки

ив редакторе условий.

Скрытие нулевых значений
Объект "Текст" имеет свойство HideZeros, которое позволяет скрывать нулевые значения.
Рассмотрим объект со следующим содержимым:Вс е го э ле м е нт ов : [Count OfEle m e nt s]Если значение переменной CountOfElements равно 0, и свойство HideZeros равно true, тообъект будет напечатан так:70Построение отчетовВс е го э ле м е нт ов :Объект "Текст" также имеет свойство HideValue строкового типа, которое позволяет
скрывать значения выражений, равные заданному значению. Например, если значение
свойства равно "0", то будут скрыты все нулевые поля. Это свойство также можно
использовать для скрытия "нулевых" дат. Как правило, это даты 1.1.0001 или 1.1.1900. Вэтом случае значение свойства HideValue должно быть таким:1.1.1900 0:00:00
Как вы можете видеть, кроме даты надо написать и время. Это необходимо, потому чтозначение даты в .Net содержит и время.
Важное замечание: рассматриваемый механизм зависит от региональных установок,заданных в Панели управления. Это происходит потому, что FastReport сравнивает строки,используя метод ToString() у значения выражения. Этот метод преобразует значение встроку, используя текущие региональные установки. В связи с этим, будьте осторожныпри разработке отчетов, которые могут быть запущены на компьютере с другими
региональными установками.

Наконец, свойство NullValue объекта "Текст" позволяет выводить какой-либо текст вместо
пустых (null) значений. Часто это применяется для того, чтобы напечатать прочерк вместо
пустого значения. Рассмотрим объект со следующим содержимым:Вс е го э ле м е нт ов : [Count OfEle m e nt s]Если значение переменной CountOfElements равно null, и свойство NullValue равно --, тообъект будет напечатан так:Вс е го э ле м е нт ов : --Скрытие повторяющихся значенийУ объекта "Текст" есть свойство "Повторяющиеся значения" (Duplicates), позволяющее
скрывать повторяющиеся значения. Это свойство работает только для объектов "Текст",которые лежат на бэнде "Данные". Повторяющимися считаются одинаковые значения,напечатанные в соседних строках данных.
Свойство может иметь одно из следующих значений:Показывать (Show) - показывать повторяющиеся значения (значение по умолчанию).
Прятать (Hide) - прятать объект с повторяющимся значением.
Очищать (Clear) - очищать текст в объекте, но показывать сам объект.
Объединять (Merge) - объединять объекты с одинаковыми значениями.
На рисунке продемонстрировано отличие между этими режимами:Построение отчетов

71Выделение строк данных через однуДля улучшения внешнего вида отчета можно выделить четные строки данных другим
цветом. Сделать это можно, используя свойство EvenStyle у бэнда или объектов, лежащихна бэнде. Этому свойству присваивается имя стиля, который будет использован длячетных строк бэнда.
Предпочтительнее использовать свойство EvenStyle у объектов, лежащих на бэнде. Этопозволит избежать возможных проблем при экспорте отчета.
Чтобы настроить выделение строк, сделайте следующее:1. определите стиль, который будет использован для выделения строк. Это можно сделатьв меню "Отчет|Стили...". Как правило, для выделения используется бледно-серый цветзаливки.
2. имя нового стиля укажите в свойстве EvenStyle у бэнда или его объектов.
По умолчанию, объекты используют только заливку стиля, заданного в свойстве
EvenStyle. Такое поведение определяется в свойстве EvenStylePriority - по умолчанию оноравно UseFill. Если вам нужны остальные параметры стиля, установите это свойство в
UseAll.
Готовый отчет, который использует эту технику, может выглядеть так:72Построение отчетов

Отчет с одним бэндом "Данные"Отчет этого типа является наиболее часто востребованным. Он позволяет напечатать
список строк из источника данных. Например, это может быть список клиентов.

Подключение бэнда к даннымДля печати данных в отчете в виде списка вам понадобится бэнд "Данные", который надоподключить к источнику данных. Бэнд будет напечатан столько раз, сколько строк висточнике.
Если бэнд "Данные" не подключен к источнику, он печатается один раз.
Когда вы создаете новый отчет, он уже содержит несколько пустых бэндов, в том числе ибэнд "Данные". Этот бэнд также можно добавить в окне "Настройка бэндов", выбрав пункт
меню "Отчет|Настроить бэнды...".
Для того чтобы подключить бэнд к данным, сделайте на нем двойной щелчок мышью. Вокне редактора выберите источник данных и нажмите кнопку "ОК":Печать текстовых данных
После того, как бэнд подключен к данным, на нем можно разместить объекты "Текст",которые будут показывать информацию из полей данных. Самый быстрый способ сделать
это - перетащить (drag&drop) поля из окна "Данные" на бэнд. Подробнее о всехвозможностях объекта "Текст" читайте в главе "Объект "Текст".

Построение отчетов

73

Сортировка данных
Бэнд "Данные" печатает данные в том порядке, в каком они расположены в источнике
данных. Часто бывает необходимо отсортировать данные перед печатью. Например, список
клиентов удобно представить в отсортированном по алфавиту виде.
Вы можете управлять сортировкой в редакторе бэнда "Данные". Чтобы вызвать редактор,сделайте двойной щелчок на свободном месте бэнда:В качестве критерия сортировки можно использовать поле данных или выражение. Выможете указать несколько (не более трех) условий для сортировки. Это может
понадобиться, к примеру, если вы хотите сортировать список клиентов по городам, затемпо названию клиента. Для каждого условия можно выбрать порядок сортировки - повозрастанию или по убыванию.
Другой способ указать сортировку - использовать в качестве источника данных запрос наязыке SQL, в котором указать нужный критерий сортировки. Запрос будет выполнен насервере данных и вернет отсортированные строки.

74Построение отчетов

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

[Produc t s.Disc ont inue d] == fa lseЭто значит, что будут выбраны все строки данных, у которых флаг Discontinued равен
false.
Другой пример фильтра со сложным выражением:[Produc t s.Disc ont inue d] == fa lse && [Produc t s.Unit Pric e ] < 10Это значит, что будут выбраны все строки данных, у которых флаг Discontinued равен
false и цена меньше 10.
Этот способ фильтрации предполагает, что источник данных содержит все строки, частьиз которых будет отфильтрована. Если источник содержит большое количество строк, этоможет серьезно замедлить работу отчета. В этом случае вы можете использовать вкачестве источника данных запрос на языке SQL, в котором указать нужное условие
фильтрации. Запрос будет выполнен на сервере данных и вернет только те строки,которые нужны в отчете.

Для фильтрации данных также можно использовать диалоговые формы в отчете.
Подробнее см. в главе "Диалоговые формы".

Построение отчетов

75

Заголовок и подвал данных
Бэнд "Данные" может иметь заголовок и подвал. Заголовок будет напечатан один разперед данными; подвал будет напечатан после вывода всех данных.
Чтобы добавить к бэнду "Данные" заголовок и подвал, выберите пункт меню "Отчет|Настроить бэнды". В окне выделите нужный бэнд "Данные" и нажмите правую кнопку
мыши. В открывшемся списке выберите пункты "Заголовок данных" и "Подвал данных":В отчетах типа "простой список" с одним бэндом "Данные" заголовок и подвал данных
использовать не обязательно - их функции дублируются бэндами "Заголовок отчета" и"Подвал отчета". Эти бэнды могут быть полезными в следующих случаях:при печати нескольких списков на одной странице (см. далее). Каждый из бэндов в этомслучае может иметь собственный заголовок и подвал:76Построение отчетов

при печати одного списка, если список не помещается на одной странице готового
отчета. Используя свойство "Повторять на каждой странице" у заголовка/подвала
данных, вы можете напечатать эти бэнды на каждой странице отчета:Разрыв и удерживание данныхВ этом разделе будут рассмотрены два режима печати бэндов - "Разрыв" и "Удерживание".
В обычном режиме печати бэнда FastReport проверяет, достаточно ли места на текущей
странице. Если места не достаточно, бэнд печатается целиком на следующей странице.

Построение отчетов

77Если включить свойство "Может разрываться" у бэнда, FastReport будет пытаться
напечатать часть содержимого бэнда на имеющемся месте, т.е. "разорвать" его.
Попытка разрыва бэнда может быть успешной, а может, и нет. Это зависит от того, какие
объекты расположены на бэнде, и их настроек. Разрываться могут следующие объекты:"Текст""Форматированный текст""Таблица"Эти объекты также имеют свойство "Может разрываться". Если оно включено, объект
может быть разорван. Неразрываемый объект всегда выводится целиком там, где емухватает места.
На рисунке ниже показан пример того, как может быть разорван бэнд.

Алгоритм разрыва не всегда работает корректно. В случае, когда одновременно
разрывается несколько объектов с разным размером шрифта, либо сложным обрамлением,могут возникать артефакты.
Цель разрыва данных - максимально использовать место на листе, чтобы в дальнейшем
сэкономить бумагу при печати отчета. У удерживания данных цель противоположная:вывести определенную группу бэндов целиком на одном листе. В этом случае на листах
отчета остается довольно много неиспользованного пространства, но зато данные
печатаются в виде, более удобном для восприятия.
Механизм удерживания данных (KeepTogether) позволяет удерживать на одной странице
(или колонке, если отчет с колонками) определенную группу бэндов. Если при печати
удерживаемых данных достигается конец страницы, FastReport переносит все ранее
напечатанные данные на новую страницу.
Вы можете использовать удерживание данных в следующих случаях:печать всех строк бэнда "Данные" вместе;печать всех элементов группы (заголовок, данные, подвал) вместе;печать строки главного источника данных вместе со всеми строками из подчиненного
источника в отчетах типа master-detail;печать заголовка отчета или заголовка данных вместе с хотя бы одной строкой данных;печать подвала отчета или подвала данных вместе с хотя бы одной строкой данных;печать вместе основного и дочернего бэнда.
Рассмотрим применение удерживания данных.
Для удерживания вместе всех строк данных или группы (заголовок, данные, подвал)включите свойство "Держать вместе" (KeepTogether). Это свойство используется в бэндах
"Данные" и "Заголовок группы". На рисунке показано, как печатаются данные без78Построение отчетов

удерживания и с удерживанием:Для удерживания строки данных главного источника вместе со строками подчиненного
источника включите свойство "Держать детали вместе" (KeepDetail) у бэнда "Данные". Этосвойство используется в отчете типа master-detail:Для запрета "висячих" заголовков и подвалов используйте свойство "Не отрывать отданных" (KeepWithData). Это свойство имеется у следующих бэндов:заголовок отчета;подвал отчета;заголовок данных;подвал данных;заголовок группы;подвал группы.
Оно позволяет не отрывать заголовок/подвал от строки данных. То есть, вместе сзаголовком на странице должна помещаться хотя бы одна строка данных:Для того чтобы держать вместе бэнд и его дочерний бэнд, включите свойство "Держать
дочерний бэнд вместе" (KeepChild).

Построение отчетов

79Печать пустых строк данных
Довольно часто при печати на бланках требуется напечатать определенное количество
строк данных. Если реальных данных меньше, чем требуемое количество строк, надонапечатать пустые строки. Это можно сделать с помощью бэнда "Дочерний", прикрепивего к бэнду "Данные".
У бэнда "Дочерний" имеется свойство "Дополнить данные до N строк" (CompleteToNRows).
Если в этом свойстве указать значение > 0, бэнд будет использован для дополнения
строк данных до указанного количества. Допустим, требуется напечатать 15 строк
данных, тогда как в источнике данных имеется лишь 8. В этом случае бэнд "Дочерний"будет напечатан 7 раз.

Готовый отчет будет выглядеть так:Если данных в источнике больше, чем указано в свойстве "Дополнить данные до N строк",80Построение отчетов

пустые строки печататься не будут.

Второй способ печати пустых строк позволяет заполнить пустыми строками свободное
место страницы. В этом случае бэнд "Дочерний" прикрепляется к бэнду типа "Подвал
данных" или "Подвал группы" и заполняет свободное место страницы таким образом, чтобына ней поместился бэнд-подвал.
Для того чтобы напечатать пустые строки указанным способом, прикрепите бэнд"Дочерний" к бэнду-подвалу и включите его свойство "Заполнять пустое место страницы".
В дизайнере дочерний бэнд, у которого включено это свойство, будет отображаться вышебэнда, к которому он подключен. На рисунке ниже бэнд "Дочерний" прикреплен к бэнду
"Подвал отчета":Если запустить такой отчет, мы увидим следующее:Печать текста "Нет данных"Если бэнд "Данные" подключен к пустому источнику данных, то он напечатан не будет. Втаком случае иногда требуется печатать надпись типа "Нет данных". Для этого сделайте
следующее:добавьте к бэнду "Данные" дочерний бэнд;у дочернего бэнда включите свойство PrintIfDatabandEmpty (это можно сделать в окнеПостроение отчетов

81

"Свойства");на дочерний бэнд положите объект "Текст" с текстом "Нет данных для отображения".

Отчет будет построен следующим образом:если в источнике есть данные, будет напечатан бэнд "Данные" со всеми
сопутствующими бэндами (заголовок данных, подвал);если источник данных пустой, будет напечатан только дочерний бэнд с текстом "Нетданных для отображения".

Печать иерархии
Бэнд "Данные" позволяет печатать иерархический список. Для этого используется одинбэнд и один источник данных. Иерархия должна быть определена в источнике данных спомощью двух полей:1. ключевое поле. Это идентификатор строки данных.
2. поле, которое содержит ключ родительской строки данных.
Чтобы напечатать такой источник в иерархическом виде, вам нужно настроить следующие
свойства бэнда "Данные". Это можно сделать в окне "Свойства":ключевое поле указываем в свойстве IdColumn;
поле, содержащее значение родителя, указываем в свойстве ParentIdColumn;в свойстве Indent задаем величину отступа.
Покажем на примере, как распечатать иерархию сотрудников из таблицы Employees.
Таблица имеет два необходимых нам поля:поле EmployeeID является ключевым и содержит номер сотрудника;поле ReportsTo содержит номер сотрудника, которому подчиняется данный сотрудник.
Создадим отчет следующего вида:82Построение отчетов

Настроим свойства бэнда "Данные", которые отвечают за иерархию, следующим образом:Запустим отчет на выполнение. В результате получится следующее:При печати иерархии FastReport сдвигает бэнд вправо (на величину, указанную всвойстве Indent), а также уменьшает ширину бэнда на это же значение. При этом выможете использовать свойство Anchor у объектов, лежащих на бэнде. Возможные
комбинации значения Anchor:
Left, Top (по умолчанию) - объект сдвигается вместе с бэндом;Right, Top - объект остается на месте;Left, Right, Top - фиксируется правый край объекта, левый край сдвигается вместе сбэндом.
Это позволяет получать разнообразные эффекты, как показано на рисунке:Построение отчетов

83В данном примере у картинки Anchor = Left, Top; у объекта с названием должности - Left,
Right, Top; у объекта с именем - Right, Top.

84Построение отчетов

Отчет "Главный-подчиненный" (Master-detail)Используя два бэнда "Данные", легко построить отчет типа "Главныйподчиненный" (master-detail). В этом отчете используются два источника данных, между
которыми установлена связь. Одной строке главного источника может соответствовать
несколько строк подчиненного источника. Подробнее о связях читайте в главе "Данные".
Бэнды необходимо расположить в отчете так, чтобы главный бэнд содержал внутри себяподчиненный. Это делается в окне "Настройка бэндов", которое можно вызвать в меню"Отчет|Настроить бэнды...".
Рассмотрим создание master-detail отчета "с нуля". Для этого запустим дизайнер отчета исоздадим новый пустой отчет. Он уже содержит один бэнд "Данные":Чтобы добавить подчиненный бэнд "Данные", вызовите окно "Настройка бэндов". Этоможно сделать, нажав кнопку "Настроить бэнды...", показанную на рисунке, или выбрав
пункт меню "Отчет|Настроить бэнды...". В окне настройки отображается текущая
структура бэндов:Построение отчетов

85Выберите бэнд "Данные", как показано на рисунке, и нажмите правую кнопку мыши, чтобы
показать контекстное меню (либо нажмите кнопку "Добавить" в нижней части окна). Воткрывшемся меню выберите бэнд "Данные":После этого к выбранному бэнду добавится вложенный бэнд "Данные". Закройте окнокнопкой "Закрыть". Вы увидите, что шаблон отчета изменился следующим образом:Вложенность бэндов данных хорошо видна на структуре бэндов в левой части окна. После
этого нужно привязать бэнды к соответствующим источникам данных и расположить поляданных на бэндах. Мы будем использовать связанные источники данных Categories(Категории) и Products (Продукты) из демонстрационной базы данных, которая
поставляется в комплекте FastReport:

86Построение отчетов

При запуске отчета мы увидим следующее:Таким образом вы можете создавать отчеты типа master-detail с неограниченной
вложенностью данных, например, master-detail-subdetail. Другой способ, который
применяется для создания отчетов типа master-detail, связан с использованием
вложенных отчетов. Вложенные отчеты будут рассмотрены далее.

Построение отчетов

87Отчет типа master-masterНа странице отчета можно напечатать несколько простых списков. Это можно сделать,разместив на странице два или несколько бэндов "Данные". В отличие от отчета masterdetail, где бэнды являются вложенными друг в друга и печатают данные из связанных
источников, в отчете этого типа (назовем его master-master) и бэнды, и источники данных
независимы друг от друга.
Покажем на примере, как создать отчет, который печатает на странице два списка список категорий (таблица Categories) и клиентов (таблица Customers). Создайте новый
отчет и добавьте в него нужные источники данных. Чтобы добавить второй бэнд "Данные",вызовите окно "Настройка бэндов":Щелкните правой кнопкой мышки на пустом месте списка, как показано на рисунке, ивыберите в контекстном меню бэнд "Данные". Это создаст второй независимый бэнд"Данные". Шаблон отчета будет выглядеть так:Теперь подключим бэнды к источникам данных и разместим на них несколько полей
данных:88Построение отчетов

Если запустить отчет, мы увидим следующее:Построение отчетов

89Отчет типа master-detail-detailБэнд "Данные" может содержать один или несколько вложенных бэндов "Данные". Этопозволяет строить отчеты типа master-detail-detail. Настроить структуру бэндов длятакого отчета можно в окне "Настройка бэндов". Для этого щелкните правой кнопкой
мыши на главном бэнде "Данные" и добавьте к нему подчиненный бэнд "Данные".
Повторите эту процедуру для добавления второго подчиненного бэнда:Таким образом, можно добавлять неограниченное количество подчиненных бэндов вглавный бэнд "Данные". Например, структура отчета может выглядеть так (этовымышленная структура, она лишь дает представление о возможностях FastReport):90Построение отчетов

Многоколоночный отчет
Обычный отчет печатает данные до тех пор, пока не достигнут конец страницы. После
этого формируется новая страница, и печать продолжается на ней. Отчет с колонками
печатает данные в несколько колонок. Когда достигнут конец страницы, печать
продолжается с новой колонки на этой же странице. В этом смысле обычный отчет можно
рассматривать как отчет с одной колонкой.
В FastReport есть два способа печати колонок.

Колонки страницы
Первый способ заключается в указании количества колонок у страницы отчета. Этоделается в настройках страницы на закладке "Колонки":Как видно, вы можете указать следующие параметры колонок:количество;ширина колонки;позиция каждой колонки.
Для того чтобы превратить обычный отчет в отчет с колонками, вам нужно указать только
количество колонок на странице. Все остальные параметры FastReport подберет
самостоятельно. Когда вы включите колонки, вид бэндов в дизайнере изменится:Построение отчетов

91Такие бэнды, как "Данные", "Заголовок группы" и другие, связанные с выводом данных,используют для печати только область, соответствующую ширине колонки. Эта область
показана, как обычно, белым цветом. Область, показанную серым, для размещения
данных использовать нельзя: здесь будут печататься данные в соседних колонках.
Для работы с колонками используются бэнды - "Заголовок колонки" и "Подвал колонки".
Как видно из их названий, они печатаются вверху и внизу каждой колонки
соответственно. Схема печати отчета с колонками представлена на рисунке:Колонки бэнда "Данные"Второй способ многоколоночной печати заключается в использовании колонок бэнда
"Данные". При этом остальные бэнды продолжают печататься в одну колонку.
Параметры колонок настраиваются с помощью свойства "Columns", которое можно
изменить в окне "Свойства". Вы можете задать следующие параметры:92Построение отчетов

количество колонок;ширина колонки;режим печати колонок. Вы можете выбрать один из двух режимов - "слева направо,сверху вниз" и "сверху вниз, слева направо";минимальное количество строк в одной колонке, если выбран режим печати "сверху
вниз, слева направо".
Колонки бэнда могут печататься в одном из двух режимов. В режиме "слева направо,сверху вниз" (это режим по умолчанию) колонки печатаются следующим образом:В режиме "сверху вниз, слева направо" печать колонок происходит следующим образом:В этом режиме FastReport подбирает количество строк данных в колонке таким образом,чтобы колонки заполнялись равномерно. Вы также можете указать минимальное
количество строк в колонке с помощью свойства Columns.MinRowCount.
Бэнд, у которого есть колонки, не должен иметь подчиненных бэндов. Это касается
отчетов типа Master-Detail. Не устанавливайте колонки у бэнда master.

Построение отчетов

93Многостраничный отчет типа "Буклет"При печати отчета в виде буклета вы, как правило, столкнетесь со следующими
требованиями:отдельные страницы отчета - титульная страница (cover), оглавление (table ofcontents), содержимое отчета, последняя страница (back cover);разные поля страницы для четных и нечетных страниц;разное оформление заголовков и подвалов на четных и нечетных страницах.

Добавление страницы в отчетВы можете добавлять в шаблон отчета любое количество страниц. На каждой странице
можно размещать отдельный отчет. Для добавления новой страницы нажмите кнопкуна панели инструментов. Страницу можно также добавить, нажав кнопку "Создать..." ивыбрав в окне пункт "Страница отчета".
Для печати раздела "Оглавление" вы можете воспользоваться приемом, описанным вглаве "Интерактивные отчеты".

Настройка страницВ настройках страницы на закладке "Поля" можно указать, что для четных страниц левоеи правое поля поменяются местами:Если необходимо, чтобы страница начиналась с нечетного номера, установите свойство
страницы "StartOnOddPage" в true. При необходимости FastReport вставит пустую
страницу перед началом печати указанной страницы.

94Построение отчетов

Печать на четных и нечетных страницах
Используя свойство "Печатать на..." (PrintOn) объектов отчета, можно печатать разные
объекты на четных и нечетных страницах.
Свойство "PrintOn" можно поменять в окне "Свойства", предварительно выделив объект.
Это свойство определяет, на каких страницах может быть напечатан объект. Доступны
следующие значения, а также любая их комбинация:первая страница (FirstPage);последняя страница (LastPage) - должен быть включен двойной проход у отчета;нечетные страницы (OddPages);четные страницы (EvenPages);повторение печати бэнда (RepeatedBand). Возникает при печати бэнда, если у негоустановлен флаг "Повторять на каждой странице";единственная страница (SinglePage) - должен быть включен двойной проход у отчета.
По умолчанию значение этого свойства равно FirstPage, LastPage, OddPages, EvenPages,
RepeatedBand, SinglePage. Это означает, что объект будет напечатан на всех страницах
отчета. В случае, если отчет состоит из единственной страницы, печать объекта
определяется только наличием флага SinglePage.
Приведем несколько типичных примеров использования этого свойства:Значение свойстваГде будет напечатан объект

FirstPageТолько на первой странице.

LastPage, OddPages,
EvenPages, RepeatedBandНа всех страницах, кроме первой.

FirstPage, OddPages,
EvenPages, RepeatedBandНа всех страницах, кроме последней.

RepeatedBandТолько на бэндах, которые повторяются накаждой странице.

FirstPage, LastPage,
OddPages, EvenPages

На всех бэндах, кроме тех, что повторяются накаждой странице.

FirstPage, LastPage,
OddPages, RepeatedBandТолько на нечетных страницах.

FirstPage, LastPage,
EvenPages, RepeatedBandТолько на четных страницах.

Например, чтобы напечатать разный текст на четных и нечетных страницах, положите набэнд два объекта "Текст" и настройте их следующим образом:первый объект будет печататься на нечетных страницах. Установите его свойство
PrintOn = FirstPage, LastPage, OddPages (т.е. все значения, кроме EvenPages).
второй объект будет печататься на четных страницах. Установите его свойство PrintOn= FirstPage, LastPage, EvenPages (т.е. все значения, кроме OddPages).
Объекты можно расположить друг над другом или иным образом. Они никогда не будут
печататься одновременно.

Построение отчетов

95Аналогичное свойство есть и у бэндов. Чтобы создать два экземпляра бэнда, которые
печатаются на разных страницах, используйте бэнд "Дочерний". Его можно прикрепить клюбому бэнду в окне "Настройка бэндов". Настройте главный и дочерний бэнды
следующим образом:главный бэнд будет печататься на нечетных страницах. Установите его свойство PrintOn= FirstPage, LastPage, OddPages (т.е. все значения, кроме EvenPages).
дочерний бэнд будет печататься на четных страницах. Установите его свойство PrintOn= FirstPage, LastPage, EvenPages (т.е. все значения, кроме OddPages).
Бэнды могут иметь разную высоту и разное содержимое. Рассмотрим пример, печатающий
разные заголовки страницы:96Построение отчетов

Группировка, итоги
Ранее мы рассматривали отчет типа "Главный-подчиненный", который печатал данные издвух связанных источников. FastReport позволяет создать отчет, который выглядит
аналогичным образом, но использует только один источник данных. Для этого
применяются группы.
Группа представляет собой набор из трех бэндов: "Заголовок группы", "Данные" и "Подвал
группы". В дизайнере это выглядит следующим образом:Группа всегда имеет заголовок и данные. Подвал группы является необязательным, выможете его удалить.
Для заголовка группы указывается условие группировки. Это может быть любое
выражение, но, как правило, это одно из полей источника данных. Сам источник данных
подключается к бэнду Данные". Печать группы выполняется следующим образом:1. Печатается заголовок группы.
2. Печатается строка данных.
3. Проверяется, не изменилось ли условие группировки.
4. Если условие не изменилось, печатается очередная строка данных (п.2).
5. Если условие изменилось, печатается подвал группы, и начинается печать новой группы
(п.1).
Допустим, у нас есть таблица Products со следующими данными:Построение отчетов

97Данные можно сгруппировать по полю CategoryName. Это поле будет печататься взаголовке группы. Сами данные представлены полем ProductName. Отчет может выглядеть
следующим образом:Если запустить отчет, получится следующее:98Построение отчетов

Создание группы
Добавить группу в отчет можно двумя способами.
Первый способ: вы добавляете бэнд "Заголовок группы" в окне "Настройка бэндов". Дляэтого в окне нажмите кнопку "Добавить" и выберите бэнд "Заголовок группы". FastReportдобавит группу к имеющемуся бэнду "Данные" или создаст группу целиком, если такого
бэнда в отчете нет:Построение отчетов

99Чтобы настроить группу, сделайте двойной щелчок на бэнде "Заголовок группы". Выувидите окно редактора группы:Вам необходимо указать условие группировки: это может быть любое выражение и полеисточника данных. Также укажите сортировку. По умолчанию данные сортируются повозрастанию.
Второй способ: вы используете мастер, который можно вызвать из меню "Отчет", выбрав
пункт "Мастер группировки...". Чтобы создать группу, введите условие группировки инажмите кнопку "Добавить":100Построение отчетов

Мастер добавит в отчет все элементы группы и объект "Текст" на заголовке группы, вкотором печатается условие группировки:Сортировка данныхДля правильной работы группы необходимо выполнение следующего условия:Источник данных должен быть отсортирован по тому полю, которое используется вусловии группировки.
Если это условие не выполняется, вы увидите множество одинаковых групп, содержащих
по 1-2 строки данных:Построение отчетов

101К счастью, в FastReport есть возможность отсортировать источник данных двумя
способами.
1. вы указываете порядок сортировки данных в редакторе группы. Источник данных
автоматически сортируется по условию группировки;2. вы указываете сортировку в редакторе бэнда "Данные", который входит в группу.
Оба способа равнозначны, однако удобнее использовать первый способ - при создании
группы вы указываете группировку и сортировку данных в одном диалоге.
В некоторых случаях использовать первый способ нельзя. Допустим, мы задаем
группировку по первой букве названия продукта. При этом продукты будут отсортированы
только по первой букве, что нежелательно. В данном случае нужно воспользоваться
вторым способом и указать сортировку по полному названию продукта.

Вложенные группы
Вложенная группа имеет несколько бэндов "Заголовок группы". Последний бэнд содержитв себе бэнд "Данные":Каждый заголовок группы имеет свое собственное условие группировки.

102Построение отчетов

Создать вложенную группу можно теми же способами, что и обычную. В первом случае высоздаете простую группу, а затем добавляете вложенную группу в окне "Настройка
бэндов". Для этого выделите существующий заголовок группы, нажмите кнопку
"Добавить" и добавьте бэнд "Заголовок группы". Он будет добавлен к имеющейся группе:После этого вызовите редактор у добавленной группы и укажите условие группировки.
Во втором случае вы используете уже рассмотренный нами мастер группировки. Укажите
условие группировки и нажмите кнопку "Добавить". Мастер добавит новую группу к ужеимеющейся.
Печать вложенной группы мало чем отличается от печати обычной. При печати данных
проверяются условия группировки у всех уровней группы. Если условие изменилось,соответствующая группа закрывается и начинается печать новой группы.

Построение отчетов

103Управление группамиДля управления группами используйте мастер группировки, который можно вызвать изменю "Отчет|Мастер группировки...":

С помощью мастера вы можете добавить или удалить группу, а также поменять порядок
группировки, используя кнопкии. С помощью кнопки "Изменить..." можно
изменить условие группировки у выбранной группы.

Печать итоговых значений
Группировка часто используется для печати каких-либо итоговых значений в каждой
группе. Например, это может быть количество строк в группе или сумма по одному изполей данных. Для печати таких значений используются итоги. Использование итогов
подробно описано в главе "Данные".
Чтобы напечатать итоговое значение в группе, вам необходимо сделать следующее:создайте итог, выбрав в окне "Данные" пункт "Действия|Новый итог";в качестве строки данных укажите бэнд "Данные", который входит в группу;в поле "Печатать на бэнде" укажите бэнд - подвал группы;положите объект "Текст", который печатает значение итога, на подвал группы.
Например, для печати количества строк в каждой группе настройка итога будет выглядеть
примерно так:104Построение отчетов

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

105

Повторение заголовков и подваловУ заголовка и подвала группы имеется свойство "Повторять на каждой
странице" (RepeatOnEveryPage). Оно может быть полезным, если в группе много строк, иони не помещаются на одной странице готового отчета. Используя это свойство, можно
напечатать заголовок/подвал группы на каждой странице, которую занимает группа.
При работе свойства "Повторять..." печатается заголовок, у которого установлен флаг"Повторение" (Repeated). Это можно использовать для печати разных объектов на обычном
заголовке группы и на повторении, например, печатать строку "Продолжение" на новой
странице. Для этого используется свойство PrintOn объекта "Текст" (подробно онорассмотрено в разделе "Многостраничный отчет типа "Буклет").
Чтобы напечатать разный текст, положите на заголовок группы два объекта, один наддругим:первый объект будет печататься на обычных заголовках. У него надо установить
значение свойства PrintOn = FirstPage, LastPage, OddPages, EvenPages (т.е. вседоступные значения, кроме RepeatedBand);второй объект будет печататься только на повторяющихся заголовках. У него надоустановить свойство PrintOn = RepeatedBand и добавить текст "продолжение".
В результате будет напечатан отчет следующего вида:106Построение отчетов

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

107Свойства группы
Рассмотрим свойства группы, которые имеются у бэнда "Заголовок группы".
Свойство "Формировать новую страницу" (StartNewPage) позволяет сформировать
новую страницу перед печатью группы. Таким образом, каждая группа будет расположенана новой странице.

Для самой первой группы новая страница сформирована не будет. Это сделано для того,чтобы избежать пустой первой страницы.

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

108Построение отчетов

Вложенные отчеты
Иногда в определенном месте основного отчета требуется вывести дополнительные
данные, которые могут представлять собой отдельный отчет с довольно сложной
структурой. Можно попробовать решить эту задачу, используя богатый набор бэндов
FastReport. Однако в некоторых случаях предпочтительнее использовать объект
"Вложенный отчет".
Объект "Вложенный отчет" представляет собой обычный объект отчета, который можно
положить на один из бэндов. При этом FastReport добавит в отчет дополнительную
страницу и свяжет ее с объектом вложенного отчета. На этой странице можно создать
дополнительный отчет, имеющий любую структуру.
При печати отчета, в котором имеется объект "Вложенный отчет", будет сделано
следующее:1. будет печататься главный отчет, пока не встретится объект "Вложенный отчет";2. будут печататься бэнды вложенного отчета;3. будет продолжена печать основного отчета.

Поскольку вложенный отчет формируется на листе основного отчета, он не может
содержать следующих бэндов: "Заголовок/Подвал отчета", "Заголовок/Подвал/Фонстраницы", "Заголовок/Подвал колонки".

Режимы печати
Вложенный отчет может печататься в двух режимах.
Первый режим печати - основной. В этом режиме бэнды и объекты вложенного отчета
печатаются на странице основного отчета. Имеются ограничения на размещение объектовна бэнде, который содержит вложенный отчет:объект "Вложенный отчет" должен находиться у нижней границы бэнда;нельзя размещать другие объекты ниже объекта "Вложенный отчет". При работе отчета
такие объекты будут перекрыты объектами вложенного отчета:Для размещения других объектов ниже вложенного отчета используйте бэнд "Дочерний".
Его можно прикрепить к основному бэнду и разместить объекты следующим образом:Второй режим печати отличается тем, что вложенный отчет печатается на бэнде, который
содержит объект "Вложенный отчет". Включить этот режим можно из контекстного менюобъекта "Вложенный отчет", выбрав пункт "Печатать на родителе". Этот режим ненакладывает ограничений на размещение объектов. Кроме того, в этом режиме
родительский бэнд может расти и сжиматься в зависимости от того, сколько данных
напечатано во вложенном отчете.

Построение отчетов

109

Единственная неприятность, связанная с этим режимом работы - данных во вложенном
отчете может быть много. При его печати получится большая высота у родительского
бэнда. Чтобы корректно напечатать такой бэнд, придется применить разрыв егосодержимого (свойство "Может разрываться"). Алгоритм разрыва не обеспечивает 100%качества и в некоторых случаях может привести к смещению объектов.

Печать нескольких отчетов рядом (side-by-side)Расположив рядом два объекта "Вложенный отчет", можно напечатать два независимых
списка данных, которые будут располагаться рядом. При печати такого отчета FastReportдействует следующим образом:печатается основной отчет до тех пор, пока не встретится объект "Вложенный отчет";печатается первый вложенный отчет;происходит переход на страницу, где начиналась печать вложенного отчета, ипечатается следующий вложенный отчет;после того как напечатаны все вложенные отчеты, продолжается печать основного
отчета с того места, где закончилась печать самого длинного вложенного отчета.

Несколько уровней вложенностиНа страницу вложенного отчета можно поместить объект "Вложенный отчет", увеличив темсамым уровень вложенности. Количество уровней вложенности формально ничем неограничивается, однако не следует этим увлекаться. Многократно вложенные отчеты
довольно сложны для понимания. Если у вас есть возможность, используйте для печати
вложенных данных бэнды FastReport. Напоминаем, что бэнд "Данные" может иметь одинили несколько вложенных бэндов "Данные", и так далее. Таким образом, для печати
отчетов типа master-detail или master-detail-subdetail нет необходимости использовать
вложенные отчеты.

110Построение отчетов

Табличные отчеты
Объект "Таблица" состоит из строк, колонок и ячеек и представляет собой упрощенный
аналог таблицы Microsoft Excel. Он выглядит следующим образом:Настройка колонокВы можете удалить или вставить колонки с помощью контекстного меню. Для этого:выделите таблицу или любой ее элемент и поместите указатель мыши над нужной
колонкой. Форма указателя поменяется на маленькую черную стрелку:нажмите левую кнопку мыши, чтобы выделить колонку;нажмите правую кнопку мыши, чтобы показать контекстное меню колонки;если вам нужно выделить несколько соседних колонок, нажмите левую кнопку и, неотпуская ее, двигайте мышь влево или вправо, чтобы выделить соседние колонки.
Контекстное меню колонки можно также вызвать в окне "Дерево отчета". Откройте окно,выделите нужную колонку и нажмите правую кнопку мыши.
В контекстном меню колонки вы можете выполнить следующие действия:Построение отчетов

111

Управление размером колонокВы можете указать ширину колонки одним из следующих способов:выделите таблицу или любой ее элемент и поместите указатель мыши на границе между
двумя колонками. Форма указателя поменяется на горизонтальный разделитель:Нажмите левую кнопку мыши и потяните мышь, чтобы изменить размеры колонки;выделите колонку и укажите нужную ширину в свойстве "Ширина" (Width). Это свойство
доступно в окне "Свойства".
Вы также можете включить свойство колонки "Авторазмер" (AutoSize). При запуске отчета
ширина колонки будет подобрана автоматически. Для того чтобы ограничить ширину
колонки, можно указать свойства "Минимальная ширина" (MinWidth) и "Максимальная
ширина" (MaxWidth).
Ширина колонки не должна быть больше, чем ширина страницы.

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

Управление размером строкВы можете указать высоту строки одним из следующих способов:выделите таблицу или любой ее элемент и поместите указатель мыши на границе между
двумя строками. Форма указателя поменяется на вертикальный разделитель:Нажмите левую кнопку мыши и потяните мышь, чтобы изменить размеры колонки;выделите строку и укажите нужную высоту в свойстве "Высота" (Height). Это свойство
доступно в окне "Свойства".
Вы также можете включить свойство строки "Авторазмер" (AutoSize). При запуске отчета
высота строки будет подобрана автоматически. Для того чтобы ограничить высоту строки,можно указать свойства "Минимальная высота" (MinHeight) и "Максимальная
высота" (MaxHeight).
Высота строки не должна быть больше, чем высота страницы.

Настройка ячеек
Ячейка представляет собой текстовый объект. По сути, класс ячейки наследуется отобъекта "Текст". Все, сказанное выше про объект "Текст", относится и к ячейке таблицы.
Редактировать текст ячейки можно так же, как объект "Текст". Кроме того, вы можете
перетащить (drag&drop) элемент из окна "Данные" внутрь ячейки.
Рамка и заливка ячеек могут быть настроены с помощью панели инструментов "Рамка изаливка".
Чтобы вызвать контекстное меню ячейки, щелкните на ней правой кнопкой мыши. Вконтекстном меню вы можете выполнить следующие действия:Построение отчетов

113

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

Для того чтобы разбить ячейку, вызовите ее контекстное меню и выберите пункт "Разбить
ячейку".

Объекты в ячейкахВ ячейку можно добавлять другие объекты отчета, например, рисунки. Следующие
объекты добавлять в ячейку нельзя:"Таблица";"Матрица";"Вложенный отчет".
Для того чтобы добавить объект в ячейку, просто перетащите его внутрь ячейки. Выможете свободно перемещать объект между ячейками, а также вынести его обратно запределы таблицы.

114

Построение отчетов

Ячейка служит контейнером для помещенных в нее объектов. Это значит, что вы можете
использовать свойства "Стыковка" (Dock) и "Якорь" (Anchor) у объектов внутри ячейки.
Это позволит изменять размеры объектов при изменении размеров ячейки.

Печать таблицы
Таблица может быть напечатана в двух режимах.
Первый режим – обычный. Таблица печатается на своем бэнде и выглядит так же, как и вдизайнере. В этом режиме ширина таблицы не может быть больше, чем ширина страницы
отчета. Это режим печати таблицы по умолчанию.
Второй режим – динамический. В этом режиме таблица строится с помощью скрипта. Приэтом таблица-результат может отличаться от исходной таблицы так же, как готовый отчет
FastReport отличается от шаблона отчета. В динамическом режиме таблица может растикак в ширину, так и в высоту, автоматически разбиваясь на страницы.
В данном режиме таблица не печатается на бэнде, на который она была положена. Вместо
этого она сама генерирует набор бэндов, которые содержат части таблицы-результата.
Этот режим работы накладывает следующие ограничения:не размещайте другие объекты под таблицей или рядом с ней. Вместо этого используйте
бэнд "Дочерний";не размещайте два объекта "Таблица" на одном бэнде.
Рассмотрим динамический режим работы более подробно.
Этот режим работы связан с программированием и требует повышенной квалификации отразработчика отчета.
Формирование таблицы выполняется с помощью скрипта. Чтобы создать скрипт, выделите
объект "Таблица", в окне "Свойства" нажмите кнопку "События" и сделайте двойной
щелчок на событии ManualBuild:Построение отчетов

115

При этом в код отчета добавится пустой обработчик события:private void Table1_ManualBuild(object sender, EventArgs e){}

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

Описание

PrintRow

int indexПечатает строку таблицы с указанным номером.
Нумерация строк начинается с 0.

PrintColumn

int indexПечатает колонку таблицы с указанным номером.
Нумерация колонок начинается с 0.

PrintRows

int[] indicesПечатает несколько строк таблицы.

PrintRows-Печатает все строки таблицы.

PrintColumns

int[] indicesПечатает несколько колонок таблицы.

PrintColumns-Печатает все колонки таблицы.

PageBreak-Вставляет разрыв страницы перед печатью очередной
строки или колонки.

Печать таблицы должна выполняться одним из двух способов.
Способ 1: печать сверху вниз, затем слева направо. Этот способ лучше подходит дляпечати таблицы с переменным количеством строк. Вы должны вызывать методы печати вследующей последовательности:PrintRow(номер строки);один или несколько вызовов метода PrintColumn(номер колонки) или PrintColumns(номера
колонок) для печати указанных колонок;либо один вызов метода PrintColumns() для печати всех колонок;повторяйте эту последовательность для печати всех нужных строк таблицы.
Каждая строка таблицы должна содержать одинаковое количество колонок. Имейте это в

116Построение отчетов

виду, когда пользуетесь методами PrintColumn(int index) и PrintColumns(int[] indices).
Способ 2: печать слева направо, затем сверху вниз. Этот способ лучше подходит дляпечати таблицы с переменным количеством колонок. Вы должны вызывать методы печати вследующей последовательности:PrintColumn(номер колонки);один или несколько вызовов метода PrintRow(номер строки) или PrintRows(номера строк)для печати указанных строк;либо один вызов метода PrintRows() для печати всех строк;повторяйте эту последовательность для печати нужных колонок таблицы.
Каждая колонка таблицы должна содержать одинаковое количество строк. Имейте это ввиду, когда пользуетесь методами PrintRow(int index) и PrintRows(int[] indices).
Нарушение порядка вызова методов печати приведет к ошибкам при выполнении отчета.
Так, одна из ошибок – попытка напечатать таблицу с помощью следующего кода:
Table1.PrintRows();
Table1.PrintColumns();Такая последовательность методов неправильная. Вы должны начинать печать таблицы сметода PrintRow или PrintColumn.

Печать сложных заголовков
Здесь имеются в виду заголовки, которые содержат объединенные ячейки. Когда
печатается строка или колонка таблицы, которая содержит объединенную ячейку, ячейка
увеличивается в размере автоматически. Покажем это на следующем примере:Создадим обработчик события ManualBuild, который будет печатать первую колонку 3 разаи вторую колонку 1 раз:private void Table1_ManualBuild(object sender, EventArgs e){// печатаем строку 0 и колонки 0, 0, 0, 1
Table1.PrintRow(0);Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(1);// печатаем строку 1 и колонки 0, 0, 0, 1
Table1.PrintRow(1);Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(1);Построение отчетов

117

}

Обратите внимание, что в каждой строке мы печатаем одинаковое количество колонок.
Если нарушить это правило, мы получим непредсказуемый результат.
В результате выполнения этого кода мы получим следующее:Как видно, заголовок растянулся автоматически. Немного усложним код, чтобы
распечатать две группы колонок:private void Table1_ManualBuild(object sender, EventArgs e){// печатаем строку 0 и две группы колонок 0, 0, 0, 1
Table1.PrintRow(0);// группа 1
Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(1);// группа 2
Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(1);// печатаем строку 1 и две группы колонок 0, 0, 0, 1
Table1.PrintRow(1);// группа 1
Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(1);// группа 2
Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(0);Table1.PrintColumn(1);}Запустим отчет на выполнение и увидим следующий результат:При печати второй колонки

118

Построение отчетов

Table1.PrintColumn(1);заголовок закрывается, и последующая печать первой колонки открывает новый
заголовок:// группа 2
Table1.PrintColumn(0);Печать итоговВ динамическом режиме объект "Таблица" поддерживает следующие итоговые функции:Функция

Параметры

Описание

Sum

TableCell cellВозвращает сумму значений, содержащихся в ячейке cell.

Min

TableCell cellВозвращает минимальное из значений, содержащихся вячейке cell.

Max

TableCell cellВозвращает максимальное из значений, содержащихся вячейке cell.

Avg

TableCell cellВозвращает среднее из значений, содержащихся в ячейке
cell.

Count

TableCell cellВозвращает количество строк, содержащих ячейку cell.

В обычном режиме печати (не динамическом) итоговые функции не работают.
Чтобы использовать итоговую функцию, поместите ее в ячейку таблицы. Например,следующая функция считает сумму значений в ячейке с именем Cell1:[Sum (Ce ll1)]При этом анализируются все ячейки, которые находятся выше и левее текущей (в котороймы печатаем итог).

Развертка таблицы
Таблица, которая формируется в динамическом режиме, может автоматически
разбиваться на страницы (как по ширине, так и по высоте). Вы можете выбрать один изтрех алгоритмов разбивки, за это отвечает свойство Layout таблицы:Значение

Описание

AcrossThenDownРазвертка сначала вбок, затем вниз.

DownThenAcrossРазвертка сначала вниз, затем вбок.

WrappedШирокая таблица выводится на одной странице.

Построение отчетов

119Примеры использования
Рассмотрим печать таблицы на примерах. В качестве шаблона будем использовать
следующий отчет:Выделите таблицу и создайте обработчик события ManualBuild.

Пример 1. Печать всей таблицы сверху внизprivate void Table1_ManualBuild(object sender, EventArgs e){// печатаем строку 0 и все ее колонки
Table1.PrintRow(0);Table1.PrintColumns();// печатаем строку 1 и все ее колонки
Table1.PrintRow(1);Table1.PrintColumns();// печатаем строку 2 и все ее колонки
Table1.PrintRow(2);Table1.PrintColumns();}В результате будет напечатана следующая таблица, которая не отличается от шаблона:Пример 2. Печать таблицы сверху вниз, с повторением строк
private void Table1_ManualBuild(object sender, EventArgs e){// печатаем строку 0 и все ее колонки
Table1.PrintRow(0);Table1.PrintColumns();// печатаем 3 экземпляра строки 1 и все ее колонки
for (int i = 0; i < 3; i++)120Построение отчетов

{
Table1.PrintRow(1);Table1.PrintColumns();}// печатаем строку 2 и все ее колонки
Table1.PrintRow(2);Table1.PrintColumns();}В этом примере средняя строка таблицы печатается 3 раза. В результате получается
следующее:Пример 3. Печать всей таблицы слева направо
private void Table1_ManualBuild(object sender, EventArgs e){// печатаем колонку 0 и все ее строки
Table1.PrintColumn(0);Table1.PrintRows();// печатаем колонку 1 и все ее строки
Table1.PrintColumn(1);Table1.PrintRows();// печатаем колонку 2 и все ее строки
Table1.PrintColumn(2);Table1.PrintRows();}

В результате будет напечатана следующая таблица, которая не отличается от шаблона:Построение отчетов

121

Пример 4. Печать таблицы слева направо, с повторением колонок
private void Table1_ManualBuild(object sender, EventArgs e){// печатаем колонку 0 и все ее строки
Table1.PrintColumn(0);Table1.PrintRows();// печатаем 3 экземпляра колонки 1 и все ее строки
for (int i = 0; i < 3; i++){Table1.PrintColumn(1);Table1.PrintRows();}// печатаем колонку 2 и все ее строки
Table1.PrintColumn(2);Table1.PrintRows();}

В этом примере средняя колонка таблицы печатается 3 раза. В результате получается
следующее:Пример 5. Печать таблицы с повторением строк и колонок
private void Table1_ManualBuild(object sender, EventArgs e){// --------- печатаем строку 0
Table1.PrintRow(0);// печатаем колонку 0
Table1.PrintColumn(0);// печатаем 3 экземпляра колонки 1
for (int i = 0; i < 3; i++)Table1.PrintColumn(1);// печатаем колонку 2
Table1.PrintColumn(2);// --------- печатаем 3 экземпляра строки 1
for (int j = 0; j < 3; j++){Table1.PrintRow(1);// печатаем колонку 0
Table1.PrintColumn(0);// печатаем 3 экземпляра колонки 1
for (int i = 0; i < 3; i++)Table1.PrintColumn(1);// печатаем колонку 2
Table1.PrintColumn(2);}122Построение отчетов

// --------- печатаем строку 2
Table1.PrintRow(2);// печатаем колонку 0
Table1.PrintColumn(0);// печатаем 3 экземпляра колонки 1
for (int i = 0; i < 3; i++)Table1.PrintColumn(1);// печатаем колонку 2
Table1.PrintColumn(2);}Обратите внимание, что в каждой строке мы печатаем одинаковое количество колонок.
Если нарушить это правило, мы получим непредсказуемый результат.
В этом примере средняя строка и средняя колонка таблицы печатается 3 раза. Врезультате получается следующее:Пример 6. Привязка к источникам данныхВо всех рассмотренных примерах мы печатали таблицу, которая содержит обычный текст.
В этом примере мы покажем, как сформировать таблицу, используя источник данных. Дляэтого создадим таблицу следующего вида:Создадим обработчик события ManualBuild, который будет делать следующее:получит ссылку на источник данных, определенный в отчете;инициализирует его (заполнит данными);распечатает строки таблицы столько раз, сколько записей в источнике данных.
Вот код обработчика:private void Table1_ManualBuild(object sender, EventArgs e){// получаем источник данных по его имени

Построение отчетов

123

DataSourceBase rowData = Report.GetDataSource("Products");// инициализируем его
rowData.Init();// печатаем заголовок таблицы
Table1.PrintRow(0);Table1.PrintColumns();// выполняем цикл, пока в источнике данных есть записи
while (rowData.HasMoreRows){// печатаем строку таблицы
Table1.PrintRow(1);Table1.PrintColumns();// переходим на следующую запись источника
rowData.Next();}// печатаем подвал таблицы
Table1.PrintRow(2);Table1.PrintColumns();}Примерно такие же действия выполняет FastReport при печати бэнда "Данные". Еслизапустить отчет, мы получим следующее:Пример 7. Вставка разрыва страницыДля вставки разрыва страницы используется метод PageBreak объекта "Таблица".
Вызывайте его перед тем, как напечатать очередную строку или колонку таблицы.
Рассмотрим использование метода PageBreak на примере 1. Сделаем так, чтобы третья
строка печаталась на новой странице.
private void Table1_ManualBuild(object sender, EventArgs e){// печатаем строку 0 и все ее колонки
Table1.PrintRow(0);Table1.PrintColumns();// печатаем строку 1 и все ее колонки
Table1.PrintRow(1);Table1.PrintColumns();124Построение отчетов

// делаем разрыв страницы
Table1.PageBreak();// печатаем строку 2 и все ее колонки
Table1.PrintRow(2);Table1.PrintColumns();}В результате будет напечатана такая таблица:Пример 8. Печать итогов
Рассмотрим использование итоговых функций на Примере 6. Модифицируем егоследующим образом:Если запустить отчет, мы получим следующее:Построение отчетов

125

Матричные (сводные) отчеты
Объект "Матрица" является разновидностью таблицы и, как и объект "Таблица", состоитиз строк, колонок и ячеек. Причем заранее неизвестно, сколько строк и столбцов будет вматрице - это зависит от данных, к которым она подключена.
Объект выглядит следующим образом:При печати матрица заполняется значениями и растет как вниз, так и вбок. Результат
может выглядеть следующим образом:Немного теории
Рассмотрим элементы матрицы:На рисунке мы видим матрицу с двумя строками и четырьмя столбцами. Здесь a, b –заголовки строк, 1, 2, 3, 4 – заголовки столбцов, a1..a4, b1..b4 – ячейки. Чтобы построить
такой отчет, понадобится всего один набор данных (запрос или таблица), который имееттри поля и содержит следующие данные:
a
a
a
a
b
b
b
b

1
2
3
4
1
2
3
4

a1
a2
a3
a4
b1
b2
b3
b4

Как видно, первое поле содержит номер строки, второе – номер столбца, третье –содержимое ячейки на пересечении строки и столбца с указанным номером. Припостроении отчета FastReport создает в памяти матрицу и заполняет ее данными. Приэтом матрица динамически расширяется, если строки или столбца с заданным номеромеще не существует.

126Построение отчетов

Заголовки могут иметь более одного уровня. Рассмотрим следующий пример:В этом примере номер, или индекс, столбца – составной, т.е. состоит из двух значений.
Этот отчет требует следующих данных:
a
a
a
a
b
b
b
b

10
10
20
20
10
10
20
20

1
2
1
2
1
2
1
2

a10.1
a10.2
a20.1
a20.2
b10.1
b10.2
b20.1
b20.2

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

Настройка структуры
После того, как вы положили на лист отчета новый объект "Матрица", он выглядит
следующим образом:Настройка структуры матрицы выполняется с помощью мыши. Для этого перетаскивайте
(drag&drop) поля источников данных из окна "Данные" на матрицу, чтобы создать строки,колонки и ячейки. Матрица подсвечивает место, куда будут вставлены новые данные,красной рамкой:Построение отчетов

127

Если в матрице уже есть элементы (заголовки, ячейки), то при вставке нового элемента
показывается индикатор. В данном случае новое поле будет вставлено между полями Yearи Name:Вы также можете изменить порядок существующих элементов. Для этого щелкните
мышкой на элементе и перетащите его на новое место, взяв его за рамку:Для удаления элемента выберите его мышкой и нажмите клавишу Delete.

128Построение отчетов

Настройка заголовкаДля настройки элемента заголовка выделите его и нажмите правую кнопку мыши, чтобы
показать контекстное меню:По умолчанию данные в заголовке матрицы сортируются по возрастанию. Вы можете
поменять порядок сортировки, выбрав пункт "Сортировка" в меню.
К каждому полю, которое вы помещаете в заголовок матрицы, FastReport добавляет итог(это ячейка с текстом "Итого"). Вы можете удалить итог, выделив его и нажав клавишу
Delete. Чтобы включить итог снова, выделите элемент, к которому он относится, и вконтекстном меню выберите пункт "Итоги".
Пункт меню "Формировать новую страницу" позволяет добавить разрыв страницы припечати матрицы. Если включить разрыв у ячейки Year, как показано на рисунке выше, топри печати матрицы каждый год будет расположен на отдельной странице.
Пункт меню "Подавлять итоги" позволяет подавлять строку итогов в случае, если вгруппе, по которой считается итог, есть только одно значение.

Настройка ячеекДля ячеек матрицы можно выбрать функцию, которая будет использована при расчете
итогов. Ее значение будет выведено в строках и столбцах итогов. Ниже приведен список
функций, которые можно использовать:Функция

Описание

НетЗначения ячеек не обрабатываются.

СуммаВозвращает сумму значений в ячейках матрицы.

Минимум

Возвращает минимальное из значений.

Максимум

Возвращает максимальное из значений.

Среднее

Возвращает среднее значение.

Количество

Возвращает количество непустых значений.

Построение отчетов

129

Для ячеек, добавляемых в матрицу, по умолчанию используется функция суммирования.
Вы можете выбрать другую функцию, выделив ячейку и выбрав в ее контекстном менюпункт "Функция":Выберите функцию "Нет", если вы не собираетесь печатать итоги по данной ячейке.
В матрице может быть одна или несколько ячеек данных. Если ячеек несколько, они могут
располагаться рядом или друг под другом. За это отвечает свойство матрицы "Ячейки
одной строкой", которое можно поменять из контекстного меню. Вы также можете выбрать
порядок расположения ячеек при добавлении второй ячейки в матрицу. При этомориентируйтесь на красные индикаторы, которые показывают, куда будет добавляться
второе значение - вверх-вниз или вправо-влево:После того как вы добавили второе значение, все последующие значения будут
добавляться в выбранном направлении.

Настройка внешнего видаЧтобы изменить внешний вид ячеек матрицы, щелкните на нужной ячейке. С помощью
панели инструментов можно изменить настройки шрифта, рамки и заливки. Ячейка
матрицы представляет собой наследник объекта "Текст", и к ней применимо все,сказанное ранее про этот объект.
Чтобы изменить оформление сразу нескольких ячеек, выделите группу ячеек. Для этого
выделите левую верхнюю ячейку, и, не отпуская кнопки мыши, тяните мышь, чтобы
выделить группу:130Построение отчетовВы также можете выбрать один из стилей для изменения внешнего вида всей матрицы.
Для этого щелкните на объекте правой кнопкой мыши и в контекстном меню выберите
стиль:

Управление размерами строк и колонокТак как матрица является разновидностью объекта "Таблица", она позволяет задавать
размеры строк и колонок аналогичным образом.
По умолчанию у матрицы включен режим "Авторазмер". В этом режиме объект самподбирает ширину колонок и высоту строк в зависимости от содержащихся в них данных.
Вы также можете управлять размером объекта вручную. Для этого выключите свойство
"Авторазмер" у матрицы. У строк и колонок есть аналогичное свойство; его можно
использовать, если авторазмер у матрицы отключен.
Чтобы ограничить минимальную и максимальную высоту строки, выберите строку и в окне"Свойства" укажите значения свойств MinHeight и MaxHeight.
Чтобы ограничить минимальную и максимальную ширину колонки, выберите колонку и вокне "Свойства" укажите значения свойств MinWidth и MaxWidth.

Построение отчетов

131

Примеры использования
Рассмотрим примеры использования объекта "Матрица". Для начала, создайте новый отчети положите объект "Матрица" на бэнд "Заголовок отчета" (или бэнд "Данные", в этомслучае подключать бэнд к источнику данных не надо). В данном случае неважно, на какойиз этих двух бэндов вы положите матрицу, т.к. оба бэнда будут печататься один раз призапуске отчета. Отчет будет выглядеть следующим образом:Не кладите объект на бэнды, которые будут печататься на каждой новой странице "Заголовок страницы", "Подвал страницы" и т.п. Матрица в этом случае будет строиться
каждый раз при печати бэнда, что приведет к переполнению стека и аварийному
завершению работы программы.
Большинство из примеров будут использовать таблицу MatrixDemo, которая поставляетсяв комплекте FastReport. Эта таблица содержит следующие данные:
Name

Year

Month

ItemsSold

RevenueNancy Davolio

1999

2

1

1000

Nancy Davolio

1999

11

1

1100

Nancy Davolio

1999

12

1

1200

Nancy Davolio

2000

1

1

1300

Nancy Davolio

2000

2

2

1400

Nancy Davolio

2001

2

2

1500

Nancy Davolio

2001

3

2

1600

Nancy Davolio

2002

1

2

1700

Andrew Fuller

2002

1

2

1800

Andrew Fuller

1999

10

2

1900

Andrew Fuller

1999

11

2

2000

Andrew Fuller

2000

2

2

2100

Janet Leverling

1999

10

3

3000

Janet Leverling

1999

11

3

3100

Janet Leverling

2000

3

3

3200

Steven Buchanan

2001

1

3

4000

Steven Buchanan

2001

2

4

4100

132

Построение отчетовSteven Buchanan

2000

1

4

3999

Пример 1. Простая матрица
Матрица будет содержать одно значение в строке и колонке и одну ячейку данных. Длятого чтобы построить матрицу, добавьте поля источника данных MatrixDemo следующим
образом:поле Year добавьте в заголовок строки;поле Name добавьте в заголовок колонки;поле Revenue добавьте в ячейку матрицы.
После этого матрица будет выглядеть следующим образом:Давайте улучшим внешний вид матрицы следующим образом:в верхний левый угол автоматически добавилось имя поля, которое содержится встроке матрицы. Вместо "Year" напишем слово "Год";выберем для матрицы стиль "Оранжевый";выберем шрифт "Tahoma, 8" для всех ячеек матрицы;ячейки со словом "Итого" выделим жирным шрифтом;для ячеек в верхней строке таблицы выберем заливку типа "Стекло";отключим авторазмер у матрицы и увеличим размеры строк и колонок.
После этого матрица будет выглядеть так:Запустите отчет на построение, и вы увидите следующий результат:В матрице не хватает следующих вещей:нет названия для поля Name;суммы печатаются не в денежном формате.
Добавить название для поля Name можно следующими способами:Построение отчетов

133в левый верхний угол матрицы можно поместить текст "Год/Сотрудник";туда же можно поместить диагональную линию и второй объект "Текст", как показано нарисунке ниже:можно включить верхнюю строку заголовка матрицы. Для этого в контекстном менюобъекта "Матрица" выберите пункт "Заголовок матрицы". В заголовок можно помещать
любой текст:Для того чтобы задать денежный формат для ячеек матрицы, выделите всю область ячеек,как показано на рисунке, и установите формат, выбрав пункт "Формат данных..." вконтекстном меню:После этого готовый отчет будет выглядеть так:Пример 2. Многоуровневые заголовки
Матрица будет содержать одно значение в строке, два значения в колонке и одну ячейку
данных. Возьмем за основу предыдущий пример и добавим в него поле:поле Month добавьте в заголовок строки справа от поля Year.
После добавления нового поля поправьте внешний вид матрицы. Также необходимо вновь
указать форматирование для ячеек. После этого матрица будет выглядеть следующим
образом:134Построение отчетов

Запустите отчет на выполнение, и вы увидите следующий результат:Пример 3. Печать названия месяца вместо номераВ предыдущем примере в матрице печатались номера месяцев. Это происходило потому,что в источнике данных поле Month содержит номер месяца, а не его название. Чтобы
напечатать название месяца, сделайте следующее:выберите ячейку, в которой печатается номер месяца. В нашем примере это ячейка сименем Cell8;в окне "Свойства" нажмите кнопкуи сделайте двойной щелчок на событии
BeforePrint;
FastReport добавит пустой обработчик события в скрипт отчета. Напишите следующий
код:
private void Cell8_BeforePrint(object sender, EventArgs e){
string[] monthNames = new string[] {"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь","Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" };// Cell8 - это ячейка, которая печатает номер месяца.
// Cell8.Value - это значение, которое печатается в ячейке (номер месяца).
// Это значение типа System.Object, поэтому его надо привести к intПостроение отчетов

135

Cell8.Text = monthNames[(int)Cell8.Value - 1];}Если запустить отчет на выполнение, вы увидите следующий результат:Пример 4. Условное выделениеДля ячеек матрицы, как и для объекта "Текст", можно задать условное выделение.
Подробнее об этом можно прочитать в разделе "Условное выделение".
Рассмотрим на примере 2, как выделить суммы больше 3000 красным цветом. Для этого
выберите ячейку с текстом Revenue и нажмите кнопкуна панели инструментов
"Текст". В редакторе условий задайте условие выделения:V a lue > 3000
и цвет текста - красный. Готовый отчет будет выглядеть так:136Построение отчетов

Как видно, итоговые значения не выделяются. Это происходит потому, что мы задали
условие выделения только для одной ячейки. Чтобы выделить остальные значения, надозадать условие для всех ячеек матрицы, как показано на рисунке.
В этом примере мы использовали условное выделение, которое зависит от значения самой
ячейки. Кроме того, можно выделить ячейку в зависимости от значений из заголовка
матрицы. Покажем на следующем примере, как выделить все суммы за 2000 год. Дляэтого выделите ячейки матрицы, как показано на рисунке:Задайте для ячеек такое условие выделения:(int )M a t rix1.Row V a lue s[0] == 2000
В данном случае Matrix1 - это имя нашей матрицы. Свойство матрицы RowValues имеет
тип object[] и содержит массив значений из заголовка строки, для текущей печатаемой
строки. В массиве столько значений, сколько уровней в заголовке. В нашем примере
массив имеет 2 значения, первое из которых - год, второе - месяц.
Не выделяйте последнюю строку. Свойство RowValues для нее имеет неопределенное
значение и вызовет ошибку в процессе построения отчета.
Если запустить отчет, мы получим следующий результат:Построение отчетов

137Вы также можете использовать свойство матрицы ColumnValues для обращения кзначениям колонок.

Пример 5. Выделение четных строкДля улучшения внешнего вида матрицы можно применить выделение четных строк иликолонок другим цветом. Покажем, как это сделать, на примере 2.
Выделите всю область данных матрицы, как показано на рисунке:Вызовите редактор условного выделения. В качестве условия задайте следующее:M a t rix1.Row Inde x % 2 != 0и укажите цвет фона чуть темнее, чем текущий. В данном примере Matrix1 - это имянашей матрицы; свойство RowIndex возвращает номер текущей печатаемой строки.
Для выделения колонок используйте свойство матрицы ColumnIndex аналогичным
способом.
Если запустить отчет, мы увидим следующее:138Построение отчетов

Пример 6. Использование выраженийВ предыдущих примерах мы создавали заголовки и ячейки матрицы, перетаскивая в нееполя из окна "Данные". Вы также можете использовать для этих целей выражения. Длятого, чтобы поместить выражение в матрицу, сделайте следующее:добавьте в матрицу какой-нибудь элемент из окна "Данные". Это может быть любой
элемент, например, системная переменная Date;сделайте двойной щелчок на элементе и укажите нужное выражение в окне редактора
выражений.
Если ваша матрица содержит выражения вместо полей данных, проследите за тем, чтобы
свойство матрицы DataSource было корректно заполнено. При работе с полями данных этосвойство заполняется автоматически, когда вы переносите поле на матрицу.
Рассмотрим использование выражений на примере. Для этого в качестве источника
данных будем использовать таблицу Order Details, которая содержит список проданных
товаров, сгруппированный по сотрудникам. Таблица содержит несколько родительских
связей, что позволяет получить доступ к имени сотрудника, наименованию товара и егокатегории.
Наша матрица будет показывать продажи каждого из сотрудников, сгруппированные покатегориям товаров. Чтобы построить матрицу, сделайте следующее:поле [Order Details.Products.Categories.CategoryName] добавьте в заголовок колонки;в заголовок строки добавьте любое поле, чтобы создать элемент матрицы. Затем
укажите следующее выражение для элемента заголовка:[Orde r De t a ils.Orde rs.Em ploy e e s.F irst Na m e ] + " " + [Orde r De t a ils.Orde rs.Em ploy e e s.
La st Na m e ]в ячейку данных добавьте любое поле, чтобы создать элемент матрицы. Затем укажите

Построение отчетов

139

следующее выражение для ячейки:[Orde r De t a ils.Unit Pric e ] * [Orde r De t a ils.Qua nt it y ] * (de c im a l)(1 - [Orde r De t a ils.Disc ount ])Почему в качестве имени сотрудника мы указали такое длинное поле данных, хотя имяможно получить из поля Employees.FirstName? Потому что матрица подключена кисточнику данных Order Details. Используя связи этого источника с другими таблицами,можно обращаться к их полям (подробнее о связях читайте в главе "Данные"). Еслиобратиться в нашем примере напрямую к полю Employees.FirstName, мы получим имяпервого сотрудника.
Задайте оформление для матрицы. После этого она будет выглядеть следующим образом:Если запустить отчет, мы увидим довольно большую матрицу, которая занимает 2 листа:Пример 7. Рисунки в ячейках
Ячейки матрицы наследуются от объекта "Текст" и могут отображать текстовые данные.
Если вам этого недостаточно, в ячейку можно положить любой объект. Рассмотрим, какпоказать рисунок в матрице.
Для этого возьмем за основу пример 6. Добавим в заголовки фотографию сотрудника
(поле таблицы Employees.Photo) и картинку категории (поле Categories.Picture). Сделайте
следующее:140Построение отчетов

увеличьте размер ячеек, содержащих имя сотрудника и название категории;добавьте в каждую из ячеек по одному объекту "Рисунок";чтобы показать фотографию сотрудника, укажите для объекта "Рисунок" следующее
поле данных (это можно сделать в редакторе объекта):Orde r De t a ils.Orde rs.Em ploy e e s.Phot oчтобы показать картинку категории, укажите для объекта "Рисунок" следующее поледанных:Orde r De t a ils.Produc t s.Ca t e gorie s.Pic t ureПосле этого матрица будет выглядеть так:Если запустить отчет, мы увидим следующее:Построение отчетов

141

Пример 8. Объекты в ячейках
Используя объекты, внедренные в ячейки матрицы, можно получить разнообразные
визуальные эффекты. Покажем на следующем примере, как нарисовать простую шкалу,показывающую уровень продаж сотрудника.
Матрица будет использовать источник данных MatrixDemo. Для того чтобы построить
матрицу, добавьте поля источника данных MatrixDemo следующим образом:поле Year добавьте в заголовок строки;поле Name добавьте в заголовок колонки;поле Revenue добавьте в ячейку матрицы.
Настройте внешний вид матрицы следующим образом:Теперь добавим в ячейку со значением Revenue 3 объекта "Фигура". Эти объекты будут
выполнять роль индикатора следующим образом:если значение в ячейке меньше 100, показывается один объект красного цвета;если значение в ячейке меньше 3000, показывается два объекта желтого цвета;если значение в ячейке больше или равно 3000, показывается три объекта зеленого
цвета.

142Построение отчетов

Матрица теперь выглядит так:Чтобы управлять состоянием объектов, создадим обработчик события BeforePrint ячейки
матрицы. Для этого выделите ячейку Revenue, в окне "Свойства" нажмите кнопку
исделайте двойной щелчок на событии BeforePrint. FastReport создаст пустой обработчик
события и переключится на закладку "Код". Напишите в обработчике следующий код:private void Cell4_BeforePrint(object sender, EventArgs e){// В нашем примере ячейка имеет имя Cell4.
// Получим значение ячейки, которое содержится в свойстве Cell4.Value.
// Часть ячеек в нашей матрице будут пустыми, учтем это (проверка на null).
// Значение надо привести к типу decimal, потому что исходное поле данных [MatrixDemo.Revenue]// имеет тип System.Decimal.
decimal value = Cell4.Value == null ? 0 : (decimal)Cell4.Value;// Shape1..3 - это объекты "Фигура"// Включаем или выключаем объекты в зависимости от значения:// один объект, если значение < 100; два, если оно < 3000; три, если оно >= 3000
Shape1.Visible = true;
Shape2.Visible = value >= 100;
Shape3.Visible = value >= 3000;// Выбираем цвет: красный < 100; желтый < 3000; зеленый >= 3000
Color color = Color.Red;if (value >= 100)color = Color.Yellow;
if (value >= 3000)
color = Color.GreenYellow;// устанавливаем цвет для всех трех объектов
Shape1.Fill = new SolidFill(color);
Shape2.Fill = new SolidFill(color);
Shape3.Fill = new SolidFill(color);}Если запустить отчет, мы увидим следующее:Построение отчетов

143

Пример 9. Заполнение матрицы вручнуюВо всех рассмотренных примерах матрица заполнялась данными автоматически, потомучто была привязана к источнику данных. Источник данных для матрицы указывается всвойстве DataSource. Хотя мы и не устанавливали значение этого свойства вручную, этопроисходило неявно при добавлении поля данных в матрицу.
Используя скрипт, можно заполнять матрицу вручную. Для этого надо создать обработчик
события ManualBuild матрицы. В коде обработчика надо вызывать метод AddValue длядобавления значения. Покажем на примере, как создать матрицу, которая будет печатать
таблицу 10х10 с значениями, расположенными по диагонали:
1
1
2
3

2

3

...

1
2
3

...

...

Выполните следующие действия:добавьте в отчет пустую матрицу;в строку, колонку и ячейку матрицы поместите любой элемент из окна "Данные". Затем
вызовите редактор выражения, сделав двойной щелчок на элементе матрицы, иочистите выражение;очистите свойство DataSource матрицы.
В результате матрица будет выглядеть следующим образом:Теперь создайте обработчик события ManualBuild. Для этого выделите матрицу, в окне"Свойства" нажмите кнопкуи сделайте двойной щелчок на событии ManualBuild.
FastReport создаст пустой обработчик события. Напишите в нем следующий код:private void Matrix1_ManualBuild(object sender, EventArgs e){// В нашей матрице 1 измерение в строке, колонке и ячейке данных.
// Создадим 3 массива типа object[], каждый с 1 элементом (по количеству измерений).
object[] columnValues = new object[1];object[] rowValues = new object[1];object[] cellValues = new object[1];for (int i = 1; i <= 10; i++){// Заполняем массивы
columnValues[0] = i;144Построение отчетов

rowValues[0] = i;cellValues[0] = i;// Добавляем данные в матрицу
Matrix1.AddValue(columnValues, rowValues, cellValues);}}В обработчике необходимо добавить нужные данные в матрицу с помощью метода
AddValue объекта "Матрица". Этот метод имеет три параметра, каждый из которых
является массивом значений типа object. Первый параметр – это значения колонки,второй – значения строки, третий – значения ячеек. Заметьте – количество значений вкаждом массиве должно соответствовать настройке объекта! В нашем случае объект
имеет по одному уровню в заголовках колонок, строк и ячеек – соответственно, мыпередаем в AddValue по одному значению для колонок, строк и ячеек.
Если запустить отчет на выполнение, мы увидим следующее:Покажем на примере, как добавить в матрицу значение "21" на пересечении колонки 7 истроки 3. Для этого измените код следующим образом:private void Matrix1_ManualBuild(object sender, EventArgs e){
object[] columnValues = new object[1];object[] rowValues = new object[1];object[] cellValues = new object[1];for (int i = 1; i <= 10; i++){columnValues[0] = i;
rowValues[0] = i;cellValues[0] = i;
Matrix1.AddValue(columnValues, rowValues, cellValues);}Построение отчетов

145

columnValues[0] = 7;
rowValues[0] = 3;
cellValues[0] = 21;
Matrix1.AddValue(columnValues, rowValues, cellValues);}В результате получится следующее:Как видно, матрица автоматически рассчитывает итоги по строкам и колонкам.
Вы можете использовать обработчик события ManualBuild для матрицы, которая
подключена к данным. В этом случае сначала вызывается обработчик события, затем
происходит заполнение матрицы данными из источника.

146Построение отчетов

Интерактивные отчеты
Готовый отчет FastReport можно сделать интерактивным. Это значит, что он будет
реагировать на действия пользователя (а именно, на нажатие кнопки мыши). Вы можете
использовать следующие виды взаимодействия:при нажатии на элемент отчета (бэнд или объект) выполняется какое-либо действие.
Например, строится детальный отчет и показывается в отдельном окне;сбоку окна просмотра отображается структура отчета, которую можно использоватьдля навигации по отчету.

ГиперссылкиВ этом разделе речь пойдет о свойстве "Гиперссылка" (Hyperlink), которое имеется
практически у всех объектов отчета, включая бэнды. Используя это свойство, можно
определить реакцию объекта на нажатие мыши в окне предварительного просмотра.
При нажатии на такой объект может быть выполнено одно из следующих действий:переход на адрес URL;
отсылка e-mail;выполнение какой-нибудь системной команды;переход на страницу отчета с указанным номером;переход на закладку, определенную в другом объекте отчета;запуск детального отчета в отдельном окне просмотра;реакция, определенная пользователем в скрипте.

Настройка гиперссылкиДля настройки гиперссылки выделите объект, который будет реагировать на нажатие
мыши, и щелкните на нем правой кнопкой мыши. В контекстном меню выберите пункт
"Гиперссылка...". Откроется окно редактора гиперссылки:Построение отчетов

147

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

Ссылка на адрес URL
Используя этот тип ссылки, вы можете:перейти на заданный адрес Интернет;выполнить какую-либо системную команду, например, "mailto:" для отправки
электронной почты.
При нажатии на ссылку этого типа выполняется команда System.Diagnostics.Process.Start,которой в качестве параметра передается значение ссылки.
Вы можете указать значение ссылки двумя способами:указать значение напрямую, например, "http://www.fast-report.com";указать выражение, которое возвращает значение ссылки. Это выражение будет
вычислено в момент построения отчета, когда обрабатывается данный объект.

148Построение отчетов

Ссылка на номер страницы
Используя этот тип ссылки, вы можете организовать навигацию по страницам готового
отчета. Чаще всего используется переход на первую страницу отчета. Для этого вкачестве значения ссылки укажите номер страницы (в данном случае 1).
Вы можете указать номер страницы двумя способами:указать номер напрямую, например, 1;указать выражение, которое возвращает номер страницы. Это выражение будет
вычислено в момент построения отчета, когда обрабатывается данный объект.

Ссылка на закладку
Используя этот тип ссылки, вы можете переходить на закладку, определенную в другом
объекте или программно.
Для тех, кто знаком с языком разметки HTML, достаточно упомянуть, что принцип работы
закладки такой же, как у якоря (anchor). Закладка имеет имя и определенную позицию вготовом отчете (номер страницы и позиция на странице). При переходе на закладку по ееимени вы перемещаетесь на указанную позицию.
Чтобы использовать этот тип ссылки, сначала нужно определить закладку. Чтобы этосделать, выделите объект отчета, на который вы хотите перейти при щелчке на ссылку.
Закладка есть практически у всех объектов отчета; ее значение указывается в свойстве
Bookmark. Изменить это свойство можно с помощью окна "Свойства".
Свойство Bookmark имеет тип "Выражение", которое вы можете использовать следующим
образом:указать имя закладки в виде строки, т.е. в апострофах:"М оя За кла дка "указать выражение, которое вернет имя закладки. Например, в качестве выражения
можно использовать поле данных. Значение выражения будет вычислено при запуске
отчета, в момент обработки данного объекта.
После того как закладка определена, вы можете указать ее имя в окне настройки
гиперссылки. Это можно сделать двумя способами:указать имя закладки напрямую;указать выражение, которое вернет имя закладки. Например, это может быть поледанных. Это выражение будет вычислено при запуске отчета, в момент обработки
данного объекта.

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

149

имя параметра в отчете, которому будет передано значение из гиперссылки;значение гиперссылки, которое надо передать в параметр отчета.

При нажатии на ссылку произойдет следующее:будет загружен указанный отчет;в параметр отчета будет передано значение гиперссылки;отчет будет построен и запущен в отдельном окне просмотра.
Значение параметра отчета можно указать двумя способами:указать значение напрямую;указать выражение, которое вернет значение. Это выражение будет вычислено призапуске отчета, в момент обработки данного объекта.

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

150Построение отчетов

При нажатии на ссылку произойдет следующее:в параметр отчета будет передано значение гиперссылки;указанная страница отчета будет построена и показана в отдельном окне просмотра.
Значение параметра отчета можно указать двумя способами:указать значение напрямую;указать выражение, которое вернет значение. Это выражение будет вычислено призапуске отчета, в момент обработки данного объекта.
Когда вы выбираете страницу отчета, ее свойство Visible сбрасывается в false. Этоозначает, что при построении основного отчета эта страница будет пропущена.

Прочая ссылка
Используя этот тип ссылки, вы можете определить собственную реакцию на нажатие
мыши. Для этого используется обработчик события "Click" объекта, который может бытьнаписан в скрипте отчета. Чтобы сделать это:выделите объект и откройте окно "Свойства";нажмите кнопку
, чтобы показать события объекта;сделайте двойной щелчок мышью на событии "Click". FastReport переключится на окно"Код" и создаст пустой обработчик события.

Построение отчетов

151В коде обработчика вы можете делать все, что считаете нужным. Вам, скорее всего,понадобится ссылка на объект, который вызвал обработчик, и параметры гиперссылки.
Используйте параметр обработчика sender:
private void Text2_Click(object sender, EventArgs e){// sender - это объект, который был кликнут.
// Чтобы получить значение гиперссылки, надо привести sender к типу ReportComponentBase.
object hyperlinkValue = (sender as ReportComponentBase).Hyperlink.Value;// здесь выполняем какие-либо действия, например, показываем значение в диалоге:MessageBox.Show("Hyperlink value = " + hyperlinkValue.ToString());}Структура отчета
Структура отчета (также известная как дерево отчета, оглавление) - это элемент
управления типа TreeView, который отображается в окне просмотра:Элемент управления показывает древовидную структуру, которая была сформирована приработе отчета. При щелчке на элементе дерева происходит переход на соответствующий
элемент отчета.
Если отчет имеет структуру, она будет показана автоматически. Показать или спрятать
структуру можно, нажав кнопкуна панели управления. Автоматически структура
отчета не создается; для этого вы должны настроить некоторые элементы отчета.
Для создания структуры используется свойство "OutlineExpression", которое имеется устраницы отчета и бэндов. В этом свойстве надо указать выражение, которое возвращает
текст элемента структуры. При печати бэнда, у которого установлено это свойство,происходит следующее:152

Построение отчетов

вычисляется значение выражения, которое указано в свойстве "OutlineExpression";в структуру отчета добавляется элемент с полученным текстом;при печати подчиненных бэндов (например, в отчете master-detail) структура отчета
формируется таким образом, что повторяет структуру бэндов.
Свойство "OutlineExpression" можно настроить в окне "Свойства", предварительно выделив
нужный бэнд.
Ниже приведены способы настройки структуры для печати разных типов отчетов:если вы хотите отобразить в структуре список страниц готового отчета, настройте
свойство "OutlineExpression" у страницы отчета. Как правило, выражение возвращает
номер страницы:[Pa ge N]в отчете типа "Список" с одним бэндом "Данные" настройте свойство "OutlineExpression" уэтого бэнда. В качестве выражения можно использовать любое поле данных, которое
печатается в бэнде;в отчете типа master-detail с двумя бэндами "Данные" настройте свойство
"OutlineExpression" у обоих бэндов. В качестве выражений используйте поля данных,которые печатаются в соответствующих бэндах. Например, в отчете типа "Категории/Продукты" выражение "OutlineExpression" для первого бэнда будет содержать название
категории, для второго - название продукта;в отчете с группой настройте свойство "OutlineExpression" у заголовка группы и бэнда
"Данные". В качестве выражения для заголовка группы обычно используется условие
группировки. Для бэнда "Данные" укажите одной из поле данных, которое печатается вэтом бэнде.

Построение отчетов

153

Примеры использования

Пример 1. Ссылка на веб-страницуВ этом примере мы создадим простой отчет с одним объектом "Текст". При нажатии наобъект в окне просмотра мы перейдем на веб-страницу FastReport.
Создайте новый отчет и добавьте в него объект "Текст". Напишите в нем следующий
текст:

Пе ре йт и на дом а ш ню ю с т ра ниц у F a st Re portЩелкните правой кнопкой мыши на объекте и выберите в контекстном меню пункт
"Гиперссылка...". Настройте ссылку следующим образом:После этого включите флажок "Изменить внешний вид объекта...", чтобы применить кобъекту атрибуты ссылки (синий цвет текста, подчеркивание и форма курсора в видеруки).
Запустите отчет и щелкните на объекте. Откроется окно веб-браузера, и вы попадете настраницу FastReport.

154Построение отчетов

Пример 2. Построение детального отчетаВ этом примере мы построим отчет - список категорий продуктов. При щелчке наназвании категории будет показан детальный отчет - список продуктов в данной
категории.
Вам необходимо сделать следующее:создать детальный отчет;определить в нем параметр - идентификатор категории;задать условие фильтрации строк данных в детальном отчете по этому параметру;создать основной отчет;в основном отчете настроить гиперссылку так, чтобы запускался детальный отчет спараметром, равным выбранной категории.
Сначала займемся созданием детального отчета, который печатает список продуктов. Дляэтого создадим новый отчет и выберем для него источник данных - таблицу Products.
Расположим объекты следующим образом:Для идентификации категории проще всего использовать значение поля CategoryID,которое имеется в обеих таблицах - Categories и Products. Создадим параметр отчета, спомощью которого будет передаваться выбранная категория. Настроим его следующим
образом:Теперь нужно указать условие фильтрации, с помощью которого будут отобраны всепродукты, относящиеся к выбранной категории. Для этого сделайте двойной щелчок набэнде "Данные" и на закладке "Фильтр" укажите следующее условие (его можно построить
визуально, нажав кнопку "fx" в правой части строки ввода):Построение отчетов

155На этом создание детального отчета завершено.
Приступим к созданию основного отчета. Для этого создайте новый отчет и выберите длянего источник данных - Categories. Расположите объекты следующим образом:Щелкните правой кнопкой мыши на объекте "Текст" и выберите пункт меню"Гиперссылка...". Настройте ссылку следующим образом:156

Построение отчетов

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

Построение отчетов

157

на отдельной закладке окна просмотра:Как видно на рисунке, в качестве текста закладки используется значение, передаваемоев параметр детального отчета. В нашем случае это поле CategoryID числового типа. Этовыглядит неинформативно и некрасиво. Можно переделать наш отчет так, чтобы
передавалось название категории. Для этого сделайте следующее:В детальном отчете:поменяйте тип параметра (свойство DataType) на String;добавьте в отчет источник данных - Categories. Он будет использован для обращения кполю CategoryName при фильтрации данных;поменяйте выражение фильтрации у бэнда "Данные":[Produc t s.Ca t e gorie s.Ca t e gory Na m e ] == [Se le c t e dCa t e gory ]В основном отчете:настройте гиперссылку так, чтобы передавать значение [Categories.CategoryName] впараметр "SelectedCategory".
Если запустить отчет теперь, мы увидим, что закладка детального отчета имеет текст сназванием категории, а не ее идентификатором. Теперь в детальный отчет можно

158Построение отчетов

добавить объект "Текст", который будет печатать название выбранной категории взаголовке отчета:В процессе работы над этим примером нам пришлось создать два отчета и переключаться
между ними несколько раз. Это не очень удобно. Для того чтобы облегчить задачу, можно
разместить два отчета в одном: основной отчет будет содержаться на первой странице,детальный - на второй. В этом случае гиперссылку надо настроить следующим образом:Построение отчетов

159

В данном случае надо выбрать страницу отчета, на которой содержатся объекты
детального отчета, а именно - Page2.

Пример 3. Интерактивный объект "Матрица"В этом примере мы рассмотрим, как построить детальный отчет, щелкнув на значение вячейке объекта "Матрица". В качестве примера мы будем использовать матрицу, которая
показывает объемы продаж сотрудников по годам.
В качестве источника данных для матрицы используется таблица MatrixDemo. В нейпредставлены продажи сотрудников, сгруппированные по году и месяцу:

Name

Year

Month

ItemsSold

RevenueNancy Davolio

1999

2

1

1000

Nancy Davolio

1999

11

1

1100

Nancy Davolio

1999

12

1

1200

Nancy Davolio

2000

1

1

1300

Nancy Davolio

2000

2

2

1400

Nancy Davolio

2001

2

2

1500

Nancy Davolio

2001

3

2

1600

160

Построение отчетов

Nancy Davolio

2002

1

2

1700

Andrew Fuller

2002

1

2

1800

Andrew Fuller

1999

10

2

1900

Andrew Fuller

1999

11

2

2000

Andrew Fuller

2000

2

2

2100

Janet Leverling

1999

10

3

3000

Janet Leverling

1999

11

3

3100

Janet Leverling

2000

3

3

3200

Steven Buchanan

2001

1

3

4000

Steven Buchanan

2001

2

4

4100

Steven Buchanan

2000

1

4

3999

На основе этих данных построим матрицу, которая печатает следующую информацию:в заголовке колонки печатается поле MatrixDemo.Year;в заголовке строки печатается поле MatrixDemo.Name;в ячейке печатается поле MatrixDemo.Revenue.
Готовая матрица выглядит следующим образом:Как видно, значения в ячейках представляют собой сумму продаж сотрудника за весь год.
Давайте сделаем так, чтобы при щелчке на ячейке матрицы показывался более подробный
отчет. Этот отчет должен давать ответ на вопрос - "откуда в ячейке матрицы взялось этозначение?". В нашем случае подробный отчет может содержать продажи выбранного
сотрудника за каждый месяц выбранного года.
Как связать ячейку с данными, на основе которых она была напечатана? Каждая ячейка
матрицы имеет адрес. Это совокупность значений из заголовка колонки и строки. В нашем
примере адрес ячейки - это совокупность года и имени сотрудника. Именно эти данные
можно передать в детальный отчет. Как это сделать? Очень просто: настройте
гиперссылку, указав только имя отчета и название параметра. Значение параметра
указывать не надо: для ячеек матрицы FastReport сам формирует значение и передаетего в параметр.
Предположим, мы щелкнули на верхней левой ячейке, содержащей число 3900. Это сумма
продаж сотрудника "Andrew Fuller" за 1999 год. В каком виде значение передается впараметр? FastReport комбинирует значение колонки и значение строки, используя точкус запятой в качестве разделителя:Построение отчетов

161

1999;Andre w F ulle rТо есть, в детальном отчете мы должны извлечь из этого значения год и имя сотрудника,преобразовать год в число, и эти значения использовать для фильтрации данных? Ничего
подобного! Все, что нужно сделать в детальном отчете - создать параметр, имеющий
вложенные параметры. Как это сделать, смотрите в главе "Данные". В данном случае
родительский параметр может выглядеть следующим образом:При создании параметра учитывайте следующие моменты:родительский параметр настраивать никак не нужно. Назовите его понятным для васименем, и все;родительский параметр должен иметь столько вложенных параметров, сколько значений
передается из матрицы. В данном случае передается два значения;порядок вложенных параметров соответствует порядку передаваемых из матрицы
значений. Напоминаем, что сначала передаются значения колонок, затем строк
матрицы. В нашем случае в первый параметр будет передан год, во второй - имясотрудника;вложенные параметры можно называть как угодно, но желательно давать им имена,совпадающие с именами полей из матрицы;очень важно правильно настроить тип данных для каждого вложенного параметра. Типданных должен соответствовать значению, которое передается в параметр. В нашем
случае первый параметр (год) должен быть целого типа (Int32), второй (имясотрудника) - строкового (String).
Итак, после того как мы прояснили все необходимые моменты, приступим к созданию
отчета. Выделите ячейку матрицы и вызовите редактор гиперссылки:В настройке гиперссылки вам нужно указать в качестве параметра родительский
параметр (в нашем примере - "SelectedCell"):162Построение отчетов

FastReport сам передаст значения во вложенные параметры SelectedCell.Year и
SelectedCell.Name. Эти значения будут преобразованы в тип данных, указанный внастройке параметра - вот почему так важно правильно настроить тип данных параметра.
Детальный отчет располагается на отдельной странице основного отчета и использует тотже источник данных, что и матрица - MatrixDemo:Осталось отфильтровать строки данных, чтобы показать продажи выбранного сотрудниказа выбранный год. Для этого откройте редактор бэнда "Данные" и укажите следующее
условие фильтрации:[M a t rixDe m o.Y e a r] == [Se le c t e dCe ll.Y e a r] && [M a t rixDe m o.Na m e ] == [Se le c t e dCe ll.Na m e ]Отчет готов. Запустите его на выполнение и щелкните на верхней левой ячейке.
Откроется детальный отчет, который содержит следующие данные:Построение отчетов

163

Как видно, сумма значений соответствует значению ячейки матрицы, на которой мыщелкнули.

Пример 4. Отчет с оглавлением, навигацией и структуройВ этом примере рассмотрим построение отчета, который имеет следующие особенности:на первой странице отчета располагается оглавление, или "Содержание", на элементы
которого можно нажимать для перехода к нужной странице;сбоку в окне просмотра отображается структура отчета, на элементы которой также
можно нажимать.

Отчет будет использовать данные из таблиц Categories и Products. В содержании будет
напечатан список категорий, в основной части отчета - список категорий и продуктов.
Шаблон отчета будет состоять из двух страниц: на первой странице будем печатать
содержание, на второй - основную часть отчета.
Сначала займемся оглавлением. Создайте новый отчет и добавьте в него источники
данных Categories и Products. Подключите бэнд "Данные" к таблице Categories ирасположите объекты следующим образом:164Построение отчетов

Чтобы сделать элементы содержания интерактивными, настройте их свойство
"Гиперссылка":В качестве закладки укажите имя категории. Сама закладка (свойство Bookmark) будет
определена нами позже у объектов на второй странице отчета.
Для того чтобы напечатать в содержании номер страницы, на которую мы ссылаемся спомощью закладки, нужно сделать следующее:включить у отчета двойной проход (это можно сделать в меню "Отчет|Свойства..."). Этонужно сделать, потому что страница с содержанием находится перед остальными
страницами. В момент печати содержания еще не известно, на каких страницах будут
напечатаны категории;использовать функцию Engine.GetBookmarkPage, которая возвращает номер страницы поимени закладки. В данном случае имя закладки содержится в поле [Categories.
CategoryName], поэтому вызов функции выглядит так:[Engine .Ge t Bookm a rkPa ge ([Ca t e gorie s.Ca t e gory Na m e ])]Построение отчетов

165

На второй странице отчета располагается отчет типа master-detail следующего вида:Нам надо настроить закладку, на которую будет совершен переход при нажатии наэлемент оглавления. Для этого выделите первый бэнд "Данные" и в его свойстве Bookmarkукажите следующее выражение:[Ca t e gorie s.Ca t e gory Na m e ]Для настройки структуры отчета сделайте следующее:выделите первую страницу (сам объекта "Страница"). Это можно сделать,переключившись на страницу;в окне "Свойства" задайте следующее значение свойства OutlineExpression:"Соде рж а ние "переключитесь на вторую страницу отчета;выделите первый бэнд "Данные" и настройте его свойство OutlineExpression:[Ca t e gorie s.Ca t e gory Na m e ]выделите второй бэнд "Данные" и настройте его свойство OutlineExpression:[Produc t s.Produc t Na m e ]Наследование отчетовПри разработке отчетов мы часто сталкиваемся с ситуацией, когда в каждом отчете
встречаются одни и те же данные - реквизиты предприятия, логотипы, одно и то жеоформление бланков и т.п. Теперь представьте себе, что таких отчетов - не одиндесяток, и возникает необходимость что-то поправить (например, поменялись реквизиты).
Придется открывать каждый отчет и вносить в него исправления. Для избежания подобных
ситуаций можно использовать наследование отчетов. Что это такое?
Допустим, у нас есть какие-то общие для всех отчетов элементы. Это может быть шапка
отчета с реквизитами и логотипом, подвал страницы. Их оформление стандартно длявашего предприятия и не меняется от отчета к отчету. Такие общие элементы можно
вынести в отдельный файл отчета (базовый отчет). В FastReport есть средства, которые

166Построение отчетов

позволяют создать новый отчет на основе базового отчета. При этом новый отчет будет
содержать все элементы базового плюс свои собственные.
Как такой подход поможет сэкономить время при масштабных изменениях? Очень просто:менять придется только базовый отчет! Все остальные отчеты, которые наследованы отбазового, автоматически "подхватят" изменения. Такое поведение обеспечивается
механизмом наследования - фактически, при открытии наследованного отчета сначала
загружается базовый отчет.

Создание отчетаДля использования наследования необходимо:создать базовый отчет и сохранить его в файл;создать отчет, наследованный от базового.
Для того чтобы создать наследованный отчет, выберите пункт меню "Файл|Новый..." и вокне выберите "Наследованный отчет":При этом вам будет предложено выбрать файл базового отчета, который к этому моменту
должен быть создан. После этого базовый отчет будет загружен в дизайнер, и в негоможно будет внести необходимые изменения. Как видно, объекты базового отчета
помечены значком "замок":Это означает, что такой объект нельзя удалить, переименовать или переместить на другой
бэнд.
Вы можете добавлять новые объекты или бэнды, изменять оформление, размеры и позициюуже существующих объектов. После того как вы внесли все изменения, сохраните отчет.

Построение отчетов

167

Изменение базового отчета
Посмотрим, что произойдет, если изменить базовый отчет. Вы можете:удалить объект в базовом отчете. Этот объект также будет удален из наследованного
отчета;добавить объект в базовый отчет. Этот объект добавится в наследованный отчет
автоматически. Учтите, что место, куда был добавлен объект в базовом отчете, может
быть занято в наследованном отчете;изменить размеры, позицию, текст, оформление объекта. Все изменения будут отраженыв наследованном отчете при условии, что этот объект в наследованном отчете неизменялся.
Последний пункт требует пояснений. Рассмотрим два примера использования. В первом
примере:создадим базовый отчет с объектом Text1;
создадим наследованный отчет, и, не изменяя позиции объекта Text1, сохраним отчет;в базовом отчете сдвинем объект Text1;
при открытии наследованного отчета мы увидим, что объект Text1 также сдвинулся.
Во втором примере:создадим базовый отчет с объектом Text1;
создадим наследованный отчет;сдвинем объект Text1 и сохраним отчет;в базовом отчете сдвинем объект Text1;
при открытии наследованного отчета мы увидим, что объект Text1 не сдвинулся.
Это произошло потому, что мы изменили объект базового отчета в наследованном. Этиизменения были записаны в файл наследованного отчета. Теперь все, что мы будем
делать с исходным объектом в базовом отчете, будет игнорировано в наследованном. Вданном примере будет игнорирована позиция объекта Text1. Все остальные изменения
свойств (например, изменение размера) по-прежнему будут отражаться в наследованном
отчете.
Принцип работы этого механизма станет понятен, если заглянуть в содержимое файла
наследованного отчета. Например, в таком виде сохраняется объект базового отчета,который не менялся в наследованном:<inhe rit e d Na m e ="T e xt 1"/>А в таком - при изменении позиции объекта:<inhe rit e d Na m e ="T e xt 1" Le ft ="255.15" T op="28.35"/>При открытии наследованного отчета в объект Text1 будут загружены все свойства,определенные в базовом отчете, плюс те, что изменились в наследованном.

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

наследовать отчет от другого наследованного отчета (т.е. применять двойное
наследование);использовать в базовом отчете сложные объекты типа "Таблица" и "Матрица";использовать скрипт в базовом отчете;использовать параметры в базовом отчете.

Построение отчетов

169

Отчеты с диаграммамиДля построения диаграмм в FastReport используется библиотека Microsoft Chart, которая
появилась на свет благодаря сотрудничеству Microsoft и Dundas (www.dundas.com). Этабиблиотека будет включена в состав будущей версии .Net Framework 4.0, а пока ееможно скачать отсюда:http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8910ae6ea442c
Библиотека требует для своей работы наличия .Net Framework 3.5 SP1. Она совершенно
бесплатна. С ее возможностями можно познакомиться, скачав демо отсюда:http://code.msdn.microsoft.com/mschartВкратце перечислим возможности библиотеки:более 30 видов диаграмм (гистограммы, области, линии, пузырьки, круговые,лепестковые, финансовые, пирамидальные, диапазоны);поддержка 3D;поддержка нескольких серий разных типов в одной диаграмме;полное управление внешним видом и поведением каждого элемента диаграммы.

Элементы диаграммы
Диаграмма Microsoft Chart состоит из следующих элементов:Одна диаграмма может иметь одну или несколько областей диаграммы. В каждой области

170Построение отчетов

может находиться одна или несколько серий. На рисунке ниже приведен пример
диаграммы, которая содержит две области (в первой области - две серии, во второй одна):Следует отметить, что некоторые типы серий (например, круговые) требуют, чтобы имбыла выделена отдельная область диаграммы.

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

171

Управление сериями
Объект "Диаграмма" может содержать одну или несколько серий. Список серий
отображается в левом верхнем углу редактора:Для добавления новой серии нажмите кнопку "Добавить...". Будет показано окно - галерея

172Построение отчетов

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

Настройка внешнего видаС помощью редактора вы можете настраивать внешний вид каждого элемента диаграммы.
Все настройки (а их общее количество свыше 100) разбиты на несколько категорий. Частьиз них относится к объекту "Диаграмма", другая часть - к серии.
При выборе элемента "Диаграмма" в списке серий, будут доступны следующие настройки:Построение отчетов

173

"Внешний вид" - рамка и заливка;"Область диаграммы" - рамка, заливка, тень;"Трехмерность" - настройки трехмерного вида;"Оси" - настройки внешнего вида оси, ее заголовка, подписей, сетки, насечек,дополнительных подписей, индикаторных полос;"Легенда" - стиль легенды, ее расположение, рамка, заливка, тень, шрифт;"Заголовок" - стиль текста, расположение, рамка, заливка, тень, шрифт.
При выборе серии в списке серий, будут доступны следующие настройки:174Построение отчетов

"Внешний вид" - настройки, специфичные для выбранного типа серии;"Рамка и заливка" - рамка и заливка для значений серии;"Подписи" - подписи к значениям. Здесь можно выбрать тип подписи, шрифт, цвет изаливку;"Маркеры" - маркеры значений. Здесь можно выбрать тип маркера, его цвет и рамку.

Подключение к данным
Заполнить объект данными можно с помощью нескольких способов:1. Подключить объект к источнику данных. Для этого в настройках элемента "Диаграмма"указывается источник данных, а в настройках серии - поля источника данных.
2. Указать список значений для серии вручную.
3. Заполнить объект данными, используя скрипт.
Для того чтобы подключить объект к источнику данных, проделайте следующие шаги:в списке серий выберите элемент "Диаграмма";переключитесь на закладку "Данные";выберите нужный источник данных:если необходимо, укажите условие фильтрации в поле "Фильтр". Фильтр будет примененко всем сериям;Построение отчетов

175в списке серий выберите серию;переключитесь на закладку "Данные";выберите колонки данных для значений серии. В зависимости от типа серии, количество
значений может варьироваться. Как правило, это два значения - для осей X и Y:если необходимо, укажите дополнительное условие фильтрации в поле "Фильтр". Фильтр
будет применен к текущей серии;в поле "Цвет" можно указать колонку данных, возвращающую цвет значения.
Если подключение к источнику данных не требуется, можно указать список значений
вручную. Для этого выберите серию в списке серий и переключитесь на закладку
"Значения". Заполните таблицу нужными значениями:Сортировка данныхПо умолчанию диаграмма отображает данные в том порядке, в каком они расположены висточнике данных. Вы можете изменить порядок сортировки, выбрав серию в списке серийи переключившись на закладку "Обработка данных":Вы можете выбрать один из режимов сортировки - не сортировать, по значению X или позначению Y, а также порядок сортировки (по возрастанию, по убыванию).

176Построение отчетов

Группировка данных
Часто возникают ситуации, когда в диаграмму попадают данные с одинаковым значениемпо оси X. Например, в таблице MatrixDemo, которая используется для демонстрации
возможностей диаграмм, данные представлены в таком виде:
Name

Year

Month

ItemsSold

Revenue

Andrew Fuller

2002

1

2

1800

Andrew Fuller

1999

10

2

1900

Andrew Fuller

1999

11

2

2000

Andrew Fuller

2000

2

2

2100

Janet Leverling

1999

10

3

3000

Janet Leverling

1999

11

3

3100

Janet Leverling

2000

3

3

3200

...
При попытке построить диаграмму, которая показывает продажи сотрудника (по оси X поле Name, по оси Y - поле ItemsSold) получится примерно такой результат:В диаграмму попали данные с одинаковыми значениями по оси X, что дало в итоге
неправильный результат. Чтобы исправить ситуацию, надо сгруппировать одинаковые
значения X (в данном случае - имена сотрудников), просуммировав результаты. Для этогов редакторе объекта выберите серию и переключитесь на закладку "Обработка данных".
Выберите тип группировки - по значению X, и выберите функцию группировки - "Сумма":В результате сотрудники с одинаковыми именами будут сгруппированы в одно значение,Построение отчетов

177их данные продаж - просуммированы. Получится следующий результат:Объединение значений
Этот инструмент обработки данных позволяет объединить несколько значений серии водно, используя те или иные критерии. Вы можете выбрать один из следующих вариантов
объединения:Вариант

Описание

Оставить N самых
большихВ серии остается N самых больших значений (количество Nзадается). Остальные значения суммируются и выводятся ввиде одного значения (заголовок для значения задается,обычно это "Прочие").

Оставить N самых
маленькихТо же, но в серии остается N самых маленьких значений.
Если текст заголовка для собранного значения не задан, этозначение не выводится.

Меньше чем значение

Значения серии, меньшие заданного значения,объединяются в одно.

Меньше чем процент

Значения серии, меньшие заданного процента от общего
количества, объединяются в одно.

Больше чем значение

Значения серии, большие заданного значения, объединяютсяв одно.

Больше чем процент

Значения серии, большие заданного процента от общего
количества, объединяются в одно.

Так, чтобы показать 5 самых больших значений, настройте серию следующим образом:178Построение отчетовВ результате получится примерно следующее:Выделение значенийДля круговых диаграмм можно настроить выделение сегментов диаграммы. Для этого
выберите серию в списке серий и переключитесь на закладку "Обработка данных":Доступны следующие режимы выделения: большее значение, меньшее значение,указанное значение. При выборе последнего режима предлагается указать значение,которое нужно выделить. Это может быть любое корректное с точки зрения FastReportвыражение. Например, чтобы выделить сотрудника Andrew Fuller, укажите следующее
значение:"Andre w F ulle r"При этом диаграмма будет выглядеть так:Построение отчетов

179

Настройка авто-серий
Диаграмму можно настроить таким образом, чтобы она создавала серии автоматически, взависимости от имеющихся данных. Для создания авто-серий нужно проделать
следующее:создать и настроить одну серию. Эта серия будет использована как образец длясоздания автоматических серий;у объекта "Диаграмма" указать колонку данных для авто-серии. Значение этой колонки
будет являться именем серии. Если серии с таким значением еще не существует, будет
автоматически создана новая серия.
Продемонстрируем создание авто-серий на примере. Используем таблицу MatrixDemo,чтобы получить график продаж сотрудников с разбивкой по годам. Одна серия будет
представлять один год. Для этого проделайте следующие шаги:подключите диаграмму к источнику данных MatrixDemo;создайте одну серию и настройте ее данные:на закладке "Обработка данных" выберите тип группировки - по значению X, так как внашем источнике данных есть строки с одинаковыми именами сотрудников;выделите диаграмму в списке серий и настройте создание авто-серий на закладке
"Данные":180Построение отчетовв разных сериях может оказаться разное количество значений (не у всех сотрудников
есть продажи за все года). Чтобы выровнять значения в сериях, включите флажок
"Выровнять значения по оси X".
В результате получится диаграмма следующего вида:Интерактивные диаграммы
Диаграмма, как и остальные объекты FastReport, поддерживает интерактивность. Выможете настроить диаграмму таким образом, чтобы при щелчке мышью на значении серии
открывался новый отчет с детальными данными по выбранному значению. Для этого надонастроить свойство "Гиперссылка", как описано в разделе "Интерактивные отчеты".
Значение в гиперссылку диаграмма подставляет сама, при щелчке на ее элементе.
Рассмотрим в качестве примера отчет "Interactive Chart" из демо FastReport.
Создайте отчет с двумя страницами. На первой странице будет находиться диаграмма, навторой - отчет типа "Список", который показывает список продаж выбранного сотрудника.
Эта страница будет строиться при щелчке на элементе диаграммы.
На первую страницу поместите диаграмму и настройте ее свойства в редакторе:выберите диаграмму и укажите источник данных - MatrixDemo;выберите серию и укажите значение X = [MatrixDemo.Name], значение Y = [MatrixDemo.
ItemsSold]:Построение отчетов

181на закладке "Обработка данных" выберите группировку по значению X:На второй странице разместите отчет типа "Список":в окне "Данные" создайте параметр отчета - SelectedEmployee;создайте отчет следующего вида:откройте редактор бэнда "Данные" и укажите фильтр:[M a t rixDe m o.Na m e ] == [Se le c t e dEm ploy e e ]Теперь настройте гиперссылку у объекта "Диаграмма". Для этого:вызовите контекстное меню объекта и выберите пункт "Гиперссылка...";
выберите тип ссылки - "Детальная страница отчета";выберите вторую страницу отчета и имя параметра - SelectedEmployee.
На этом создание отчета завершено. Запустите отчет и подведите указатель мыши ккакому-нибудь значению диаграммы. Значение будет визуально выделено, а курсор мышипоменяет форму:182Построение отчетов

Если кликнуть на значении, будет построен отчет, содержащий подробные данные овыбранном сотруднике:Построение отчетов

183

Отчеты с картами
Компонент "Карта" (MapObject) предназначен для отображения двумерных графических
карт в формате ESRI shapefile. Подробнее о формате можно прочитать здесь:http://ru.wikipedia.org/wiki/ShapefileДля работы необходимы файлы .shp (геометрия) и .dbf (описание).

Элементы карты
Объект "Карта" состоит из следующих элементов:Один объект "Карта" может отображать один или несколько слоев. Каждый слой содержит
отдельную карту.

Управление отображениемВ режиме дизайнера и в окне просмотра готового отчета вы можете управлять
отображением карты с помощью мыши:- колесо мыши меняет масштаб карты;- нажав левую кнопку мыши, можно двигать карту;- кликнув внутри полигона, можно настроить его свойства в окне "Свойства".

184Построение отчетов

Минимальное и максимальное значения масштабирования задаются в свойствах MinZoom,
MaxZoom. Эти значения можно задать в окне "Свойства".

В asp.net картой управлять нельзя.

Редактор карты
Объект "Карта" содержит большое количество настроек, которыми можно управлять,вызвав редактор объекта. Для этого сделайте двойной щелчок мышью на объекте иливыберите пункт "Редактировать..." в его контекстном меню:Построение отчетов

185

Добавление слоёв
Объект "Карта" может содержать один или несколько слоев. Список слоев отображается влевом верхнем углу редактора:Для добавления нового слоя нажмите кнопку "Добавить...". Будет показано следующее
окно:На этом шаге нужно выбрать тип слоя:- карта из файла shapefile (.shp/.dbf). Это наиболее часто используемый тип карт. Кпримеру, вы можете напечатать карту мира и выделить цветом страны, в которых продажи
были больше определенного значения;- картографические данные из приложения. Ваше приложение должно предоставлять
географические координаты (пару значений - широта и долгота), которые будут
отображены в виде точки на карте. Точка может иметь подпись, а также быть разного
размера и/или цвета, в зависимости от некоторых данных. На практике этот тип карты
используется в качестве второго слоя (первый слой, базовый, берется из файлов
shapefile). Например, базовый слой отображает карту какой-либо страны, а второй слой точки с названиями городов, в которых были продажи. Размеры и цвет точки можно
настроить таким образом, чтобы был понятен уровень продаж в данном городе.
Если вы выбрали слой на основе файлов shapefile, укажите дополнительно, как хранить
картографические данные:- данные внедряются в файл отчета. При этом отчет может сильно увеличиться вразмерах.
- файл отчета ссылается на файлы shapefile, внедрения не происходит. Этот режим
полезен, если у вас есть несколько отчетов, использующих одни и те же карты.

186

Построение отчетов

Карты большого объема (более 30Мб) или с большим количеством полигонов (более 20000)
серьезно замедлят работу отчета.

Настройка внешнего видаВнешний вид слоя можно настроить, выбрав слой и переключившись на закладку "Внешний
вид":Здесь можно настроить цвет и стиль рамки полигонов карты, а также выбрать цветовую
палитру. Если вы настроили выделение полигонов цветом в зависимости от аналитических
данных (об этом позднее), то палитра будет игнорирована.

Построение отчетов

187

Настройка отображаемых значенийНа карте могут отображаться надписи, например, названия стран на карте мира. Выможете настроить тип и внешний вид надписей на закладе "Надписи":Если выбран тип слоя - карта из файла shapefile, то необходимо указать поле, из которого
будет взята надпись. Как правило, это поле "NAME". Для карты мира, входящей в состав
демо-программы FastReport, можно выбирать из следующих полей:- NAME(например, Russia)- ABBREV (например, Rus.)- ISO_A2 (например, RU)- ISO_A3 (например, RUS)Для других карт список полей будет отличаться.
Если выбран тип слоя - картографические данные из приложения, то в этом окне можно
указать минимальное значение масштаба, при котором можно показывать надписи.
Значение по умолчанию - 1, что означает, что надписи будут показаны всегда.

188Построение отчетов

Подключение к данным
Большинство отчетов используют объект "Карта" не сам по себе, а для отображения
аналитической информации. Например, это может быть объем продаж в разных странах.
Для этого слой надо подключить к данным. Сделать это можно в редакторе карты, выбрав
слой и переключившись на закладку "Данные". Подключение к данным различается взависимости от типа слоя (из файла shapefile, или геоданные из приложения):- если тип слоя указан как карта из shapefile, закладка "Данные" выглядит следующим
образом:В этом случае приложение должно предоставить следующие данные:- название (например, название страны);- числовое значение (например, уровень продаж в данной стране).
Допустим, у вас имеется таблица Sales со следующими полями и данными:Country SalesTotal------- ---------USA
500000Germany
1200000
Russia300000Построение отчетов

189

В данном случае нужно настроить данные следующим образом:- источник данных - Sales- пространственные данные, поле - выберите то поле, которое в фале shapefile отвечаетза название страны. Как правило, это поле "NAME".
- пространственные данные, значение - [Sales.Country]- аналитические данные, значение - [Sales.SalesTotal]- аналитические данные, функция - "Сумма". Функция используется, если для данной
страны есть несколько записей с разными значениями.
Поле "Увеличить полигон" позволяет увеличить полигон с указанным именем на весьразмер объекта "Карта". Например, чтобы увеличить страну Россия на карте мира,укажите в этом поле значение "Russia" (с кавычками).
- если тип слоя указан как данные, предоставляемые приложением, закладка "Данные"выглядит следующим образом:В этом случае приложение должно предоставить следующие данные:- пространственные данные - широта и долгота;- название (например, название города);- числовое значение (например, уровень продаж в данном городе).
Допустим, у вас имеется таблица Sales со следующими полями и данными:190Построение отчетов

Latitude Longitude CityName SalesTotal-------- --------- -------- ---------48.13641 11.57753 Munchen
50000
50.94165 6.95505
Koln
36000
В этом случае нужно настроить данные следующим образом:- источник данных - Sales- пространственные данные, широта - [Sales.Latitude]- пространственные данные, долгота - [Sales.Longitude]- пространственные данные, надпись - [Sales.CityName]- аналитические данные, значение - [Sales.SalesTotal]- аналитические данные, функция - "Сумма". Функция используется, если для данного
города есть несколько записей с разными значениями.

Выделение данных цветом
После того как слой подключен к данным, возникает вопрос - в каком виде выводить
аналитическую информацию (например, объемы продаж в разных странах)? Самый простой
способ - настроить отображение надписей так, чтобы помимо названия страны выводилисьи цифры продаж (см. раздел "Настройка отображаемых значений"). Однако, гораздо более
наглядный способ - это раскраска стран в определенные цвета в зависимости от объема
продаж. Для этого надо настроить цветовую шкалу. Сделать это можно на закладке
"Цветовая шкала":Цветовая шкала представляет собой набор значений: минимальное значение;максимальное значение; цвет. Таких наборов (диапазонов) может быть несколько. Длянастройки цветовой шкалы надо указать, сколько диапазонов она содержит, после этого
настроить минимальное и максимальное значение в каждом диапазоне, а также цвет:Построение отчетов

191По умолчанию все значения установлены в "Авто". В этом случае FastReport рассчитает
минимальное и максимальное значения для каждого диапазона автоматически, а цветвозьмет из предустановок "Начальный цвет", "Средний цвет" и "Конечный цвет". Этотрежим можно использовать в большинстве случаев.
Если цветовая шкала настроена, то в нижней части карты появляется индикатор полоска из нескольких разноцветных прямоугольников:Внешний вид и расположение индикатора можно настроить, выбрав в списке слоев
элемент "Карта" и переключившись на закладку "Цветовая шкала":192

Построение отчетов

Выделение данных размером
Если тип слоя указан как данные, предоставляемые приложением, то данные будут
отображаться в виде точки с надписью. Размер точки можно привязать к данным примерно
таким же способом, как это делается при выделении цветом. Сделать это можно назакладке "Шкала размеров":Шкала размеров представляет собой набор значений: минимальное значение;максимальное значение; размер в пикселах. Таких наборов (диапазонов) может бытьнесколько. Для настройки шкалы надо указать, сколько диапазонов она содержит, после
этого настроить минимальное и максимальное значение в каждом диапазоне, а также
размер.
По умолчанию все значения установлены в "Авто". В этом случае FastReport рассчитает
минимальное и максимальное значения для каждого диапазона автоматически, а размер
возьмет из предустановок "Начальный размер", "Конечный размер".

Построение отчетов

193

Глава

IIIРабота с данными

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

Окно "Данные"Все данные, которые можно использовать в отчете, доступны из одного места – из окна"Данные". Это окно можно показать, выбрав пункт меню "Данные|Показать окно данных":Окно "Данные" позволяет управлять всеми элементами данных, а также вставлять
элементы данных в отчет путем перетаскивания их на страницу отчета. Все операции
выполняются с помощью панели инструментов и меню "Действия":196

Работа с данными

Часть этих операций дублируется в контекстном меню окна "Данные". Так, если выбрать вокне источник данных, то в контекстном меню будут доступны операции по созданию
вычисляемого поля, удаления источника, просмотра его данных.

Источники данныхПод источником данных подразумевается таблица БД или запрос на языке SQL. В отчете
может быть несколько источников данных. Как правило, для большинства отчетов нужен
только один источник. Отчет типа Master-Detail нуждается в двух источниках, между
которыми установлена связь (об этом далее).
Источник данных имеет одно или несколько полей. Каждое поле имеет определенный типданных. Чтобы посмотреть тип поля, выделите поле в окне "Данные" и откройте окно"Свойства". Тип поля указан в свойстве "DataType". Иконка рядом с названием поля также
помогает определить его тип.
Источник данных для отчета может быть определен двумя способами.
Первый способ – источник данных определен в приложении и зарегистрирован в отчете.
Это забота программиста, который создавал приложение (подробнее об этом см. в"Руководстве программиста"). Пользователю остается выбрать нужный источник данных изсписка доступных, чтобы использовать его в отчете. Это делается в меню "Данные|Выбрать данные для отчета...":

Работа с данными

197В этом окне перечислены все данные, зарегистрированные в отчете. Просто отметьте
галочками те данные, которые вам нужны. Это можно сделать в любой момент работы сотчетом.
Второй способ – вы создаете новый источник данных самостоятельно. Это может бытьтаблица БД или запрос на языке SQL. В этом случае источник данных сохраняется вфайле отчета.
FastReport позволяет подключаться к большинству популярных СУБД, таким как MS SQL,
Oracle, Interbase, использовать файлы баз данных Access и файлы данных, хранящиеся вформате xml/xsd. Доступны расширения FastReport, позволяющие подключаться и кдругим СУБД.
Содержимое таблиц БД в файле отчета не сохраняется. Сохраняются только параметры
подключения к БД и имена таблиц, используемых в отчете. Информация о подключении кБД может содержать такие данные, как логин и пароль, и поэтому сохраняется в файле
отчета в зашифрованном виде. При необходимости степень безопасности можно
увеличить, используя для шифрации данных свой собственный ключ. В этом случае файлотчета может быть корректно открыт только в вашей программе.

Создание источника данных
Чтобы создать новый источник данных, выберите пункт меню "Данные|Новый источник
данных..." или в окне "Данные" нажмите кнопку "Действия" и выберите пункт "Новый
источник данных...". Вы увидите окно "Мастер подключения к данным":198Работа с данными

Первым делом вам предлагается создать подключение к базе данных. Для этого нажмите
кнопку "Новое подключение...". Вы увидите окно с настройками подключения:На рисунке обозначены следующие элементы управления:1. тип подключения;2. если включить эту галочку, в дальнейшем будет использоваться выбранный типподключения по умолчанию;3. настройки выбранного типа подключения;4. кнопка проверки подключения.
На рисунке показано соединение с базой данных MS Access. Если выбрать другой типподключения, область с настройками подключения (3) изменится. Например, подключениек базе данных MS SQL имеет следующие настройки:Работа с данными

199Вы должны выбрать необходимый тип подключения и настроить его параметры. После
нажатия кнопки ОК окно закроется, и вы вернетесь в окно мастера подключения.
Для подключения надо указать имя. Это имя будет видно в окне "Данные". Можно
оставить имя, которое предлагается по умолчанию:Нажмите кнопку "Далее >" в окне мастера. На этом шаге предлагается выбрать таблицы,которые доступны в базе данных:200Работа с данными

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

Работа с данными

201Вы увидите окно мастера запроса:Мастер запроса содержит 4 страницы. Для переключения между страницами используйте
кнопки "Далее" и "Назад".
На первом шаге мастера вам предлагается дать имя источнику данных. Под этим именемон будет виден в окне "Данные". Введите любое имя; важно, чтобы имя объекта былоуникальным. Нажмите кнопку "Далее". Вы увидите вторую страницу мастера:202Работа с даннымиНа втором шаге мастера вам необходимо ввести текст запроса на языке SQL. Используйтетот диалект языка, который понимает ваша СУБД. Для построения текста запроса можно
воспользоваться конструктором запроса, для этого нажмите кнопку "Конструктор
запроса". Подробнее работа с построителем запроса будет рассмотрена далее.
После того, как вы ввели текст запроса, нажмите кнопку "Далее". Вы увидите третью
страницу мастера:На этом шаге мастера вы можете определить параметры запроса. Это необходимо, если втексте вашего запроса содержатся параметры. Подробнее о настройке параметров будет
рассказано далее.
Наконец, на последнем шаге запроса можно настроить поля, которые вернул запрос:Работа с данными

203

Если вы допустили ошибку в тексте запроса или в описании параметров, вы увидите
сообщение об ошибке в момент переключения на последнюю страницу мастера запроса.
Как правило, вам достаточно убедиться, что запрос вернул все необходимые поля. Наэтой странице мастера вы можете выполнить следующие действия:удалить ненужные поля из списка полей с помощью кнопки "Удалить";восстановить удаленные поля с помощью кнопки "Обновить";добавить вычисляемое поле в запрос с помощью кнопки "Добавить вычисляемое поле".
Для нового поля надо настроить его свойства – имя (Name), тип данных (DataType) ивыражение, которое будет возвращать значение при обращении к полю (Expression).
После закрытия мастера кнопкой "Готово" вы вернетесь в окно мастера подключения.

Параметры запросаВ тексте запроса могут присутствовать параметры. Рассмотрим следующий запрос:select * from DVDs
where Title = @param1

Это запрос к демонстрационной базе MS SQL. В запросе определен параметр с именем
"param1". Здесь надо сделать важное замечание: способ определения параметров взапросе отличается для разных СУБД. Для MS SQL параметр обозначается символом "@";
для MS Access параметры не имеют имен и обозначаются символами "?".
Для того чтобы работать с параметром, надо, как минимум, определить его значение. Этоможно сделать на третьем шаге мастера "Мастер запроса", который мы рассмотрели выше.
Для создания параметра нажмите кнопку "Добавить параметр". Будет создан новый
параметр:204Работа с даннымиВ окне справа необходимо настроить следующие свойства параметра:Свойство

Описание

NameИмя параметра. Здесь надо указать то же самое имя параметра,который вы использовали в тексте запроса. Некоторые СУБД(например, MS Access) не поддерживают именованные параметры.
В этом случае оставьте это свойство без изменений.

DataTypeТип данных параметра.

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

ExpressionВыражение, которое возвращает значение параметра. Подробнеео выражениях смотрите в главе "Выражения". Это выражение
будет вычислено при запуске отчета на выполнение.

SizeРазмер данных параметра. Это свойство нужно указывать, еслипараметр имеет тип данных "строка".

Если вы неправильно настроите свойства параметра, вы получите ошибку в момент
переключения на последнюю страницу мастера.

Передача значения в параметр запроса
Частый способ использования параметров – запрос у пользователя какой-либоинформации, например, названия компании. Рассмотрим, как передать значение впараметр двумя способами.
Первый способ - вы передаете значение из программы. Так как нет простого и надежного

Работа с данными

205

способа передать значение непосредственно в параметр запроса, вам нужно использовать
параметр отчета. В этом случае рекомендуется следующий порядок действий:Создайте параметр отчета (подробнее о параметрах смотрите в разделе "Параметры
отчета"). Задайте для параметра отчета тот же тип данных, что используется впараметре запроса.
В свойстве Expression параметра запроса укажите параметр отчета. Это можно сделать
визуальным способом, вызвав редактор свойства Expression. Таким образом, свойство
Expression будет содержать нечто вроде:[Па ра м е т рОт ч е т а ]Передайте значение параметра из программы. Для этого используйте метод
SetParameterValue объекта Report:
report1.SetParameterValue("ПараметрОтчета", 10);Второй способ - вы используете диалоговую форму отчета (подробнее о диалогах
смотрите в главе "Диалоговые формы"). На диалоге можно разместить элементы
управления, в которые пользователь будет вводить данные. Например, для запроса
названия компании можно использовать элемент управления TextBoxControl. В этомслучае в свойстве Expression можно указать следующее:T e xt Box1.T e xt
где TextBox1 – элемент управления на диалоговой форме отчета, в котором содержится
введенное пользователем значение.
Полная настройка параметра для приведенного выше примера может выглядеть так:Na m e =pa ra m 1
Da t a T y pe =V a rCha r
De fa ult V a lue = (пу с т а я с т рока )Expre ssion=T e xt Box1.T e xt
Size =255Редактирование подключения
Подключение к данным, которое было создано при работе мастера подключения к данным,можно редактировать. Для этого выберите подключение в окне "Данные" и нажмите
кнопку "Редактировать" на панели инструментов. Вы увидите уже знакомое окно мастера
подключения. Вы можете нажать кнопку "Редактировать..." для изменения настроек
подключения. Поменять тип подключения нельзя: он задается только в момент егосоздания.
На второй странице мастера вы можете выбрать таблицы, которые вы хотите видеть вокне "Данные". Когда вы закончили редактирование, нажмите кнопку "Готово".

Редактирование источника данных
Источник данных, который был создан с помощью мастера "Мастер подключения кданным", можно редактировать. Для этого выберите источник данных в окне "Данные" инажмите кнопку "Редактировать" на панели инструментов. Вы увидите окно мастера
запроса, которое мы уже рассматривали ранее. В этом окне можно поменять текст
запроса SQL, настроить параметры запроса и поля данных.

206

Работа с данными

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

Добавление источника данных в существующее подключение
Добавить источник данных (таблицу или запрос) в имеющееся подключение можно двумя
способами:вызвать редактор подключения, как описано в разделе "Редактирование подключения".
Будет показано окно мастера подключения, на второй странице которого можно выбратьили создать новый источник данных;щелкнуть правой кнопкой мыши на элементе "Подключение" и выбрать пункт меню"Новый источник данных...". Как и в предыдущем способе, это приведет к появлению
окна мастера подключения.

Псевдонимы (aliases)Каждый элемент данных (источник данных или его поле) имеет свое имя. По умолчаниюэто то имя, которое определено в базе данных. В некоторых случаях бывает трудно
понять, что скрывается за именем поля, например, ProdID.
У элементов данных есть и вторые имена – псевдонимы. Используя псевдонимы, вы можете
переименовать элемент. Например, если у нас есть источник данных Categories с полем
ProdID, можно задать следующие псевдонимы:Ca t e gorie s --> Ка т е гории
ProdID --> Иде нт иф ика т ор проду кт аК такому полю можно обратиться следующим образом:[Ка т е гории.Иде нт иф ика т ор проду кт а ]При обращении к элементу данных вы должны использовать псевдоним, если онопределен. Обращаться к элементу, используя его оригинальное имя, в этом случае
нельзя.

Для того чтобы переименовать элемент данных, выберите его в окне "Данные" и нажмите
клавишу F2. Также можно выбрать пункт "Переименовать" в контекстном меню объекта.
После этого наберите желаемое имя и нажмите Enter:Работа с данными

207Вы также можете переименовать элемент, используя окно "Свойства". Выберите элемент вокне "Данные", а в окне "Свойства" поменяйте значение свойства Alias.
Чтобы удалить псевдоним (вернуть оригинальное имя), выберите элемент и в егоконтекстном меню выберите пункт "Удалить псевдоним".

Иерархические источники данных
Рассмотренные нами источники данных были реляционными, они представляли собой
аналог таблицы реляционной СУБД. FastReport поддерживает и другой тип источников –иерархические. Такие источники создаются при регистрации в отчете данных из бизнесобъектов. Поскольку такие данные могут быть добавлены в отчет исключительно
программным способом, рассмотрим работу с ними с точки зрения пользователя.
Иерархические источники данных отличаются от обычных источников только тем, что дляних не нужно создавать связь. Источники уже связаны отношением "родительскийдочерний". В окне "Данные" такие источники выглядят следующим образом:Как видно, родительский источник данных "Categories Business Object" содержит в себедочерний источник "Products". Вы можете работать с иерархическими источниками так же,как и с остальными.

Связи (relations)Между двумя источниками данных можно установить связь. Связь описывает отношение
типа "главный-подчиненный" (или "родительский-дочерний"). Например, одна запись втаблице Categories может иметь множество подчиненных записей в таблице Products:

208Работа с данными

Для того чтобы создать связь, нужно указать следующее:1. главная таблица;2. подчиненная таблица;3. набор ключевых полей в главной таблице;4. набор ключевых полей в подчиненной таблице.
Рассмотрим в качестве примера таблицы Categories и Products из демонстрационной базыданных. Они имеют следующую структуру:Обе таблицы имеют поле CategoryID, по которому можно установить связь. При этомодной категории будут соответствовать несколько продуктов.
Как можно использовать связанные источники данных в FastReport? Есть два способа
сделать это.
Первый способ дает возможность строить отчеты типа "главный-подчиненный" (masterdetail). Для этого используются два бэнда "Данные". Главный бэнд привязывается кглавному источнику данных, подчиненный бэнд – к подчиненному источнику. Наш пример
может выглядеть так:Работа с данными

209

Такой отчет, если его запустить, напечатает список продуктов в каждой категории:Второй способ позволяет из подчиненного источника обращаться к главному. Покажем этона примере. Допустим, мы хотим распечатать список всех продуктов. Для этого нам нужен
один бэнд "Данные", который подключен к таблице Products:Такой отчет, если его запустить, напечатает все продукты из всех категорий. Допустим,мы рядом с каждым продуктом хотим напечатать имя категории, к которой он относится.
Без использования связи это было бы затруднительно, т.к. все, что мы знаем о категории
– это ее идентификатор (поле CategoryID в таблице Products). Имя категории хранится вполе CategoryName таблицы Categories. С помощью связи мы можем обратиться к имени
категории следующим образом:[Produc t s.Ca t e gorie s.Ca t e gory Na m e ]При этом FastReport выполнит следующие действия:возьмет текущую строку в таблице Products;в таблице Categories найдет строку, которая является родительской;210Работа с данными

для найденной строки вернет значение поля CategoryName.
В общем случае форма обращения к полю родительской таблицы допускает
неограниченное количество предков таблицы:[доч е рня я _т а блиц а .е е _родит е ль.родит е ль_родит е ля .и_т а к_да ле е .поле ]Чтобы добавить в отчет такое поле данных, откройте таблицу Products в окне "Данные". Выувидите, что среди ее полей есть ссылка на родительскую таблицу Categories:Если перетащить показанное на рисунке поле в отчет, мы получим объект "Текст" стекстом:[Produc t s.Ca t e gorie s.Ca t e gory Na m e ]Наш отчет будет выглядеть следующим образом:Если его запустить, мы увидим следующее:Работа с данными

211

Создание связиДля того чтобы создать связь, в окне "Данные" нажмите кнопку "Действия" и выберите
пункт "Новая связь...". Вы увидите редактор связи:В первую очередь вам нужно выбрать главную и подчиненную таблицы. После этого внижней части окна надо выбрать пары полей – для каждой таблицы соответственно.
Таблицы могут быть связаны с помощью одного или нескольких полей. После того, какполя настроены, закройте редактор связи кнопкой ОК.
Созданную связь можно увидеть в окне "Данные", если выбрать подчиненный источник
данных и раскрыть список его полей. Среди полей мы увидим связь с родительским
источником:Поля родительского источника можно перетаскивать на лист отчета методом drag&drop.
Так, если выбрать показанное на рисунке поле и перетащить его на лист отчета, мыполучим объект "Текст" со следующим содержимым:[Produc t s.Ca t e gorie s.Ca t e gory Na m e ]Редактирование связиДля того чтобы отредактировать связь, откройте список полей дочернего источника
данных, найдите нужную связь и нажмите кнопку "Редактировать..." на панели
инструментов. При этом будет вызван редактор связи, который мы рассматривали выше.

212

Работа с данными

Системные переменные
В FastReport доступно несколько переменных, которые можно использовать в любом месте
отчета. Ниже приведен полный список переменных:Переменная

Описание

DateДата и время старта отчета.

PageНомер текущей страницы.

TotalPages

Общее количество страниц в отчете. Чтобы использовать этупеременную, надо включить двойной проход у отчета. Это можно
сделать в меню "Отчет|Свойства...".

PageNНомер страницы в виде: "Страница N".

PageNofMНомер страницы в виде: "Страница N из M".

Row#Номер строки данных внутри группы. Это значение сбрасывается пристарте новой группы.

AbsRow#Абсолютный номер строки данных. Это значение не сбрасывается пристарте новой группы.
Номер текущей страницы. Если вы объединяете несколько готовых
отчетов в пакет, эта переменная вернет номер страницы в пакете.

Page#

TotalPages#Эта переменная является макросом, т.е. ее значение подставляетсяв момент отображения компонента в окне просмотра. Использоватьее в выражениях нельзя.
Общее количество страниц в отчете. Если вы объединяете несколько
готовых отчетов в пакет, эта переменная вернет количество страницв пакете. Для работы этой переменной двойной проход отчета нетребуется.
Эта переменная является макросом, т.е. ее значение подставляетсяв момент отображения компонента в окне просмотра. Использоватьее в выражениях нельзя.

HierarchyLevelТекущий уровень иерархии в иерархическом отчете (см. "Печать
иерархии"). Верхний уровень имеет значение 1.

HierarchyRow#Полный номер строки в иерархическом отчете, имеет вид "1.2.1".

Функции
FastReport.Net предлагает пользователю большое количество встроенных функций (более
60), которые можно использовать в отчете. Функции разбиты на несколько категорий, идоступны в окне "Данные":Работа с данными

213

Функции можно использовать в любых выражениях, в коде скрипта, а также выводить ихзначение в объектах "Текст". Например, объект "Текст" содержит вызов функции:[Sqrt (4)]В результате будет напечатано значение 2 (корень квадратный из 4).
Следующее выражение вернет значение 4:

Sqrt (4) + 2
Перечислим способы визуальной вставки функций в отчет:функцию можно перетащить на лист отчета, при этом будет создан объект "Текст",содержащий вызов функции. Текст необходимо отредактировать, добавив в негопараметры функции;функцию можно перетащить в код скрипта;в окне редактора выражения также присутствует копия окна "Данные", и так же можно
перетаскивать функцию в текст выражения.
Ниже будет дано описание каждой функции.

Математические

AbsФункция

Параметры

Возвращаемое значение

Abs

sbyte value

sbyte

Abs

short value

short

Abs

int value

int

Abs

long value

long

Abs

float value

float

Abs

double value

doubleAbsdecimal value

decimal214Работа с данными

Возвращает абсолютную величину значения value.
Пример:Abs(-2.2) = 2.2

AcosФункция

Параметры

Возвращаемое значение

Acos

double ddoubleВозвращает угол (в радианах), который соответствует косинусу d. Значение d должно
быть в диапазоне от -1 до 1.
Чтобы перевести радианы в градусы, умножьте значение в радианах на 180 / Math.PI.
Пример:Acos(0) * 180 / Math.PI = 90

AsinФункция

Параметры

Возвращаемое значение

Asindouble ddoubleВозвращает угол (в радианах), который соответствует синусу d. Значение d должно бытьв диапазоне от -1 до 1.
Чтобы перевести радианы в градусы, умножьте значение в радианах на 180 / Math.PI.
Пример:Asin(0) = 0

AtanФункция

Параметры

Возвращаемое значение

Atan

double ddoubleВозвращает угол (в радианах), который соответствует тангенсу d.
Чтобы перевести радианы в градусы, умножьте значение в радианах на 180 / Math.PI.
Пример:Atan(1) * 180 / Math.PI = 45Работа с данными

215

CeilingФункция

Параметры

Возвращаемое значение

Ceiling

double ddoubleCeiling

decimal ddecimalВозвращает наименьшее целое значение, большее и равное d.
Пример:Ceiling(1.7) = 2

CosФункция

Параметры

Возвращаемое значение

Cos

double ddoubleВозвращает косинус значения d. Значение d должно быть в радианах.
Чтобы перевести градусы в радианы, умножьте значение в градусах на Math.PI / 180.
Пример:Cos(90 * Math.PI / 180) = 0

ExpФункция

Параметры

Возвращаемое значение

Exp

double ddoubleВозвращает число e (2.71828), возведенное в степень d.
Пример:Exp(1) = 2.71828

FloorФункция

Параметры

Возвращаемое значение

Floor

double ddoubleFloor

decimal ddecimalВозвращает наибольшее целое значение, меньшее и равное d.
Пример:Floor(1.7) = 1

216Работа с данными

LogФункция

Параметры

Возвращаемое значение

Log

double ddoubleВозвращает натуральный логарифм значения d.
Пример:Log(2.71828) = 1

MaximumФункция

Параметры

Возвращаемое значениеMaximum

int val1,
int val2

int

Maximumlong val1,
long val2

long

Maximum

float val1,
float val2

float

Maximum

double val1,
double val2

doubleMaximum

decimal val1,
decimal val2

decimalВозвращает максимальное из значений val1, val2.
Пример:Maximum(1,2) = 2

MinimumФункция

Параметры

Возвращаемое значение

Minimum

int val1,
int val2

int

Minimumlong val1,
long val2

longMinimum

float val1,
float val2

float

Minimum

double val1,
double val2

doubleMinimum

decimal val1,
decimal val2

decimalВозвращает минимальное из значений val1, val2.

Работа с данными

217

Пример:Minimum(1,2) = 1

RoundФункция

Параметры

Возвращаемое значение

Round

double ddoubleRounddecimal ddecimalОкругляет значение d до ближайшего целого.
Пример:Round(1.47) = 1

Функция

Параметры

Возвращаемое значение

Round

double d,
int digits

doubleRounddecimal d,
int digits

decimalОкругляет значение d до числа разрядов, указанного в параметре digits.
Пример:Round(1.478, 2) = 1.48

SinФункция

Параметры

Возвращаемое значение

Sin

double ddoubleВозвращает синус значения d. Значение d должно быть указано в радианах.
Чтобы перевести градусы в радианы, умножьте значение в градусах на Math.PI / 180.
Пример:Sin(90 * Math.PI / 180) = 1

SqrtФункция

Параметры

Возвращаемое значение

Sqrt

double ddouble218Работа с данными

Возвращает квадратный корень от значения d.
Пример:Sqrt(4) = 2

TanФункция

Параметры

Возвращаемое значение

Tandouble ddoubleВозвращает тангенс значения d. Значение d должно быть указано в радианах.
Чтобы перевести градусы в радианы, умножьте значение в градусах на Math.PI / 180.
Пример:Tan(45 * Math.PI / 180) = 1

TruncateФункция

Параметры

Возвращаемое значение

Truncate

double ddoubleTruncate

decimal ddecimalВозвращает целую часть значения d.
Пример:Truncate(1.7) = 1

Текстовые
Замечание:эти функции не модифицируют переданное в них текстовое значение. Вместо этого онивозвращают измененную строку;позиция первого символа в строке равна 0. Это следует учитывать при передаче
параметров в некоторые функции, например, Insert.

AscФункция

Параметры

Возвращаемое значение

Ascchar cintВозвращает целое значение, представляющее код символа c.
Пример:Работа с данными

219

Asc('A') = 65

ChrФункция

Параметры

Возвращаемое значение

Chr

int i

char

Возвращает символ с кодом i.
Пример:Chr(65) = 'A'

InsertФункция

Параметры

Возвращаемое значение

Insertstring s,
int startIndex,
string value

stringВставляет подстроку value в строку s, начиная с позиции startIndex, и возвращает новую
строку.
Пример:Insert("ABC", 1, "12") = "A12BC"

LengthФункция

Параметры

Возвращаемое значение

Lengthstring sintВозвращает длину строки s.
Пример:Length("ABC") = 3

LowerCaseФункция

Параметры

Возвращаемое значение

LowerCasestring s

stringПереводит все символы строки s в нижний регистр и возвращает результат.
Пример:LowerCase("ABC") = "abc"220Работа с данными

PadLeftФункция

Параметры

Возвращаемое значение

PadLeftstring s,
int totalWidth

stringДополняет строку s пробелами слева, до длины, указанной в параметре totalWidth, ивозвращает новую строку.
Пример:PadLeft("ABC", 5) = "ABC"Функция

Параметры

Возвращаемое значение

PadLeftstring s,
int totalWidth,char paddingChar

stringДополняет строку s символами paddingChar слева, до длины, указанной в параметре
totalWidth, и возвращает новую строку.
Пример:PadLeft("ABC", 5, '0') = "00ABC"

PadRightФункция

Параметры

Возвращаемое значение

PadRight

string s,
int totalWidth

stringДополняет строку s пробелами справа, до длины, указанной в параметре totalWidth, ивозвращает новую строку.
Пример:PadRight("ABC", 5) = "ABC"Функция

Параметры

Возвращаемое значение

PadRight

string s,
int totalWidth,char paddingChar

stringДополняет строку s символами paddingChar справа, до длины, указанной в параметре
totalWidth, и возвращает новую строку.
Пример:PadRight("ABC", 5, '0') = "ABC00"Работа с данными

221

RemoveФункция

Параметры

Возвращаемое значение

Removestring s,
int startIndex

stringУдаляет все символы из строки s, начиная с позиции startIndex, и возвращает новую
строку.
Пример:Remove("ABCD", 3) = "ABC"Функция

Параметры

Возвращаемое значение

Removestring s,
int startIndex,
int countstringУдаляет указанное в count количество символов из строки s, начиная с позиции
startIndex, и возвращает новую строку.
Пример:Remove("A00BC", 1, 2) = "ABC"

ReplaceФункция

Параметры

Возвращаемое значение

Replacestring s,
string oldValue,
string newValue

stringЗаменяет в строке s все вхождения подстроки oldValue на подстроку newValue, ивозвращает новую строку.
Пример:Replace("A00", "00", "BC") = "ABC"SubstringФункция

Параметры

Возвращаемое значение

Substring

string s,
int startIndex

stringВозвращает все символы строки s, начиная с позиции startIndex и до конца строки.
Пример:222

Работа с данными

Substring("ABCDEF", 4) = "EF"Функция

Параметры

Возвращаемое значение

Substring

string s,
int startIndex,
int length

stringВозвращает количество length символов строки s, начиная с позиции startIndex.
Пример:Substring("ABCDEF", 1, 3) = "BCD"

TitleCaseФункция

Параметры

Возвращаемое значение

TitleCasestring s

stringПереводит символы строки s в "титульный" регистр. При этом первый символ каждого
слова делается заглавным, остальные символы - строчными.
Пример:TitleCase("john smith") = "John Smith"TrimФункция

Параметры

Возвращаемое значение

Trim

string s

stringОбрезает незначащие пробелы в начале и конце строки s.
Пример:Trim("

ABC") = "ABC"UpperCaseФункция

Параметры

Возвращаемое значение

UpperCasestring s

stringПереводит все символы строки s в верхний регистр и возвращает результат.
Пример:UpperCase("abc") = "ABC"Работа с данными

223

Дата и время

AddDaysФункция

Параметры

Возвращаемое значение

AddDays

DateTime date,
double value

DateTimeДобавляет к дате date количество дней value и возвращает новую дату.
Пример:AddDays(#7/29/2009#, 1) = #7/30/2009#

AddHoursФункция

Параметры

Возвращаемое значение

AddHours

DateTime date,
double value

DateTimeДобавляет к дате date количество часов value и возвращает новую дату.
Пример:AddHours(#7/29/2009 1:30#, 1) = #7/29/2009 2:30#

AddMinutesФункция

Параметры

Возвращаемое значение

AddMinutes

DateTime date,
double value

DateTimeДобавляет к дате date количество минут value и возвращает новую дату.
Пример:AddMinutes(#7/29/2009 1:30#, 1) = #7/29/2009 1:31#

AddMonthsФункция

Параметры

Возвращаемое значение

AddMonths

DateTime date,int value

DateTimeДобавляет к дате date количество месяцев value и возвращает новую дату.

224

Работа с данными

Пример:AddMonths(#7/29/2009#, 1) = #8/29/2009#

AddSecondsФункция

Параметры

Возвращаемое значение

AddSeconds

DateTime date,
double value

DateTimeДобавляет к дате date количество секунд value и возвращает новую дату.
Пример:AddSeconds(#7/29/2009 1:30:01#, 1) = #7/29/2009 1:30:02#

AddYearsФункция

Параметры

Возвращаемое значение

AddYears

DateTime date,int value

DateTimeДобавляет к дате date количество лет value и возвращает новую дату.
Пример:AddYears(#7/29/2009#, 1) = #7/29/2010#

DateDiffФункция

Параметры

Возвращаемое значение

DateDiff

DateTime date1,
DateTime date2

TimeSpanВозвращает интервал - количество дней, часов, минут, секунд между двумя датами.
Пример:DateDiff(#1/2/2009#, #1/1/2009#) = 1.00:00:00

DateSerialФункция

Параметры

Возвращаемое значение

DateSerial

int year,int month,int day

DateTimeСоздает новое значение DateTime из указанных года (year), месяца (month) и дня (day).

Работа с данными

225

Пример:DateSerial(2009, 7, 29) = #7/29/2009#DayФункция

Параметры

Возвращаемое значение

Day

DateTime dateintИзвлекает день месяца (1-31) из указанной даты.
Пример:Day(#7/29/2009#) = 29

DayOfWeek
Функция

Параметры

Возвращаемое значение

DayOfWeek

DateTime datestringВозвращает название дня недели (понедельник..воскресенье) указанной даты.
Пример:DayOfWeek(#7/29/2009#) = "среда"DayOfYearФункция

Параметры

Возвращаемое значение

DayOfYear

DateTime dateintВозвращает порядковый номер дня в году (1-365) в указанной дате.
Пример:DayOfYear(#7/29/2009#) = 210

DaysInMonthФункция

Параметры

Возвращаемое значение

DaysInMonthint year,int monthintВозвращает количество дней в месяце month указанного года year.
Пример:DaysInMonth(2009, 7) = 31226Работа с данными

HourФункция

Параметры

Возвращаемое значение

Hour

DateTime dateintИзвлекает час (0-23) из указанной даты.
Пример:Hour(#7/29/2009 1:30#) = 1

MinuteФункция

Параметры

Возвращаемое значение

MinuteDateTime dateintИзвлекает минуты (0-59) из указанной даты.
Пример:
Minute(#7/29/2009 1:30#) = 30

MonthФункция

Параметры

Возвращаемое значение

Month

DateTime dateintИзвлекает месяц (1-12) из указанной даты.
Пример:Month(#7/29/2009#) = 7

MonthNameФункция

Параметры

Возвращаемое значение

MonthName

int monthstringВозвращает локализованное название месяца (Январь..Декабрь) с номером month.
Пример:MonthName(1) = "Январь"Работа с данными

227

SecondФункция

Параметры

Возвращаемое значение

SecondDateTime dateintИзвлекает секунды (0-59) из указанной даты.
Пример:Second(#7/29/2009 1:30:05#) = 5

YearФункция

Параметры

Возвращаемое значение

Year

DateTime dateintИзвлекает год из указанной даты.
Пример:Year(#7/29/2009#) = 2009Форматирование

FormatФункция

Параметры

Возвращаемое значение

Formatstring format,
params object[] args

stringЗаменяет каждый элемент формата в указанной строке format значением
соответствующего параметра в массиве args.
Например, следующий вызов функции:Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now)

содержит элементы формата "{0}" и "{1:hh}". Они заменяются значениями myName и
DateTime.Now. Результат может выглядеть так:Na m e = Ale x, hours = 12Элемент формата имеет следующий синтаксис:{index[,alignment][:formatString]}где
index - обязательный номер значения, которое будет подставлено в это место строки;228Работа с данными

alignment - необязательная ширина форматированного значения;formatString - необязательный спецификатор формата.
Для форматирования числовых значений используются следующие стандартные символыспецификаторы:Символ

ТипC или cВалюта

Описание
Число преобразуется в строку, представляющую денежные
единицы.
Format("{0:C}", 10) = "10,00р."

D или dДесятичное
числоЭтот формат доступен только для целых типов. Число
преобразуется в строку, состоящую из десятичных цифр(0-9).
Format("{0:D}", 10) = "10"E или eНаучный

Число преобразуется в строку вида "-d.ddd…E+ddd" или "-d.
ddd…e+ddd", где знак "d" представляет цифру (0-9).
Format("{0:E}", 10) = "1,000000E+001"

F или fФиксированная
запятая

Число преобразуется в строку вида "-ddd.ddd…", где знак"d" представляет цифру (0-9).
Format("{0:F}", 10) = "10,00"

G или gОбщийЧисло преобразуется в наиболее короткую запись.
Format("{0:G}", 10) = "10"N или nЧислоЧисло преобразуется в строку вида "-d,ddd,ddd.ddd…", гдезнак "d" - цифра (0-9), знак "," - разделитель тысяч, а знак"." - разделитель целой и дробной части.
Format("{0:N}", 1234.56) = "1 234,56"

P или pПроцент

Число преобразуется в строку, представляющую проценты.
Преобразуемое число умножается на 100, чтобы
соответствовать процентам.
Format("{0:P}", 0.15) = "15,00%"

X или xШестнадцатеричный

Этот формат доступен только для целых типов. Число
преобразуется в строку шестнадцатеричных знаков.
Регистр шестнадцатеричных знаков, превосходящих 9,совпадает с регистром указателя формата.
Format("{0:X}", 26) = "1A"После символа-спецификатора формата можно указать число. Для чисел с плавающей
запятой это будет означать количество знаков после запятой в форматированном
значении:Format("{0:C1}", 12.23) = "12,2р."Если стандартных средств форматирования чисел недостаточно, можно использовать

Работа с данными

229

символы настраиваемого числового формата:Символ

Описание

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

#Заместитель цифры. Если форматируемое значение содержит цифру в этойпозиции, она копируется в выходную строку. В противном случае в выходной
строке ничего не записывается.

.

Разделитель дроби. Первый знак "." в строке формата определяет положение
разделителя дроби.

,Разделитель числовых разрядов. Знак "," в строке формата определяет
положение разделителя групп разрядов.

%Заместитель процентов. При использовании знака "%" в строке
форматирования число будет умножено на 100, и в соответствующую
позицию в выходной строке будет вставлен символ "%".

;

Разделитель секций. Знак ";" служит для разделения секций положительных,отрицательных и нулевых чисел в строке формата.

Примеры использования:Format("{0:$#,##0.00}", 1024.25) = "$1 024,25"
Format("{0:00%}", 0.25) = "25%"
Format("{0:$#,##0.00;($#,##0.00);Zero}", 1024.25) = "$1 024,25"
Format("{0:$#,##0.00;($#,##0.00);Zero}", -1024.25) = "($1 024,25)"
Format("{0:$#,##0.00;($#,##0.00);Zero}", 0) = "Zero"Для форматирования даты/времени используются следующие стандартные символыспецификаторы:Символ

230

ТипПример

dКороткий шаблон даты"03.08.2009"DПолный шаблон даты"3 августа 2009 г."fПолный шаблон даты и времени
(короткий шаблон времени)"3 августа 2009 г. 20:13"

FПолный шаблон даты и времени
(полный шаблон времени)"3 августа 2009 г. 20:13:33"

gОбщий шаблон даты и времени
(короткий шаблон времени)"03.08.2009 20:13"

GОбщий шаблон даты и времени
(полный шаблон времени)"03.08.2009 20:13:33"

tКороткий шаблон времени

"20:13"TПолный шаблон времени

"20:13:33"

Работа с данными

Так же можно использовать символы настраиваемого формата даты/времени:Символ

Описание

dПредставляет день месяца в виде числа от 1 до 31. Одноразрядные числа
форматируются без нуля в начале.

ddПредставляет день месяца в виде числа от 01 до 31.

dddПредставляет сокращенное название дня недели.

dddd

Представляет полное название дня недели.

f или FПредставляет миллисекунды.

hПредставляет часы числом от 1 до 12. Одноразрядные числа форматируютсябез нуля в начале.

hhПредставляет часы числом от 01 до 12.

HПредставляет часы числом от 0 до 23. Одноразрядные числа форматируютсябез нуля в начале.

HHПредставляет часы числом от 00 до 23.

mПредставляет минуты как число от 0 до 59. Одноразрядные числа
форматируются без нуля в начале.

mmПредставляет минуты как число от 00 до 59.

MПредставляет месяц как число от 1 до 12. Одноразрядные числа
форматируются без нуля в начале.

MMПредставляет месяц как число от 01 до 12.

MMMПредставляет сокращенное название месяца.

MMMM

Представляет полное название месяца.

sПредставляет секунды как число от 0 до 59. Одноразрядные числа
форматируются без нуля в начале.

ssПредставляет секунды как число от 00 до 59.

yПредставляет год как число из одной или двух цифр.

yyПредставляет год как число из двух цифр.

yyyyПредставляет год как число из четырех цифр.

:Представляет стандартный разделитель времени.

/Представляет стандартный разделитель даты.

Примеры использования:Format("{0:d MMM yyyy}", DateTime.Now) = "3 авг 2009"
Format("{0:dd/MM/yyyy}", DateTime.Now) = "03.08.2009"
Format("{0:d MMMM}", DateTime.Now) = "3 августа"Format("{0:HH:mm}", DateTime.Now) = "23:32"
Format("{0:dd/MM/yyyy HH:mm}", DateTime.Now) = "03.08.2009 23:32"

Работа с данными

231

FormatCurrencyФункция

Параметры

Возвращаемое значение

FormatCurrency

object value

stringФорматирует значение value как валюту, используя региональные установки Windows.
Пример:FormatCurrency(1.25) = "1,25р."Функция

Параметры

Возвращаемое значение

FormatCurrency

object value,
int decimalDigits

stringФорматирует значение value как валюту, округляя результат до количества знаков после
запятой decimalDigits.
Пример:FormatCurrency(1.25, 1) = "1,3р."FormatDateTimeФункция

Параметры

Возвращаемое значение

FormatDateTime

DateTime value

stringФорматирует значение value как дату/время. Данная функция не возвращает дату иливремя, если соответствующие части имеют пустые значения. Пустой датой считается
дата 1/1/1, пустым временем - 0:00:00.
Пример:FormatDateTime(#1/1/2009#) = "01.01.2009"
FormatDateTime(#1/1/2009 1:30#) = "01.01.2009 1:30:00"
FormatDateTime(#1:30#) = "1:30:00"

Функция

Параметры

Возвращаемое значение

FormatDateTime

DateTime value,
string format

stringФорматирует значение value как дату/время, используя именованный формат format.
Допустимые значения для параметра format:"Long Date""Short Date""Long Time"232Работа с данными

"Short Time"Пример:FormatDateTime(#1/1/2009 1:30#, "Long Date") = "1 января 2009 г."FormatDateTime(#1/1/2009#, "Short Date") = "01.01.2009"
FormatDateTime(#1:30#, "Short Time") = "01:30"
FormatDateTime(#1:30#, "Long Time") = "1:30:00"

FormatNumberФункция

Параметры

Возвращаемое значение

FormatNumber

object value

stringФорматирует значение value как число, используя региональные установки Windows.
Пример:FormatNumber(1234.56) = "1 234,56"

Функция

Параметры

Возвращаемое значение

FormatNumber

object value,
int decimalDigits

stringФорматирует значение value как число, округляя результат до количества знаков после
запятой decimalDigits.
Пример:FormatNumber(1234.56, 1) = "1 234,6"

FormatPercentФункция

Параметры

Возвращаемое значение

FormatPercent

object value

stringФорматирует значение value как процент, используя региональные установки Windows.
Пример:FormatPercent(0.15) = "15,00%"

Функция

Параметры

Возвращаемое значение

FormatPercent

object value,
int decimalDigits

stringФорматирует значение value как процент, округляя результат до количества знаков после
запятой decimalDigits.

Работа с данными

233

Пример:FormatPercent(0.15, 0) = "15%"Конвертирование

ToBooleanФункция

Параметры

Возвращаемое значение

ToBoolean

object valueboolКонвертирует значение value в логический тип.
Пример:ToBoolean(1) = true
ToBoolean(0) = false

ToByteФункция

Параметры

Возвращаемое значение

ToByteobject value

byteКонвертирует значение value в тип byte.
Пример:ToByte("55") = 55

ToCharФункция

Параметры

Возвращаемое значение

ToCharobject valuecharКонвертирует значение value в символ.
Пример:ToChar(65) = 'A'

ToDateTimeФункция

Параметры

Возвращаемое значение

ToDateTime

object value

DateTime234Работа с данными

Конвертирует значение value в тип DateTime.
Пример:ToDateTime("1/1/2009") = #1/1/2009#

ToDecimalФункция

Параметры

Возвращаемое значение

ToDecimal

object value

decimalКонвертирует значение value в тип decimal.
Пример:ToDecimal(1) = 1m
ToDecimal("1") = 1m

ToDoubleФункция

Параметры

Возвращаемое значение

ToDouble

object value

doubleКонвертирует значение value в тип double.
Пример:
ToDouble(1) = 1
ToDouble("1") = 1

ToInt32Функция

Параметры

Возвращаемое значение

ToInt32

object valueintКонвертирует значение value в тип int.
Пример:ToInt32(1f) = 1
ToInt32("1") = 1

ToRomanФункция

Параметры

Возвращаемое значение

ToRomanobject value

stringКонвертирует числовое значение value в римские цифры. value не должно превышать
значения 3998.

Работа с данными

235

Пример:ToRoman(9) = "IX"

ToSingleФункция

Параметры

Возвращаемое значениеToSingle

object value

floatКонвертирует значение value в тип float.
Пример:ToSingle(1m) = 1f
ToSingle("1") = 1f

ToStringФункция

Параметры

Возвращаемое значение

ToString

object value

stringКонвертирует значение value в тип string.
Пример:ToString(false) = "False"
ToString(DateTime.Now) = "04.08.2009 13:45"

ToWordsФункция

Параметры

Возвращаемое значение

ToWords

object value

stringКонвертирует числовое значение value в сумму прописью на английском.
Пример:ToWords(1024.25) = "One thousand and twenty-four dollars and 25 cents"Функция

Параметры

Возвращаемое значение

ToWords

object value,
string currencyName

stringКонвертирует числовое значение value в сумму прописью на английском. Используется
валюта, заданная в параметре currencyName. Возможные значения этого параметра:
"USD"
"EUR"

236

Работа с данными

"GBP"
Пример:ToWords(1024.25, "EUR") = "One thousand and twenty-four euros and 25 cents"Функция

Параметры

Возвращаемое значение

ToWords

object value,
string one,string many

stringКонвертирует целочисленное значение value в число прописью на английском. Впараметрах one и many задаются словоформы для единственного и множественного числа.
Пример:ToWords(124, "page", "pages") = "One hundred and twenty-four pages"
ToWords(1, "page", "pages") = "One page"

ToWordsEnGbФункция

Параметры

Возвращаемое значение

ToWordsEnGb

object value

stringКонвертирует числовое значение value в сумму прописью на британском английском.
Отличие от функции ToWords в следующем:по умолчанию используется валюта GBP;
по-разному переводятся суммы "миллиард" и "триллион".
Пример:ToWordsEnGb(121) = "One hundred and twenty-one pounds and 00 pence"Функция

Параметры

Возвращаемое значение

ToWordsEnGb

object value,
string currencyName

stringКонвертирует числовое значение value в сумму прописью на британском английском.
Используется валюта, заданная в параметре currencyName. Возможные значения этого
параметра:
"USD"
"EUR"
"GBP"
Пример:ToWordsEnGb(1024.25, "EUR") = "One thousand and twenty-four euros and 25 cents"Работа с данными

237

Функция

Параметры

Возвращаемое значение

ToWordsEnGb

object value,
string one,string many

stringКонвертирует целочисленное значение value в число прописью на британском английском.
В параметрах one и many задаются словоформы для единственного и множественного
числа.
Пример:ToWordsEnGb(124, "page", "pages") = "One hundred and twenty-four pages"
ToWordsEnGb(1, "page", "pages") = "One page"

ToWordsRuФункция

Параметры

Возвращаемое значение

ToWordsRu

object value

stringКонвертирует числовое значение value в сумму прописью на русском.
Пример:ToWordsRu(1024.25) = "Одна тысяча двадцать четыре рубля 25 копеек"Функция

Параметры

Возвращаемое значение

ToWordsRu

object value,
string currencyName

stringКонвертирует числовое значение value в сумму прописью на русском. Используется
валюта, заданная в параметре currencyName. Возможные значения этого параметра:
"RUR"
"UAH"
"USD"
"EUR"
Пример:ToWordsRu(1024.25, "EUR") = "Одна тысяча двадцать четыре евро 25 евроцентов"Функция

Параметры

Возвращаемое значение

ToWordsRu

object value,bool male,string one,string two,string many

stringКонвертирует целочисленное значение value в число прописью на русском. В параметре
male надо указать true, если существительное - мужского рода. В параметрах one, two и238Работа с данными

many задаются словоформы для чисел 1, 2 и 5 (1 "лист", 2 "листа", 5 "листов").
Пример:// слово "страница" женского рода - параметр male = false
ToWordsRu(124, false, "страница", "страницы", "страниц") = "Сто двадцать четыре страницы"// слово "лист" мужского рода - параметр male = true
ToWordsRu(124, true, "лист", "листа", "листов") = "Сто двадцать четыре листа"Условия

ChooseФункция

Параметры

Возвращаемое значение

Choosedouble index,
params object[] choiceobjectВозвращает элемент массива choice с индексом index. Первый элемент массива имеет
индекс = 1.
Пример:Choose(2, "one", "two", "three") = "two"IIfФункция

Параметры

Возвращаемое значение

IIfbool expression,
object truePart,
object falsePart

objectЕсли expression равно true, возвращает значение truePart, иначе возвращает falsePart.
Пример:IIf(2 > 5, "true", "false") = "false"

SwitchФункция

Параметры

Возвращаемое значение

Switchparams object[] expressions

objectВ параметр expressions передаются пары вида "условие-значение". Возвращает первое
значение, условие для которого равно true.
Пример:// вернет одну из строк "а больше 0","а меньше 0","а равно 0" в зависимости от aРабота с данными

239

Switch(a > 0, "а больше 0",
a < 0, "а меньше 0",
a == 0, "а равно 0")Итоговые значенияВ большинстве отчетов надо выводить некую итоговую информацию: сумма по группе,количество строк в списке и т.п. В FastReport для этих целей существуют так называемые
итоговые значения. С их помощью можно подсчитать функцию от определенного значенияпо диапазону данных.
Для итога нужно указать следующие параметры:1. тип итоговой функции;2. диапазон данных, для которого будет вычисляться функция;3. выражение, которое надо вычислять. Для функции "Количество" выражение неуказывается;4. выражение – условие. Функция будет вычисляться, если это условие выполняется. Этотпараметр задавать не обязательно.
Диапазон данных задается следующим образом: указывается бэнд "Данные", для каждой
строки которого будет вычисляться функция. Также указывается бэнд, на котором будет
печататься итог. После печати этого бэнда значение итога сбрасывается.
Ниже приведен список итоговых функций:Функция

Описание

СуммаВычисляет сумму указанного выражения для диапазона данных.

Минимум

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

Максимум

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

Среднее

Находит среднее значение указанного выражения для диапазона
данных.

Количество

Возвращает количество строк в диапазоне.

Создание итога
Рассмотрим использование итоговой функции на примере. Допустим, у нас есть дветаблицы – Categories (Категории) и Products (Продукты). Таблицы связаны таким образом,что мы можем создать отчет типа "главный-подчиненный", который печатает список
продуктов в каждой категории, а также количество товара на складе:240Работа с данными

Готовый отчет выглядит следующим образом:Добавим итог в этот отчет, который будет печатать общее количество товара на складедля каждой категории - сумму поля UnitsInStock. Итог будет печататься в бэнде - подвале
данных.
Для того чтобы напечатать итоговое значение, его сначала надо создать. Для этого в окне"Данные" нажмите кнопку "Действия" и выберите пункт меню "Новый итог...". Другой
способ – щелкните правой кнопкой мыши на элементе "Итоги" в дереве данных и выберите
пункт меню "Новый итог...". Вы увидите окно редактора итогового значения:Работа с данными

241Первое, что вам предлагается сделать, это указать имя итога. Вы будете обращаться китогу по его имени, поэтому назовите итог так, чтобы было понятно, что он вычисляет.
Назовем наш итог "TotalUnits".
Далее выбираем итоговую функцию. Нас интересует функция "Сумма".
Теперь мы должны указать диапазон данных, для которого будет вычисляться итог. Дляэтого в поле "Вычислять для каждой строки бэнда" выбираем бэнд "Данные", в котором
печатается список продуктов. В поле "Печатать итог на бэнде" выбираем бэнд, в котором
будет печататься итог – подвал бэнда "Данные".
Закройте редактор итога кнопкой ОК. Вы увидите, что новый итог появился в окне"Данные". Теперь его можно перетащить в отчет:Если запустить отчет на выполнение, мы увидим следующее:242

Работа с данными

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

243

Это будет означать, что итог надо вычислять для тех продуктов, у которых флагDiscontinued не установлен.

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

Если вам необходимо печатать два вида итогов одновременно - обычные итоги инарастающие, создайте еще один итог с аналогичными настройками, и выключите флажок
"Сбрасывать после печати".

Итоги по страницеДля того чтобы создать итог, который будет печататься в подвале страницы, укажите
бэнд - подвал страницы - в поле "Печатать на бэнде".

Печать итога в заголовке
Обычно итоговые значения печатаются на бэндах-подвалах (подвал данных, подвал
группы, и т.п.). Это естественный порядок печати: в этот момент итог уже вычислен иготов к применению. Однако часто необходимо напечатать итог, например, в заголовке
группы. Если попытаться это сделать, мы увидим нулевое значение. В этот момент итогеще не начинал вычисляться, его значение будет готово в подвале группы.
Для решения этой проблемы FastReport предлагает механизм "отложенной" печати. Объект
"Текст" имеет свойство ProcessAt, которое может принимать одно из следующих значений:Значение

Описание

DefaultОбычный режим, значение по умолчанию.

ReportFinishedЗначение объекта обновляется при завершении отчета.

ReportPageFini
shedЗначение объекта обновляется при завершении всех бэндов настранице отчета.

PageFinishedЗначение объекта обновляется печати подвала страницы.

ColumnFinishedЗначение объекта обновляется при печати подвала колонки.

DataFinishedЗначение объекта обновляется при печати подвала данных.

244

Работа с данными

GroupFinishedЗначение объекта обновляется при печати подвала группы.

Поясним принцип работы на примере. Положим на заголовок группы объект "Текст",который печатает итог по группе. Свойство ProcessAt установим в GroupFinished:При запуске отчета произойдет следующее:будет напечатан заголовок группы. При этом FastReport напечатает нулевой
(неправильный) итог и запомнит это место в готовом отчете;будут напечатаны все строки данных группы;будет напечатан подвал группы. В этот момент FastReport возьмет ранее запомненный
объект и обработает его еще раз, на этот раз с правильным значением итога.
Готовый отчет выглядит так:Аналогичным образом можно печатать итог по всему отчету в его заголовке (установите
ProcessAt = ReportFinished) или итог по странице в заголовке страницы (ProcessAt =PageFinished).
Механизм отложенной печати не работает, если включен файловый кэш (меню "Отчет/Свойства...", флажок "Использовать файловый кэш").

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

Работа с данными

245

типа "Текст".
Наиболее частые способы использования параметров:фильтрация данных по условию, заданному в параметре;печать значения параметра в отчете.
Параметр имеет следующие свойства:Свойство

Описание

NameИмя параметра может содержать любые символы, кроме точки ".".

DataTypeТип данных параметра.

ExpressionВыражение, которое возвращает значение параметра. Подробнеео выражениях смотрите в главе "Выражения". Это выражение
будет вычислено при обращении к параметру.

ValueЗначение параметра. Это свойство недоступно в дизайнере иможет быть заполнено программным способом.

Вы должны настроить свойства Name и DataType. Свойство Expression можно оставить
пустым. В этом случае значение параметра надо передавать программным способом.

Создание параметра
Чтобы создать параметр, выберите элемент "Параметры отчета" в окне "Данные" ивыберите пункт "Новый параметр" в контекстном меню:Нажмите клавишу F2 и задайте желаемое имя параметра, затем переключитесь в окно"Свойства" и укажите тип данных параметра (свойство DataType).
Параметры могут быть вложенными. Чтобы создать вложенный параметр, выберите
родительский параметр и выберите пункт "Новый параметр" в контекстном меню:При этом можно обращаться как к родительскому параметру, так и к вложенному.
Количество уровней вложенности не ограничено.

Использование параметров в отчетеК параметру можно обращаться из выражения, используя квадратные скобки:[Им я па ра м е т ра ]
К вложенному параметру надо обращаться следующим образом:246Работа с данными

[Родит е льс кий па ра м е т р.Д оч е рний па ра м е т р]Так как параметр имеет определенный тип (он задан в свойстве DataType), с параметром
можно выполнять действия, разрешенные для типа данных. Так, параметры строкового
типа можно использовать в выражении следующим образом:[Ст роков ый па ра м е т р].Subst ring(0, 2)Рассмотрим пример использования параметра. Допустим, у нас есть отчет, печатающий
таблицу Employees (Сотрудники). Мы хотим распечатать информацию о сотруднике суказанным номером (поле EmployeeID). Для этого создадим параметр с именем "Номер
сотрудника". Укажем тип параметра – Int32, так как именно этот тип имеет полеEmployeeID. Чтобы отфильтровать сотрудника с указанным номером, зайдем в редактор
бэнда "Данные" и на закладке "Фильтр" укажем следующее выражение:[Em ploy e e s.Em ploy e e ID] == [Ном е р с от ру дника ]Чтобы передать значение параметра из вашей программы в отчет, используйте следующий
код:
report1.SetParameterValue("Номер сотрудника", 2);Работа с данными

247

Глава

IVВыражения

ВыраженияВо многих местах в FastReport используются выражения. Так, объект "Текст" может
содержать выражения, обрамленные квадратными скобками.
Выражение – это строка кода на языке C# или VB.Net, которая возвращает какое-либозначение. Например:2 +2Выражение должно быть написано на том языке, который выбран в качестве скрипта вданном отчете. По умолчанию это C#. Сменить язык можно в меню "Отчет|Свойства…",
выбрав в окне элемент "Скрипт":250Выражения

Редактор выраженийДля удобства написания выражения используйте редактор выражений. Его можно
вызывать в тех местах интерфейса FastReport, где поддерживается ввод выражений:Редактор выражений представляет собой окно, в котором можно ввести текст выраженияи вставить в него элементы из окна "Данные":Обращение к объектам отчетаДля обращения к объектам отчета (например, объекту "Текст") используйте имя объекта.
Следующий пример вернет высоту объекта Text1:

T e xt 1.He ightДля обращения к свойствам отчета используйте переменную Report. Следующий пример
вернет имя файла, из которого был загружен отчет:Re port .F ile Na m eВыражения

251Кроме этого, вы можете обращаться к вложенным свойствам объекта. Следующий пример
вернет название отчета:Re port .Re port Info.Na m eИспользование функций .NetВы можете использовать любые объекты .Net в выражениях. Следующий пример
демонстрирует использование функции Max:M a t h.M a x(5, 10)По умолчанию отчет использует следующие сборки .Net:

Sy st e m .dll
Sy st e m .Dra w ing.dll
Sy st e m .Window s.F orm s.dll
Sy st e m .Da t a .dll
Sy st e m .X m l.dll
Вам доступны все объекты .Net, объявленные в этих сборках. Если вам нужно получить
доступ к другой сборке, добавьте ее название в список сборок отчета. Это можно сделатьв меню "Отчет|Свойства…", выбрав в окне элемент "Скрипт".

Например, если вы хотите использовать в отчете функцию, объявленную в вашем
приложении, добавьте ссылку на сборку приложения (.exe или .dll) в список сборок
отчета. После этого можно обращаться к функции, используя пространство имени
(namespace) вашего приложения. Например, если в приложении определена следующая
функция:namespace Demo{public static class MyFunctions{
public static string Func1(){
return "Hello!";}}}Обратиться к ней в отчете можно так:252

Выражения

De m o.M y F unc t ions.F unc 1()Если добавить в скрипт директиву "using Demo", это позволит укоротить форму обращенияк функции:M y F unc t ions.F unc 1()Для обращения к переменным или функциям, которые были вами определены в скрипте
отчета, используйте имя переменной или функции:m y Priv a t e V a ria ble T ha t IHa v e De c la re dInSc ript
M y Sc ript F unc t ion()Использовать в выражении можно функции, которые возвращают значение.

Обращение к данным отчета
Помимо стандартных языковых элементов, в выражениях можно использовать следующие
элементы отчета:поля источников данных;системные переменные;итоговые значения;параметры отчета.
Все эти элементы содержатся в окне "Данные". Подробнее о работе с ними читайте вглаве "Данные".
Любой из этих элементов можно использовать в выражении, заключив его в квадратные
скобки. Например:[Pa ge ] + 1
Это выражение возвращает номер следующей печатаемой страницы. В выражении
используется системная переменная Page, которая возвращает номер текущей страницы
отчета. Она заключена в квадратные скобки.

Обращение к источникам данныхДля обращения к полям источников данных используется следующая форма записи:[Им я ис т оч ника .Им я поля ]Имя источника отделяется от имени поля точкой, например:[Em ploy e e s.F irst Na m e ]Имя источника может быть составным в случае, если мы обращаемся к источнику данных,используя связь (relation). Подробнее о связях рассказано в главе "Данные". Например,так можно обратиться к полю связанного источника данных:[Produc t s.Ca t e gorie s.Ca t e gory Na m e ]Выражения

253

Рассмотрим следующий пример использования полей в выражении:[Em ploy e e s.F irst Na m e ] + “ “ + [Em ploy e e s.La st Na m e ]Здесь надо сделать важное замечание. Каждое поле имеет определенный тип данных - онзадается в свойстве DataType поля (его можно увидеть в окне "Свойства", еслипредварительно выбрать поле данных в окне "Данные"). От того, какой тип имеет поле,зависит, каким образом его можно использовать в выражении. Так, в примере выше, обаполя (имя и фамилия) имеют строковый тип и поэтому их допустимо использовать таким
образом. В следующем примере мы попробуем использовать поле Employees.Age числового
типа, что приведет к ошибке:[Em ploy e e s.F irst Na m e ] + “ “ + [Em ploy e e s.Age ]Ошибка происходит потому, что нельзя напрямую складывать строку и число. Для этого
число надо явным образом преобразовать в строку:[Em ploy e e s.F irst Na m e ] + “ “ + [Em ploy e e s.Age ].T oSt ring()В данном случае мы обращаемся с полем Employees.Age так, будто это целочисленная
переменная. Так оно и есть. Мы уже знаем, что все выражения компилируются висполняемый код. Все нестандартные с точки зрения компилятора вещи (вроде обращенияк системным переменным и полям данных) конвертируются в другой вид, понятный
компилятору. Так, последнее выражение будет преобразовано в следующий вид:(string)(Report.GetColumnValue("Employees.FirstName")) + " " +(int)(Report.GetColumnValue("Employees.Age")).ToString()Как видно, FastReport при компиляции выражений заменяет обращения к полям данных
следующим образом:[Em ploy e e s.F irst Na m e ] --> (string)(Report.GetColumnValue("Employees.FirstName"))[Em ploy e e s.Age ] --> (int)(Report.GetColumnValue("Employees.Age"))То есть, мы можем использовать поле БД в выражениях, как будто это переменная,имеющая определенный тип. Например, следующее выражение вернет первый символ
имени сотрудника:[Em ploy e e s.F irst Na m e ].Subst ring(0, 1)Обращение к системным переменнымВ выражениях можно использовать следующие системные переменные (они доступны вокне "Данные"):ПеременнаяТип данных .NetОписание

Date

DateTimeДата и время старта отчета.

Page

int

Номер текущей страницы.

intОбщее количество страниц в отчете. Чтобы
использовать эту переменную, надо включить
двойной проход у отчета. Это можно сделать вменю "Отчет|Свойства…".

TotalPages

254Выражения

PageNstringНомер страницы в виде: "Страница N".

PageNofM

stringНомер страницы в виде: "Страница N из M".

intНомер строки данных внутри группы. Это значение
сбрасывается при старте новой группы.

intАбсолютный номер строки данных. Это значение несбрасывается при старте новой группы.

Row#
AbsRow#Каждая переменная имеет определенный тип данных, от этого зависит, как ее можно
использовать в выражении. Вот пример выражения, в котором используется дата:[Da t e ].Y e a rЭто выражение возвращает текущий год. Так как переменная Date имеет тип DateTime, мыможем обратиться к ее свойству Year. Аналогичным образом можно получить текущий
месяц ([Date].Month).
FastReport преобразует обращение к системной переменной в следующий вид (на примере
переменной Date):((DateTime)Report.GetVariableValue("Date"))Обращение к итоговым значениямДля обращения к итоговому значению используйте его имя:[T ot a lSa le s]При этом FastReport преобразует обращение к итогу в следующую форму:Report.GetTotalValue("TotalSales")Как видно, здесь тип значения не используется. Это потому, что итоговое значение имеет
тип FastReport.Variant. Оно может быть напрямую использовано в любых выражениях,потому что тип FastReport.Variant автоматически приводится к любому типу. Например:[T ot a lSa le s] * 0.2f

Обращение к параметрам отчетаДля обращения к параметру отчета используйте его имя:[Pa ra m e t e r1]Параметры могут быть вложенными. В этом случае указывается имя родительского
параметра и через точку имя дочернего параметра:[Pa re nt Pa ra m e t e r.ChildPa ra m e t e r]Параметры, как и поля данных, и системные переменные, имеют определенный тип данных.
Он задается в свойстве DataType параметра. От того, какой тип данных имеет параметр,зависит, как его можно использовать в выражении.
FastReport преобразует обращение к параметру отчета в следующий вид (на примере

Выражения

255

строкового параметра):((string)Report.GetParameterValue("Parameter1"))

256Выражения

Глава

VСкрипт

Скрипт
Скрипт – это программа на языке высокого уровня, которая является частью отчета.
Скрипт может быть написан на одном из языков .Net:
C#
VisualBasic.NetОбласть применения скрипта довольно обширна. Используя скрипт, вы можете сделать
следующее:выполнить обработку данных, которую невозможно сделать штатными средствами ядраFastReport;управлять печатью страниц отчета и бэндов на странице;управлять взаимодействием элементов управления на диалоговых формах;управлять формированием динамических объектов "Таблица";и многое другое.
Чтобы увидеть скрипт отчета, переключитесь на закладку "Код" в дизайнере:258

Скрипт

Язык скрипта настраивается в меню "Отчет|Свойства...". Делать это нужно сразу после
того как вы создали новый отчет, так как при смене языка существующий скрипт
очищается.

Скрипт

259

Общая информацияВ отличие от других генераторов отчетов, скрипт в FastReport содержит только то, чтонаписано вами. В скрипте вы можете:добавлять в главный класс скрипта свои переменные, методы, свойства;создавать обработчики событий объектов отчета;добавлять новые классы в скрипт, если это необходимо. Класс может быть добавлен какперед главным классом ReportScript, так и после него.
Вы не можете:удалять, переименовывать или изменять область видимости главного класса
ReportScript;переименовывать пространство имен, в котором находится главный класс.
При запуске отчета происходит следующее:FastReport добавляет в скрипт список переменных, имена которых совпадают с именами
объектов отчета. Это делается перед компиляцией скрипта и позволяет вам обращатьсяк объектам отчета по их имени;в скрипт добавляются выражения, имеющиеся в отчете, в виде функций;выполняется компиляция скрипта, если он не пустой;инициализируются переменные, которые были неявно добавлены в скрипт;обработчики событий, определенные в скрипте, привязываются к объектам отчета;запускается отчет.

260Скрипт

Обработчики событий
Скрипт главным образом используется для создания обработчиков событий объектов. Длясоздания обработчика события выделите нужный объект. В окне "Свойства" нажмите
кнопку

, чтобы переключиться на список событий:Выберите интересующее вас событие и сделайте на нем двойной щелчок мышью.
FastReport добавит в код отчета пустой обработчик события:private void Text2_BeforePrint(object sender, EventArgs e){}Объект "Отчет" также имеет события. Выбрать этот объект можно следующими способами:выберите "Report" в окне "Дерево отчета";выберите "Report" в выпадающем списке объектов окна "Свойства".
Чтобы удалить обработчик события, выберите событие в окне "Свойства", выделите текст
имени события и нажмите клавишу Delete:События
Чтобы максимально гибко управлять отчетом, каждый объект отчета имеет несколько
событий, которым можно назначить обработчик – метод из скрипта. Например, вобработчике, привязанном к бэнду "Данные", можно выполнять фильтрацию записей, т.е.
скрывать или показывать бэнд в зависимости от каких-либо условий.
Рассмотрим процесс формирования отчета и события, которые при этом генерируются. Вкачестве примера возьмем простой отчет, содержащий одну страницу, один бэнд "Данные"и два объекта "Текст" на бэнде:Скрипт

261

В начале отчета вызывается событие StartReport объекта "Отчет". Перед формированием
страницы вызывается событие страницы StartPage. Это событие вызывается один раз длякаждой страницы шаблона отчета (не путать со страницами готового отчета!). В нашем
случае, сколько бы ни было страниц в готовом отчете – событие вызовется один раз, т.к.
шаблон отчета состоит из одной страницы.
Далее начинается печать строк бэнда "Данные". Происходит это следующим образом:1. вызывается событие бэнда BeforePrint;
2. вызываются события BeforePrint всех объектов, лежащих на бэнде;3. все объекты заполняются данными;4. вызываются события AfterData всех объектов, лежащих на бэнде;5. вызывается событие бэнда BeforeLayout;
6. происходит размещение объектов на бэнде (если среди них есть растягиваемые
объекты) и подсчет высоты бэнда и его растягивание (если бэнд растягиваемый);7. вызывается событие бэнда AfterLayout;
8. если бэнд не помещается на свободном месте страницы, формируется новая страница;9. бэнд и все его объекты выводятся на страницу готового отчета;10.вызывается событие AfterPrint бэнда;11.вызывается событие AfterPrint всех объектов бэнда.
Печать строк бэнда происходит до тех пор, пока есть данные в источнике. После этого
формирование отчета в нашем случае завершается и вызываются события FinishPageстраницы отчета и наконец – событие FinishReport объекта "Отчет".
Таким образом, используя события разных объектов, можно контролировать практически
каждый момент формирования отчета. Ключ к правильному использованию событий –полное понимание процесса печати бэндов, изложенного выше в одиннадцати пунктах.
Так, большинство действий можно выполнить, используя только событие бэнда BeforePrint– любые изменения, внесенные в объект, будут тут же отображены. Но в этом событии
невозможно анализировать, на какой странице будет напечатан бэнд, если онрастягиваемый – ведь подсчет высоты бэнда будет выполнен в пункте 6. Это можно
сделать с помощью событий AfterLayout в пункте 7 или AfterPrint в пункте 10, но впоследнем случае бэнд уже будет напечатан и действия над объектами ничего не дадут.
Одним словом, вы должны четко представлять, в какой момент времени вызывается
каждое из событий и использовать те, которые соответствуют поставленной задаче.

Обращение к объектам .NetИз скрипта вы можете обращаться к любым объектам .Net, которые определены вследующих сборках:Sy st e m .dll
Sy st e m .Dra w ing.dll
Sy st e m .Window s.F orm s.dll
Sy st e m .Da t a .dll
Sy st e m .X m l.dll
Кроме того, вы можете использовать любые объекты, определенные в сборках FastReport.
Если вам нужно получить доступ к другой сборке, добавьте ее название в список сборок
отчета. Это можно сделать в меню "Отчет|Свойства…", выбрав в окне элемент "Скрипт".

262

Скрипт

Например, если вы хотите использовать в скрипте функцию, объявленную в вашем
приложении, добавьте ссылку на сборку приложения (.exe или .dll) в список сборок
отчета. После этого можно обращаться к функции, используя пространство имени
(namespace) вашего приложения. Например, в приложении определена следующая
функция:namespace Demo{public static class MyFunctions{
public static string Func1(){
return "Hello!";}}}Обратиться к ней в скрипте можно так:string hello = Demo.MyFunctions.Func1();Если добавить в скрипт директиву "using Demo", это позволит укоротить форму обращенияк функции:string hello = MyFunctions.Func1();Обращение к объектам отчетаДля обращения к объектам отчета (например, объекту "Текст") используйте имя объекта.
Следующий пример вернет высоту объекта Text1:
float height = Text1.Height;Учтите, что "родными" единицами измерения отчета являются экранные пикселы. Выдолжны это помнить при обращении к таким свойствам объектов, как Left, Top, Width,
Height. Для перевода пикселов в сантиметры и обратно используйте константы,определенные в классе Units:
float heightInPixels = Text1.Height;
float heightInCM = heightInPixels / Units.Centimeters;
Text1.Height = Units.Centimeters * 5; // 5смСкрипт

263

Объекты Report и EngineКроме объектов, которые содержатся в отчете, в скрипте определены две переменные:Report и Engine.
Переменная Report возвращает ссылку на текущий отчет. В таблице ниже приведен
список методов объекта Report:МетодОписание

object Calc(
string expression)Вычисляет выражение и возвращает значение. Привызове этого метода первый раз выражение
компилируется, что требует некоторого времени.

object GetColumnValue(
string complexName)Возвращает значение поля источника данных. Имядолжно быть представлено в форме "Источник.Поле".
Если поле имеет значение null, оно преобразуется взначение по умолчанию (0, пустая строка, false идр).

object GetColumnValueNullable(
string complexName)Возвращает значение поля источника данных. Вотличие от предыдущего метода, не выполняет
преобразование null-значений.

Parameter GetParameter(
string complexName)Возвращает параметр отчета с указанным именем.
Имя может быть составным при обращении квложенному параметру: "MainParam.NestedParam".

object GetParameterValue(
string complexName)Возвращает значение параметра отчета с указанным
именем.

void SetParameterValue(
string complexName,
object value)Устанавливает значение параметра отчета суказанным именем.

object GetVariableValue(
string complexName)Возвращает значение системной переменной,например, "Date".

object GetTotalValue(
string name)Возвращает значение итога, определенного в окне"Данные", по его имени.

DataSourceBase GetDataSource(
string alias)Возвращает источник данных, определенный вотчете, по его имени.

Объект Engine представляет собой движок, управляющий построением отчета. Используя
свойства и методы движка, можно управлять процессом размещения бэндов на странице.
Вы можете использовать следующие свойства объекта Engine:Свойство

Описание

float CurX

Текущее смещение координат по оси X. Этому
свойству можно присваивать значение, чтобы
смещать печатаемые объекты.

float CurYТекущая позиция печати по оси Y. Этому свойству
можно присваивать значение, чтобы смещать
печатаемые объекты.

264Скрипт

int CurColumnНомер текущей колонки в многоколоночном отчете.
Первая колонка имеет номер 0.

int CurPageНомер текущей печатаемой страницы. Это значение
можно получить из системной переменной Page.

float PageWidthШирина страницы минус размер левого и правого
полей.

float PageHeightВысота страницы минус размер верхнего и нижнего
полей.

float PageFooterHeightВысота подвала страницы (и всех его дочерних
бэндов).

float ColumnFooterHeightВысота подвала колонки (и всех ее дочерних
бэндов).

float FreeSpaceРазмер свободного места на странице.

bool FirstPassВозвращает true, если выполняется первый (илиединственный) проход отчета. Количество проходов
можно получить из свойства Report.DoublePass.

bool FinalPassВозвращает true, если выполняется последний (илиединственный) проход отчета.

На рисунке ниже представлено изображение страницы отчета и название свойств,которые возвращают то или иное измерение страницы.

Свойства Engine.PageWidth, Engine.PageHeight определяют размер области печати, которая
почти всегда меньше физических размеров страницы. Размер области печати определяют
поля страницы, которые задаются свойствами страницы отчета LeftMargin, TopMargin,
RightMargin, BottomMargin.
Свойство Engine.FreeSpace определяет высоту свободного места на странице. Если настранице есть бэнд "Подвал страницы", его высота учитывается при вычислении
FreeSpace. Следует учесть, что после вывода очередного бэнда свободное место настранице уменьшается, что учитывается при вычислении FreeSpace.

Скрипт

265

Как происходит формирование страниц готового отчета? Ядро FastReport выводит бэнды настраницу до тех пор, пока на ней остается свободное место, достаточное для вывода
бэнда. Когда свободного места не остается, печатается бэнд "Подвал страницы" (если онесть) и формируется новая пустая страница. Как уже говорилось, после вывода
очередного бэнда высота свободного места уменьшается. Кроме того, вывод очередного
бэнда начинается с текущей позиции, которая определяется координатами по оси X и Y.
Эта позиция возвращается в свойствах Engine.CurX, Engine.CurY. После печати очередного
бэнда позиция CurY автоматически увеличивается на высоту напечатанного бэнда. После
формирования новой страницы позиция CurY = 0. Позиция CurX изменяется при печати
многоколоночных отчетов.
Свойства Engine.CurX, Engine.CurY доступны не только для чтения, но и для записи. Этозначит, что можно смещать бэнды вручную, используя одно из подходящих событий.
Пример использования этих свойств смотрите в разделе "Примеры".
При работе со свойствами, которые возвращают размер, учтите, что в FastReportиспользуются единицы измерения - экранные пикселы.
В объекте Engine определены следующие методы:МетодОписание

void AddOutline(string text)Добавляет элемент в структуру отчета (см. главу
"Интерактивные отчеты") и смещает текущую
позицию на добавленный элемент.

void OutlineRoot()Смещает текущую позицию на корень структуры.

void OutlineUp()Смещает текущую позицию на уровень выше.

void AddBookmark(string name)Добавляет закладку (см. главу "Интерактивные
отчеты").

int GetBookmarkPage(string name)Возвращает номер страницы, на которой
расположена закладка с указанным именем.

void StartNewPage()Добавляет в отчет разрыв страницы. Если отчет
многоколоночный, добавляется новая колонка.

Используя методы AddOutline, OutlineRoot, OutlineUp, можно формировать структуру отчета
программным способом. Обычно это делается автоматически с помощью свойства
OutlineExpression, которое имеется у каждого бэнда и у страницы отчета.
Метод AddOutline добавляет к текущему узлу структуры дочерний узел и делает еготекущим. С элементом ассоциируется текущая страница отчета и текущая позиция настранице. Таким образом, если несколько раз подряд вызвать AddOutline, то получится
"лесенка" типаIt e m 1
It e m 2
It e m 3Для управления текущим элементом служат методы OutlineUp и OutlineRoot. Первый метод
перемещает указатель на элемент, расположенный уровнем выше. Так, скриптEngine.AddOutline("Item1");
Engine.AddOutline("Item2");
Engine.AddOutline("Item3");

266

Скрипт

Engine.OutlineUp();Engine.AddOutline("Item4");построит структуру видаIt e m 1
It e m 2
It e m 3
It e m 4Метод OutlineRoot передвигает текущий элемент в корень структуры. Например, скрипт:Engine.AddOutline("Item1");
Engine.AddOutline("Item2");
Engine.AddOutline("Item3");
Engine.OutlineRoot();
Engine.AddOutline("Item4");построит структуру следующего вида:It e m 1
It e m 2
It e m 3
It e m 4Для работы с закладками используются методы AddBookmark и GetBookmarkPage объектаEngine. Обычно закладки добавляются автоматически при использовании свойства
Bookmark, которое имеется у всех объектов отчета.
Используя метод AddBookmark, можно добавлять закладку программно. Этот метод создаст
закладку на текущей странице, в текущей позиции печати.
Метод GetBookmarkPage возвращает номер страницы, на которой расположена закладка.
Этот метод часто применяется при создании оглавлений, для отображении номеров
страниц. В этом случае отчет должен быть двухпроходным.

Обращение к источникам данныхВ отличие от выражений FastReport (они рассмотрены в главе "Выражения"), в скрипте
нельзя использовать квадратные скобки для обращения к данным отчета. Вместо этого
используется метод GetColumnValue объекта Report, возвращающий значение поля:string productName = (string)Report.GetColumnValue("Products.Name");Как видно, надо указать имя источника данных и его поля через точку. Имя источника
может быть составным в случае, если мы обращаемся к источнику данных, используя
связь (relation). Подробнее о связях рассказано в главе "Данные". Например, так можно
обратиться к полю связанного источника данных:string categoryName = (string)Report.GetColumnValue("Products.Categories.CategoryName");Для облегчения работы используйте окно "Данные". Из него можно перетаскивать
элементы данных в скрипт, при этом FastReport автоматически создает код для обращенияк элементу.

Скрипт

267

Для обращения к самому источнику данных используйте метод GetDataSource объекта
Report:
DataSourceBase ds = Report.GetDataSource("Products");

Справку по свойствам и методам класса DataSourceBase можно получить в справочной
системе FastReport.Net Class Reference. Как правило, этот объект используется в скрипте
следующим образом:// получаем ссылку на источник данных
DataSourceBase ds = Report.GetDataSource("Products");// инициализируем его
ds.Init();// перебираем все записи в источнике
while (ds.HasMoreRows){// получаем значение поля для текущей записи источника
string productName = (string)Report.GetColumnValue("Products.Name");// выполняем с ним какие-то действия...
// ...
// переходим на следующую запись
ds.Next();}Обращение к системным переменнымДля обращения к системной переменной используйте метод GetVariableValue объекта
Report:
DateTime date = (DateTime)Report.GetVariableValue("Date");Список системных переменных можно увидеть в окне "Данные". Из него можно
перетаскивать переменные в скрипт, при этом FastReport автоматически создает код дляобращения к переменной.

Обращение к итоговым значениямДля обращения к итоговому значению используйте метод GetTotalValue объекта Report:
float sales = Report.GetTotalValue("TotalSales");Список итогов можно увидеть в окне "Данные". Из него можно перетаскивать итоги вскрипт, при этом FastReport автоматически создает код для обращения к итогу.
Итоговое значение имеет тип FastReport.Variant. Оно может быть напрямую использованов любых выражениях, потому что тип FastReport.Variant автоматически приводится клюбому типу. Например:float tax = Report.GetTotalValue("TotalSales") * 0.2f;

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

268

Скрипт

Обращение к параметрам отчетаДля обращения к параметру отчета используйте метод GetParameterValue объекта Report:
int myParam = (int)Report.GetParameterValue("MyParameter");Параметры могут быть вложенными. В этом случае укажите имя родительского параметраи через точку имя дочернего параметра:Report.GetParameterValue("ParentParameter.ChildParameter")Параметры имеют определенный тип данных. Он задается в свойстве DataType параметра.
Вы должны учитывать это при обращении к параметру. Список параметров можно увидетьв окне "Данные". Из него можно перетаскивать параметры в скрипт, при этом FastReportавтоматически создает код для обращения к параметру.
Для изменения значения параметра используйте метод SetParameterValue объекта Report:
Report.SetParameterValue("MyParameter", 10);Скрипт

269

Примеры использования

Пример 1. Изменение внешнего вида объектаВ этом примере мы покажем, как изменить цвет текста у объекта в зависимости отзначения, которое печатается в объекте. Мы будем использовать:событие BeforePrint;обращение к полю БД из скрипта.
Создайте простой отчет следующего вида:У объекта, который печатает стоимость продукта, создайте обработчик события
BeforePrint:
private void Text2_BeforePrint(object sender, EventArgs e){
if (((Decimal)Report.GetColumnValue("Products.UnitPrice")) > 20)
Text2.TextColor = Color.Red;}Чтобы вставить в скрипт значение поля "Products.UnitPrice", перетащите его из окна"Данные". При этом в скрипт будет вставлена строка:((Decimal)Report.GetColumnValue("Products.UnitPrice"))Если запустить отчет, мы увидим, что все продукты, имеющие стоимость > 20, выделены
красным цветом:Такого же эффекта можно достичь с помощью условного выделения (подробнее об этомчитайте в разделе "Условное выделение").

270

Скрипт

Пример 2. Выделение четных строк бэндаВ этом примере мы покажем, как изменить цвет заливки у четных строк бэнда "Данные".
Мы будем использовать:событие BeforePrint бэнда;обращение к системной переменной "Row#" из скрипта.
Создайте простой отчет следующего вида:У бэнда создайте обработчик события BeforePrint:
private void Data1_BeforePrint(object sender, EventArgs e){
if (((Int32)Report.GetVariableValue("Row#")) % 2 == 0)
Data1.FillColor = Color.Gainsboro;}Системная переменная "Row#" возвращает номер строки печатаемого бэнда. Чтобы
вставить в скрипт обращение к переменной, перетащите его из окна "Данные". При этомв скрипт будет вставлена строка:((Int32)Report.GetVariableValue("Row#"))Если запустить отчет, мы увидим, что четные строки бэнда выделены серым цветом:Такого же эффекта можно достичь, используя свойство бэнда "EvenStyle". Подробнее обэтом читайте в разделе "Выделение строк данных через одну".

Пример 3. Фильтрация данныхВ этом примере мы покажем, как спрятать строки бэнда "Данные" в зависимости отусловия. Мы будем использовать:событие BeforePrint бэнда;обращение к полю БД из скрипта.
Создайте простой отчет следующего вида:Скрипт

271

У бэнда создайте обработчик события BeforePrint:
private void Data1_BeforePrint(object sender, EventArgs e){
if (((Decimal)Report.GetColumnValue("Products.UnitPrice")) > 20)
Data1.Visible = false;}В данном случае будут спрятаны строки бэнда, для которых стоимость продукта > 20:Такого же эффекта можно достичь, используя условие фильтрации данных, которое
можно настроить в редакторе бэнда "Данные".

Пример 4. Вычисление итоговВ этом примере мы покажем, как программным способом вычислить суммарное значение.
Мы будем использовать:событие BeforePrint бэнда;обращение к полю БД из скрипта;локальную переменную, значение которой будет печататься в отчете.
Создайте отчет следующего вида:В скрипте объявите переменную "summa" и создайте у бэнда обработчик события
BeforePrint:
public class ReportScript272Скрипт

{
private decimal summa;
private void Data1_BeforePrint(object sender, EventArgs e){summa += (Decimal)Report.GetColumnValue("Products.UnitPrice");}}Поле таблицы Products.UnitPrice можно вставить в скрипт, перетащив его из окна"Данные".
Если запустить отчет, мы увидим следующее:Такого же эффекта можно достичь, используя итоги. Смотрите подробнее в главе
"Данные".

Пример 5. Смещение позиции печатиВ этом примере мы покажем, как можно смещать бэнды вручную, используя свойства
объекта Engine. Мы будем использовать:событие BeforePrint бэнда;объект Engine.
Создайте простой отчет следующего вида:У бэнда создайте обработчик события BeforePrint:
private void Data1_BeforePrint(object sender, EventArgs e){
Engine.CurX = ((Int32)Report.GetVariableValue("Row#")) * 10;}Запустите отчет на выполнение, и вы увидите следующее:Скрипт

273

274

Скрипт

Глава

VIДиалоговые формы

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

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

Элементы управленияНа диалоговой форме можно использовать следующие элементы управления:Иконка

276

Название

Описание

ButtonControlПредставляет собой кнопку.

CheckBoxControlПредставляет собой флажок, имеющий двасостояния (включен/выключен).

CheckedListBoxControlПредставляет собой список строк с флажками.

Диалоговые формы

ComboBoxControlПредставляет собой выпадающий список.

DataGridViewControlОтображает данные в табличном виде.

DataSelectorControlПоказывает два списка и позволяет переносить
строки из одного списка в другой.

DateTimePickerControlПозволяет ввести дату или время.

GroupBoxControlПозволяет сгруппировать другие элементы
управления.

LabelControlПредставляет собой поясняющую надпись.

ListBoxControlПредставляет собой список строк.

ListViewControlПредставляет собой список строк с иконками.

MaskedTextBoxControlПозволяет ввести значение, используя маску
ввода.

MonthCalendarControlПредставляет собой календарь.

NumericUpDownControlПозволяет ввести числовое значение.

PanelControlПозволяет сгруппировать другие элементы
управления.

PictureBoxControlОтображает рисунок.

RadioButtonControlПредставляет собой зависимый переключатель,имеющий два состояния (включен/выключен).

RichTextBoxControlОтображает форматированный текст в форматеRTF.

TextBoxControlПредставляет собой поле для редактирования
однострочного или многострочного текста.

TreeViewControlПоказывает данные в иерархическом виде.

Все элементы управления, за исключением DataSelectorControl, являются полными
аналогами стандартных элементов управления, доступных в .Net Framework. Названия
элементов имеют приставку Control, чтобы избежать совпадения имен. Так, элементу
управления ButtonControl соответствует элемент Button из .Net Framework.

Обращение к элементу из кодаОбратиться к элементу можно, используя его имя:TextBoxControl1.Text = "my text";

По сути, элемент управления FastReport является оберткой над стандартным элементом
управления .Net Framework. Он реализует многие, но не все, свойства стандартного
элемента. Если реализованных свойств вам не достаточно, вы можете обратиться кДиалоговые формы

277

стандартному элементу следующим образом:используя свойство Control, которое возвращает тип System.Windows.Forms.Control:(TextBox1.Control as TextBox).ShortcutsEnabled = false;используя свойство, имя которого совпадает с именем элемента без приставки "Control".
Например, для элемента TextBoxControl свойство TextBox возвращает стандартный
элемент типа System.Windows.Forms.TextBox:
TextBox1.TextBox.ShortcutsEnabled = false;Справку по свойствам и методам элементов управления можно получить в MSDN.

Фильтрация данных
Один из способов использования диалогов - это фильтрация данных, выводимых в отчете.
Например, имеется отчет, печатающий список всех сотрудников. Используя диалог,можно дать пользователю возможность выбора одного или нескольких из них, затем припостроении отчета отфильтровать данные, чтобы показать выбранных сотрудников.
Для использования фильтрации необходимо, чтобы исходный отчет печатал все данные.
Само название "фильтрация" предполагает, что ненужные данные будут отброшены впроцессе построения отчета.
Самый простой способ организовать фильтрацию данных - использовать свойство Filterбэнда "Данные". В редакторе бэнда можно указать условие фильтрации, например:Используя диалог, можно запросить у пользователя значение и использовать его ввыражении фильтра. Смотрите пример "Простой фильтр" в разделе "Примеры".
Этот способ можно использовать, если нужно запросить одно простое значение. Если жестоит задача показать пользователю список значений и запросить одно или несколько изних, реализовать это становится довольно тяжело. Казалось бы, простая задача показать пользователю список сотрудников в элементе управления ListBoxControl и

278Диалоговые формы

выбрать одно или несколько значений. Для реализации этого надо использовать скрипт,который выполнит следующее:получит источник данных по его имени;инициализирует данные;заполнит список ListBoxControl имеющимися в источнике значениями;после выбора сотрудников сформирует условие для фильтрации.
FastReport позволяет выполнить все эти действия автоматически, без написания какоголибо кода. Для этого используется автоматическая фильтрация, которую мы сейчас
рассмотрим.

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

Название
CheckBoxControl
CheckedListBoxControl
ComboBoxControl
DataSelectorControl
DateTimePickerControl
ListBoxControl
MaskedTextBoxControl
MonthCalendarControl
NumericUpDownControl
RadioButtonControl
TextBoxControlДиалоговые формы

279

Операция фильтраПо умолчанию FastReport фильтрует строки данных, которые содержат значения, равные
значению элемента управления. Это настраивается с помощью свойства "FilterOperation"элемента управления. В этом свойстве указывается операция которая будет использованапри фильтрации данных. Вы можете использовать следующие операции:Операция

Эквивалент

Действие

Equal=Выбрать значения, равные значению элемента
управления.

NotEqual<>Выбрать значения, не равные значению
элемента.

LessThan<Выбрать значения, меньшие чем значение
элемента.

LessThanOrEqual<=Выбрать значения, меньшие чем или равные
значению элемента.

GreaterThan>Выбрать значения, бОльшие чем значение
элемента.

GreaterThanOrEqual>=Выбрать значения, бОльшие чем или равные
значению элемента.

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

Действие

ContainsВыбрать строки, содержащие значение из элемента управления.

NotContainsВыбрать строки, не содержащие значение из элемента.

StartsWithВыбрать строки, начинающиеся со значения из элемента.

NotStartsWithВыбрать строки, не начинающиеся со значения из элемента.

EndsWithВыбрать строки, заканчивающиеся значением из элемента.

NotEndsWithВыбрать строки, не заканчивающиеся значением из элемента.

Например, если свойство FilterOperation элемента управления установлено в StartsWith ивы ввели в элемент значение A, то будут выбраны все строки данных, для которых
значение фильтруемого поля начинается на A.

280

Диалоговые формы

Добавление фильтра в отчет
Дизайнер диалогов FastReport имеет удобные средства для добавления элементов
управления, которые поддерживают фильтрацию данных, на диалог. Для этого перетащите
(drag&drop) поле данных, которое вас интересует, из окна "Данные" на диалоговую форму.
При этом FastReport создаст заголовок (элемент управления LabelControl) и собственно
элемент, фильтрующий данные:Тип элемента в данном случае зависит от того, какой тип имеет поле данных. Если полестрокового типа, то после его вставки будет предложено выбрать тип элемента:Если перетащить на диалог два одинаковых элемента, связанные с одним и тем же полем
данных, FastReport автоматически настроит диапазон данных с помощью свойства
FilterOperation. У первого добавленного элемента установится FilterOperation =GreaterThanOrEqual, у второго - LessThanOrEqual. Это будет сделано в случае, если выдобавляете поле не строкового типа.
Таким образом, для добавления фильтрации в любой отчет вам нужно сделать
следующее:добавить в отчет новый диалог;перетащить на диалог поле данных, по которому вы хотите отфильтровать отчет.

Фильтрация по диапазону значений
Этот способ фильтрации удобно использовать при работе со значениями, имеющими
количественную характеристику, например, стоимость. Таким образом можно
отфильтровать товар, имеющий стоимость ниже или выше заданной. Для того чтобы
указать, как следует трактовать введенное в элемент значение, используется свойство
FilterOperation, рассмотренное выше.
Используя два элемента управления, которые подключены к одному и тому же полюданных и имеют разные настройки свойства FilterOperation, можно указать начало и конец

Диалоговые формы

281

диапазона данных. Для первого элемента надо указать свойство FilterOperation =GreaterThanOrEqual, для второго - LessThanOrEqual.

Фильтрация по связанному полюКак нам известно, между двумя источниками данных можно установить связь. Подробнееоб этом читайте в главе "Данные". С помощью связи можно фильтровать данные висточнике, используя для этого поле из другого, связанного источника.
Допустим, вы положили на диалог элемент управления ListBoxControl и указали в свойстве
DataColumn следующее поле данных:Produc t s.Ca t e gorie s.Ca t e gory Na m eКак будет работать фильтрация?
при заполнении элемента управления будет использовано поле CategoryName источника
данных Categories;при фильтрации данных будут отфильтрованы те строки источника данных Products, длякоторых верно условие:поле [Produc t s.Ca t e gorie s.Ca t e gory Na m e ] с оде рж ит одно из в ыбра нных польз ов а т е ле мз на ч е ний.

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

Для создания каскадного списка нужно два источника данных, связанных отношением
типа "главный-подчиненный" (подробнее об источниках и связях читайте в главе "Данные"). Первый список (главный) прикрепляется к полю из главного источника данных, второй

282

Диалоговые формы

список (подчиненный) - к полю подчиненного источника. Кроме того, надо настроить
свойство DetailControl главного списка, указав в нем подчиненный список.

Каскадную фильтрацию удобно применять к отчету типа master-detail. Если отчет другого
типа (например, с одним бэндом "Данные"), для корректной работы фильтрации нужно
будет использовать скрипт.

Управление фильтрацией из кодаХотя возможностей автоматической фильтрации достаточно для большинства случаев, увас есть возможность управлять фильтрацией вручную. Для этого используются
следующие свойства и методы.
Свойство AutoFill управляет заполнением элемента. Оно используется элементами,которые могут показывать список данных, например, ListBoxControl. Перед тем какпоказать диалог, FastReport заполняет данными такие элементы. По умолчанию свойство
равно true. Если его отключить, элемент заполняться не будет, и вы должны сделать этосами, вызвав метод FillData:
ListBox1.FillData();Свойство AutoFilter управляет фильтрацией данных. Оно используется всеми элементами
управления. После того как диалог закрыт кнопкой "ОК", FastReport выполняет
фильтрацию данных автоматически. По умолчанию свойство равно true. Если егоотключить, фильтрация выполняться не будет, и вы должны сделать это сами, вызвав
метод FilterData:
ListBox1.FilterData();Примеры использования

Пример 1. Диалог "Hello, FastReport!"В этом примере все, что мы сделаем - создадим диалог, который будет показывать
приветствие. Создайте новый отчет и добавьте в него диалог. Для этого нажмите кнопкуна панели инструментов:Диалоговые формы

283

На диалог положите элемент управления LabelControl и настройте его свойство Text вокне "Свойства":Если запустить отчет, вы увидите диалог. Закройте его кнопкой "ОК", и отчет будет
построен. Если закрыть диалог кнопкой "Отмена" или крестиком на заголовке, отчет
прекратит работу, и вы вернетесь в дизайнер.

Пример 2. Запрос строки у пользователяВ этом примере мы создадим диалог, который будет запрашивать произвольную строку
текста у пользователя, а затем печатать введенное значение в отчете.
Создайте новый отчет и добавьте в него диалог. На диалог положите элементы управления
LabelControl и TextBoxControl:284Диалоговые формыВ данном случае введенное нами значение содержится в свойстве Text элемента
управления TextBoxControl. Чтобы напечатать это значение в отчете, добавьте новый
объект "Текст" на бэнд "Заголовок отчета" и напишите в нем следующее:Вы в в е ли: [T e xt Box1.T e xt ]где TextBox1 - имя элемента управления TextBoxControl.

Пример 3. Управление элементами диалога
Используя скрипт и события элементов управления, можно управлять элементами так же,как это делается в Visual Studio. Покажем на примере, как с помощью элемента
CheckBoxControl управлять доступностью элемента TextBoxControl.
Создайте новый отчет и добавьте в него диалог. На диалог положите элементы
CheckBoxControl и TextBoxControl, как показано на рисунке:Теперь выберите элемент CheckBoxControl, откройте окно "Свойства" и нажмите кнопку
. Сделайте двойной щелчок на событии CheckedChanged, которое возникает приизменении состояния флажка. FastReport создаст пустой обработчик этого события.
Напишите в нем следующий код:private void CheckBox1_CheckedChanged(object sender, EventArgs e){
TextBox1.Enabled = CheckBox1.Checked;}

Если запустить отчет, мы увидим, что элемент TextBoxControl реагирует на состояние
флажка.

Диалоговые формы

285

Пример 4. Управление объектами отчета
Рассмотрим пример отчета, который печатает список категорий и продуктов в каждой
категории:Покажем, как с помощью диалога запретить печать продуктов и напечатать только
категории. Для этого добавьте в отчет диалог:Сделайте двойной щелчок на кнопке "ОК". FastReport создаст пустой обработчик события
Click кнопки. Напишите в нем следующий код:private void btnOk_Click(object sender, EventArgs e){
Data2.Visible = CheckBox1.Checked;}

Мы будем управлять видимостью бэнда, который печатает список продуктов. В нашем

286

Диалоговые формы

примере это бэнд с именем Data2. Если запустить отчет и выключить флажок, мы увидим
следующий результат:Пример 5. Простой фильтр
Рассмотрим следующий отчет, который печатает список продуктов:Покажем в этом примере, как отфильтровать список продуктов по первой букве названия
продукта. При этом мы не будем использовать средства автоматической фильтрации
данных. Для этого добавьте в отчет новый диалог и положите на него два элемента
управления - LabelControl и TextBoxControl:Теперь откроем редактор бэнда "Данные" и укажем следующее условие фильтрации:Диалоговые формы

287

После чего запустим отчет и убедимся, что все работает:Пример 6. Автоматическая фильтрацияВ этом примере покажем, как добавить фильтр в отчет, печатающий список продуктов изтаблицы Products. Фильтрация будет выполняться по полю Products.Discontinued.
Сам отчет имеет следующий вид:Добавьте в отчет новый диалог, нажав кнопкуна панели инструментов, и перетащитена него поле Products.Discontinued из окна "Данные":288

Диалоговые формы

Это все, что нам нужно сделать - мы уложились буквально в 2 клика мыши. FastReportавтоматически привязал элемент управления к полю данных.
Запустите отчет и включите флажок Discontinued. После этого нажмите кнопку "ОК", и выувидите отчет, который содержит только продукты с флагом Discontinued:Пример 7. Автоматическая фильтрация по диапазону
Покажем на отчете из предыдущего примера, как напечатать продукты, имеющие
стоимость в указанном диапазоне. Для этого добавим в отчет диалог и перетащим на негополе Products.UnitPrice. После этого поправим текст элемента:Теперь аналогичным образом добавьте еще одно поле Products.UnitPrice и поправьте егозаголовок:Диалоговые формы

289

Это все, что нам нужно сделать. Всю остальную работу сделал FastReport: привязал
элементы к полю данных и настроил их свойства FilterOperation. Первый элемент имеет
FilterOperation = GreaterThanOrEqual, второй - LessThanOrEqual.
Запустите отчет и укажите значения, например, от 20 до 30. При нажатии на кнопку "ОК"будет построен отчет. Он содержит продукты, имеющие стоимость в указанном намидиапазоне:Пример 8. Фильтрация по полю связанного источника данныхВ этом примере мы будем использовать для фильтрации источника данных поле, которое
содержится в связанном источнике.
Рассмотрим отчет типа "Простой список", который печатает список продуктов. Около
каждого продукта печатается название категории, в которую он входит. Это делается спомощью связи:[Produc t s.Ca t e gorie s.Ca t e gory Na m e ]Отчет выглядит следующим образом:290Диалоговые формы

При запуске отчета мы увидим следующее:Давайте добавим фильтрацию по названию категории. Для этого добавьте новый диалог иперетащите на него поле Products.Categories.CategoryName:При создании элемента управления будет предложено выбрать его тип. Выберите

Диалоговые формы

291

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

292

Диалоговые формы

Глава

VIIПросмотр, печать,экспорт

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

Описание
Печать отчета.
Открыть файл готового отчета в формате FPX.

294

Просмотр, печать, экспорт

Сохранить отчет в одном из поддерживаемых форматов.
Отправить отчет по email.
Поиск текста в отчете.
Показывает или скрывает структуру отчета.
Настройка параметров страницы.
Редактирование текущей страницы отчета.
Настройка параметров водяного знака.
Переход на первую страницу отчета.
Переход на предыдущую страницу отчета.
1Переход на указанную страницу отчета. Введите номер и нажмите
Enter.
Переход на следующую страницу отчета.
Переход на последнюю страницу отчета.

Вы можете использовать следующие клавиши управления:Клавиша

Описание

Ctrl+PПечатать отчет.

Ctrl+FПоиск текста.

Стрелки

Плавная прокрутка.

PageUp,
PageDownЛистание вверх/вниз.

HomeПереход на первую страницу.

EndПереход на последнюю страницу.

EscЗакрыть окно просмотра.

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

295

После редактирования закройте дизайнер, при этом будет предложено сохранить
изменения в странице отчета.

Печать отчетаДля того, чтобы распечатать отчет на принтере, нажмите кнопку
клавиш Ctrl+P). Появится окно – диалог печати:296(или комбинацию

Просмотр, печать, экспорт

Рассмотрим настройки, доступные в этом диалоге. Кнопка "Больше/Меньше" позволяет
показывать весь диалог или только базовые настройки. По умолчанию диалог
показывается в упрощенном виде.
Группа "Принтер": здесь можно выбрать принтер, задать его настройки (кнопка
"Настройки") и выбрать печать в файл.
Группа "Страницы": здесь можно выбрать, какие страницы печатать (все, текущую илизаданные номера страниц).
Группа "Копии": здесь можно задать количество копий и выбрать порядок страниц вкопиях ("Разобрать по копиям"):Группа "Прочее": здесь можно выбрать, какие страницы из выбранного диапазона печатать
(все, четные, нечетные), выбрать порядок печати (прямой, обратный), задать настройкидля двусторонней печати ("Дуплекс" - если ваш принтер его поддерживает) и выбрать
источник бумаги (лоток принтера).
Группа "Режим печати" позволяет выбрать один из режимов печати:РежимОписание
Принтер печатает на формате бумаги, указанной вотчете. Одной странице отчета соответствует один листраспечатки.
Этот режим используется, если необходимо распечатать
отчет формата А3 на бумаге А4. При этом из одной
страницы отчета получается два печатных листа. ПриПросмотр, печать, экспорт

297

использовании этого режима надо выбрать формат
бумаги, на котором вы хотите печатать, из списка
"Печатать на листе".
Этот режим используется, если необходимо напечатать
отчет А4 на формате А3. На одном печатном листе можно
напечатать 1, 2, 4 или 8 страниц отчета. Прииспользовании этого режима надо выбрать формат
бумаги, на котором вы хотите печатать, из списка
"Печатать на листе", а также указать количество страницв списке "Страниц на листе".
После нажатия на кнопку "Печать" начинается печать отчета. Если выбран флажок
"Печать в файл", то будет запрошено имя файла и отчет будет сохранен в этот файл(файл с расширением PRN, содержит копию информации, отправляемой на принтер).

Экспорт отчета
FastReport позволяет осуществлять экспорт построенного отчета в различные форматыдля последующего редактирования, архивирования, пересылки по электронной почте идр.
На данный момент поддерживается экспорт в 11 форматов: PDF, RTF, HTML, MHT, Excel
XML, Excel 2007, PowerPoint 2007, OpenOffice Calc, CSV, TXT, файлы рисунков. Для выбора
экспорта нажмите кнопку "Сохранить" в окне предварительного просмотра и выберите
формат экспорта:Сохранение в формате FPX
Формат .FPX - это "родной" формат FastReport. Преимущества этого формата заключаютсяв следующем:сохранение отчета без потери качества. Открыв сохраненный ранее файл, вы можете
выполнять над ним все операции, такие как печать, экспорт, редактирование;компактный формат хранения - XML, сжатый с помощью ZIP;298

Просмотр, печать, экспорт

при необходимости файл отчета можно распаковать любым архиватором,поддерживающим ZIP-формат и поправить вручную в любом текстовом редакторе.
Недостаток формата заключается только в том, что для его просмотра необходимо
наличие FastReport.Net.
Для сохранения в формате FPX нажмите кнопку "Сохранить" в окне предварительного
просмотра и выберите тип файла "Готовый отчет". Для открытия ранее сохраненного
файла нажмите кнопку "Открыть".

Экспорт в Adobe Acrobat (PDF)
PDF (Portable Document Format) – платформо-независимый формат электронных
документов, созданный фирмой Adobe Systems. Для просмотра используется бесплатный
пакет Acrobat Reader. Данный формат достаточно гибкий - позволяет внедрять
необходимые шрифты, векторные и растровые изображения, очень хорошо подходит дляпередачи и хранения документов, предназначенных для просмотра и последующей печати.
Метод экспорта – послойный.
При экспорте в формат PDF будет предложено диалоговое окно для настройки параметров
выходного файла:Параметры экспорта:- Сжатый – сжатие выходного файла, уменьшает размер файла, но увеличивает время
экспорта;- Со шрифтами – все шрифты, использованные в отчете, будут также помещены ввыходной файл PDF для корректного отображения файла на компьютере, где этих шрифтов
может не быть. Размер выходного файла значительно увеличивается;- Фон – экспорт водяного знака страницы в файл PDF, значительно увеличивает размер
выходного файла;- Для печати – вывод графических изображений в высоком разрешении для последующей
печати на принтере. Включение этой опции нужно только в том случае, если документ
содержит графику и будет необходима его печать, значительно увеличивает размер

Просмотр, печать, экспорт

299

выходного файла;- Открыть после экспорта – результирующий файл будет открыт сразу же после экспорта
в Adobe Acrobat Reader.
На закладке "Информация" можно заполнить поля - информацию о документе:На закладке "Просмотр" можно задать некоторые опции, влияющие на просмотр документа
в Adobe Acrobat Reader:300Просмотр, печать, экспорт

Экспорт в Word (RTF)
RTF (Rich Text Format) был разработан фирмой Microsoft как стандартный формат дляобмена текстовыми документами. На данный момент RTF-документы совместимы сбольшинством современных текстовых редакторов и операционных систем.
Метод экспорта – табличный.
При экспорте в формат RTF будет предложено диалоговое окно для настройки параметров
выходного файла:Параметры экспорта:- Wysiwyg – максимальное соответствие внешнему виду отчета, при отключении этойопции будет производиться оптимизация по уменьшению количества строк и столбцов врезультирующей таблице;- Разрывы страниц – включает разрыв страниц в RTF файле;- Картинки – выбор формата графических изображений в результирующем файле. Поумолчанию предлагается формат метафайла (.EMF), что позволяет экспортировать такие
объекты, как "Диаграмма" и "Фигура" с максимальным качеством;- Открыть после экспорта – результирующий файл будет открыт сразу же после экспорта
программой просмотра RTF файлов, назначенной в операционной системе по умолчанию (кпримеру, MS Word).
Внешний вид и объем файла сильно зависят от шаблона отчета (см. раздел "Рекомендациипо разработке отчетов").

Экспорт в HTMLHTML (Hypertext Markup Language) – считается стандартным языком для разметки
документов в Internet. HTML создавался как язык для обмена научной и технической
документацией, пригодный для использования людьми, не являющимися специалистами вобласти верстки. Служит для создания относительно простых, но красиво оформленных
документов. Помимо упрощения структуры документа, в HTML внесена поддержка

Просмотр, печать, экспорт

301

гипертекста.
Метод экспорта – табличный.
При экспорте в HTML будет предложено диалоговое окно для настройки параметров
выходного документа:Параметры экспорта:- Wysiwyg - результат экспорта будет выглядеть максимально приближенно к отчету;- Картинки – включает возможность экспорта графических изображений;- Отдельная папка для файлов – все дополнительные файлы сохраняются в отдельной
папке с названием .files;- Навигатор – создается специальный навигатор для быстрого перемещения по страницам;- Одной страницей – все страницы будут сохранены в один файл;- Открыть после экспорта – результирующий файл будет открыт сразу же после экспорта
программой просмотра HTML файлов, назначенной в операционной системе по умолчанию.
Внешний вид и объем файла сильно зависят от шаблона отчета (см. раздел "Рекомендациипо разработке отчетов").

Экспорт в MHT (веб-архив)Формат MHT (веб-архив) основан на MIME кодировании и позволяет хранить в одном
файле текстовый и графический контент страницы. Сохранение страниц в MHT
поддерживается Internet Explorer.
Метод экспорта – табличный.
При экспорте в MHT будет предложено диалоговое окно для настройки параметров
выходного документа:302

Просмотр, печать, экспорт

Параметры экспорта:- Wysiwyg - результат экспорта будет выглядеть максимально приближенно к отчету;- Картинки – включает возможность экспорта графических изображений;- Открыть после экспорта – результирующий файл будет открыт сразу же после экспорта
в Internet Explorer.
Внешний вид и объем файла сильно зависят от шаблона отчета (см. раздел "Рекомендациипо разработке отчетов").

Экспорт в Excel (XML)
Excel – приложение для работы с электронными таблицами, включенное в систему
Microsoft Office.
Метод экспорта – табличный.
При экспорте в Excel будет предложено диалоговое окно для настройки параметров
выходного документа:Просмотр, печать, экспорт

303

Параметры экспорта:- Wysiwyg – максимальное соответствие внешнему виду отчета, при отключении этойопции будет производиться оптимизация по уменьшению количества строк и столбцов врезультирующей таблице;- Разрывы страниц – включает разрыв страниц;- Открыть после экспорта – результирующий файл будет открыт в Excel сразу же после
экспорта.
Внешний вид и объем файла сильно зависят от шаблона отчета (см. раздел "Рекомендациипо разработке отчетов").

Экспорт в Excel 2007
Excel 2007 – приложение для работы с электронными таблицами, включенное в систему
Microsoft Office 2007.
Метод экспорта – табличный.
При экспорте в Excel будет предложено диалоговое окно для настройки параметров
выходного документа:304

Просмотр, печать, экспорт

Параметры экспорта:- Wysiwyg – максимальное соответствие внешнему виду отчета, при отключении этойопции будет производиться оптимизация по уменьшению количества строк и столбцов врезультирующей таблице;- Разрывы страниц – включает разрыв страниц;- Открыть после экспорта – результирующий файл будет открыт в Excel сразу же после
экспорта.
Внешний вид и объем файла сильно зависят от шаблона отчета (см. раздел "Рекомендациипо разработке отчетов").

Экспорт в PowerPoint 2007
PowerPoint 2007 – приложение для работы с презентациями, включенное в систему
Microsoft Office 2007.
Метод экспорта – послойный.
При экспорте в PowerPoint 2007 будет предложено диалоговое окно для настройки
параметров выходного документа:Просмотр, печать, экспорт

305

Параметры экспорта:- Картинки - выбор формата, в котором сохранять графические изображения;- Открыть после экспорта – результирующий файл будет открыт в PowerPoint сразу жепосле экспорта.

Экспорт в OpenOffice Calc
OpenDocument Format - открытый формат файлов документов для хранения и обмена
редактируемыми офисными документами, в том числе текстовыми документами (такимикак заметки, отчёты и книги), электронными таблицами, рисунками, базами данных,презентациями. Этот стандарт был разработан индустриальным сообществом OASIS иоснован на XML-формате, изначально созданном OpenOffice.org. 1 мая 2006 года приняткак международный стандарт ISO/IEC 26300.
FastReport поддерживает экспорт в таблицу (расширение .ods) OpenDocumet. Эти файлы
могут быть открыты с помощью бесплатного офисного пакета OpenOffice.
Метод экспорта – табличный.
При экспорте будет предложено диалоговое окно для настройки параметров выходного
документа:306

Просмотр, печать, экспорт

Параметры экспорта:- Wysiwyg – максимальное соответствие внешнему виду отчета, при отключении этойопции будет производиться оптимизация по уменьшению количества строк и столбцов врезультирующей таблице;- Разрывы страниц – включает разрыв страниц;- Открыть после экспорта – результирующий файл будет открыт сразу же после экспорта.

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

307

Параметры экспорта:- Разделитель - выбор символа-разделителя;- Кодировка - выбор кодировки документа. Кодировка "По умолчанию" соответствует
текущей кодовой странице Windows;- Только данные - экспортированы будут только объекты, лежащие на бэнде "Данные";- Открыть после экспорта – результирующий файл будет открыт в Excel сразу же после
экспорта.

Экспорт в TXT
Обычный текстовый файл – содержит информацию из отчета, максимально
оптимизированную и преобразованную в связи со спецификой данного формата.
Полученный документ может быть сохранен в файл или распечатан на матричном
принтере.
Метод экспорта – табличный.
При экспорте в текст будет предложено диалоговое окно для настройки параметров
выходного документа:308

Просмотр, печать, экспорт

Параметры экспорта:- Разрывы страниц - включает разрыв страниц;- Пустые строки - включает пустые строки в результирующий файл;- Только данные - экспортированы будут только объекты, лежащие на бэнде "Данные";- Рамки - выбор типа рамок (графические/текстовые/без рамок);- Кодировка - выбор кодировки текста;- Масштаб X - масштабирование по горизонтали;- Масштаб Y - масштабирование по вертикали;- Автоподбор - автоматический подбор таких коэффициентов X и Y, чтобы не было потери
информации.

Экспорт в файлы рисунков
FastReport позволяет экспортировать информацию в следующие графические форматы:
BMP
PNG
JPG
GIF
TIFF
Метафайл (EMF,WMF)Принцип экспорта – отрисовка.

Просмотр, печать, экспорт

309

При экспорте в файл рисунка будет предложено диалоговое окно для настройки
параметров изображения:Параметры экспорта:Формат - формат изображения;Разрешение (dpi) – разрешение изображения. При экспорте в TIFF формат можно задать
разные значения для разрешения по вертикали и горизонтали;Качество Jpeg – степень сжатия JPG файла. Опция используется только при экспорте в
Jpeg формат;Отдельный файл для каждой страницы – если опция включена, то каждая страница
отчета будет экспортирована в отдельный файл, имя файла будет сформировано наоснове выбранного с добавлением номера страницы;Многостраничный TIFF - при включении опции будет сформирован один TIFF файл,содержащий несколько страниц. Опция используется только при экспорте в TIFF
формат. При этом опция "Отдельный файл для каждой страницы" игнорируется;Черно-белый TIFF - при включении опции будет сформирован черно-белый TIFF файл.
Опция используется только при экспорте в TIFF формат.
При экспорте нескольких страниц в один файл (при отключенной опции "Отдельный файлдля каждой страницы") нужно помнить о большой ресурсоемкости экспорта.

Экспорт на FTP
В превью FastReport .NET есть возможность сохранить готовый отчет на FTP сервер. Отчет
также можно экспортировать в любой из поддерживаемых форматов и после этого
сохранить на FTP. Для этого нужно нажать кнопку "Сохранить" и выбрать пункт "FTP...".
Появится окно сохранения на FTP сервер:310Просмотр, печать, экспортНа вкладке "Файл" есть следующие поля:- Сервер FTP. В это поле нужно ввести URL-адрес FTP сервера, на который нужно
сохранить файл.
- Имя Пользователя и Пароль. Нужно ввести ваши логин и пароль на данном FTP-сервере.
- Тип файла. Выпадающий список, в котором можно выбрать формат сохранения файла
(Готовый отчет или один из экспортов).
При выборе одного из экспортов становится доступна кнопка "Настройки...". Нажав на этукнопку, можно перейти к окну настроек выбранного экспорта.
Если вы используете прокси-сервер, то на вкладке прокси вы можете ввести URL-адрес
прокси сервера, порт, логин и пароль:Введя настройки и выбрав формат остается только нажать кнопку OK и файл будет
сохранен на сервере FTP.

Просмотр, печать, экспорт

311

Экспорт в DropboxВ превью FastReport .NET есть возможность сохранить готовый отчет в Dropbox. Отчет
также можно предварительно экспортировать в любой из поддерживаемых форматов.
Перед тем как воспользоваться этой возможностью, необходимо создать приложение в
Dropbox аккаунте. Для этого нужно войти в свой аккаунт на Dropbox и выполнить
следующие шаги:- Щелкнуть кнопку "Еще (More)". Она находится внизу страницы Dropbox.
- В выпадающем списке выбрать "Разработчикам (Developers)". Вы попадете на страницудля разработчиков.
- Перейти по ссылке "App Console". В результате вы попадете к списку приложений.
- Щелкнуть кнопку "Create App". Dropbox захочет проверить ваш E-mail. Нажмите кнопку
"Send Email".
На вашу почту будет отправлено письмо, в котором нужно нажать "Подтвердить адрес
электронной почты".
В итоге вы попадете на страницу "Create a new Dropbox Platform app". Здесь нужно выбрать
"Dropbox API app" и на вопрос "What type of data does your app need to store on Dropbox?"выбрать ответ "Files and datastores". А на вопрос "Can your app be limited to its own, private
folder?" можно выбрать любой из двух предложенных ответов. Последним на этой странице
нужно ввести имя приложения (оно может быть любым). После нажатия на кнопку "Createapp" система проверит, не занято ли уже введенное вами имя приложения, и создаст
приложение.
В итоге мы попадем на страницу настройки приложения. Здесь нам интересны "App key" и"App secret", они понадобятся при экспорте в Dropbox.
Теперь можно перейти в превью FastReport .NET и экспортировать файл в Dropbox. Дляэтого нужно нажать на кнопку "Сохранить" и выбрать пункт "Dropbox...". При первой
попытке экспортировать в Dropbox появится окно "Информация о Приложении":Здесь нужно ввести полученные ранее "Ключ Приложения (App key)" и "Секрет
Приложения (App secret)". После нажатия на кнопку "OK" FastReport сохранит этизначения и больше их вводить не потребуется.
Появится окно сохранения в Dropbox:

312Просмотр, печать, экспортНа вкладке "Файл" можно выбрать тип сохраняемого файла (Готовый отчет или один изэкспортов). При выборе одного из экспортов становится доступна кнопка "Настройки...".
Нажав на эту кнопку, можно перейти к окну настроек выбранного экспорта.
Если вы используете прокси-сервер, то на вкладке "Прокси" вы можете ввести URL-адрес
прокси сервера, порт, логин и пароль:Введя настройки и выбрав формат, остается только нажать кнопку "OK" и файл будет
сохранен в Dropbox.

Экспорт в Google DriveВ превью FastReport.NET есть возможность сохранить готовый отчет в GoogleDrive. Отчет
также можно предварительно экспортировать в любой из поддерживаемых форматов.
Для начала нужно создать приложение в GoogleDrive. Для этого нужно зайти по адресу
https://code.google.com/apis/consoleНа этой странице принимаем условия лицензионного соглашения.
После этого мы попадаем на страницу управления проектами. Здесь переходим на вкладку
"Services" и активируем Drive API. Переходим на вкладку "API Access" и жмем "Create an
OAuth 2.0 client ID". В секции "Branding Information" вводим имя приложения и жмем Next. Всекции "Client ID Settings" выбираем следующее:- "Installed application" для Application type.
- "Other" для Installed application type.
Жмем "Create Client ID".
В результате на странице "API Access page" появится секция "Client ID for installed
applications", в которой мы увидим Client ID и Client secret. Оба этих значения намПросмотр, печать, экспорт

313

понадобятся в дальнейшем.
Теперь можно перейти в превью FastReport .NET и экспортировать файл в GoogleDrive. Дляэтого нужно нажать кнопку "Сохранить" и выбрать пункт "GoogleDrive...". При первой
попытке экспортировать в GoogleDrive появится окно "Информация о Клиенте":Здесь нужно ввести полученные ранее ИД Клиента (Client ID) и Секрет Клиента (Client
secret). После нажатия на кнопку "OK" FastReport сохранит эти значения, и больше ихвводить не потребуется.
Появится окно сохранения в GoogleDrive:На вкладке "Файл" можно выбрать тип сохраняемого файла (Готовый отчет или один изэкспортов). При выборе одного из экспортов становится доступна кнопка "Настройки...".
Нажав на эту кнопку, можно перейти к окну настроек выбранного экспорта.
Если вы используете прокси-сервер, то на вкладке "Прокси" вы можете ввести URL-адрес
прокси сервера, порт, логин и пароль:314

Просмотр, печать, экспорт

Введя настройки и выбрав формат, остается только нажать кнопку "OK" и файл будет
сохранен в GoogleDrive.

Экспорт в SkyDriveВ превью FastReport.NET есть возможность сохранить готовый отчет в SkyDrive. Отчет
также можно предварительно экспортировать в любой из поддерживаемых форматов.
Для начала нужно создать приложение в SkyDrive. Для этого на странице SkyDriveпереходим по ссылке "Разработчикам". На странице центра разработки жмем "Моиприложения". Далее жмем "Создать приложение". Вводим имя приложения и выбираем
язык. Читаем "условия использования" и "заявление о конфиденциальности" и жмемкнопку "Я принимаю". В итоге попадаем на страницу настроек приложения. Здесь мывидим "ИД клиента" и "Секрет клиента", которые нам и нужны. Остается только указать
домен перенаправления и нажать кнопку "Сохранить".
Теперь можно перейти в превью FastReport.NET и экспортировать файл в SkyDrive. Дляэтого нужно нажать кнопку "Сохранить" и выбрать пункт "SkyDrive...". При первой попытке
экспортировать в SkyDrive появится окно Информация о Клиенте:Здесь нужно ввести полученные ранее ИД Клиента (Client ID) и Секрет Клиента (Client
secret). После нажатия на кнопку "OK" FastReport сохранит эти значения, и больше ихвводить не потребуется.
Появится окно сохранения в SkyDrive:На вкладке "Файл" можно выбрать тип сохраняемого файла (Готовый отчет или один изэкспортов). При выборе одного из экспортов становится доступна кнопка "Настройки...".
Нажав на эту кнопку, можно перейти к окну настроек выбранного экспорта.
Если вы используете прокси-сервер, то на вкладке "Прокси" вы можете ввести URL-адрес
прокси сервера, порт, логин и пароль:Просмотр, печать, экспорт

315

Введя настройки и выбрав формат, остается только нажать кнопку "OK" и файл будет
сохранен в SkyDrive.

Рекомендации по разработке отчетовВ этом разделе будут даны рекомендации по разработке отчетов, предназначенных дляэкспорта в другие форматы данных.
FastReport предлагает широкие возможности для манипуляции объектами при создании
отчета, что дает заметное преимущество при быстрой разработке любых отчетов ипоследующей их печати на принтере. Отпечатанный документ будет выглядеть точно также, как и на экране, что и является основной целью применения генератора отчетов
FastReport.
Обратная сторона такой свободы разработки – сложность экспорта полученного
документа в различные форматы данных, имеющие свои, иногда довольно существенные,ограничения в представлении информации. Очень многие форматы используют табличное
представление данных. Речь идет о таких форматах, как HTML, XLS, RTF, CSV. Никакие
пересечения или наслоения ячеек в подобных форматах недопустимы (если брать врассмотрение именно табличную разметку, это касается HTML и RTF).
Фильтры экспорта, как правило, максимально учитывают эти требования при экспорте
объектов. Это реализуется при помощи специальных алгоритмов учета пересечений
объектов и оптимального их расположения. В местах пересечений объектов возникают
новые столбцы и строки в результирующей таблице. Это необходимо для получения
максимального сходства результата экспорта и оригинального отчета. Большое
количество пересекающихся объектов в отчете приводит к росту числа столбцов и строкв таблице, что замедляет процесс экспорта и усложняет использование результирующего
файла.
Качество экспорта в тот или иной формат сильно зависит от грамотной разработки
шаблона отчета. Рассмотрим следующий отчет:316

Просмотр, печать, экспорт

При разработке этого отчета было допущено пересечение двух объектов, находящихся наодном бэнде. Предположим, что число записей при формировании отчета составило 150.
Тогда при экспорте в формат RTF будет создано 450 строк в результирующей таблице
(150 строк на каждый объект и 150 строк на пересечение). Если пересечение устранить,количество строк будет уже 300. На больших отчетах и при большем количестве объектов
разница будет просто огромной, что, соответственно, скажется и на размере выходного
файла.
При создании таблиц в отчетах проследите, чтобы границы соседних ячеек соприкасались
друг с другом, но не пересекались или наслаивались. Алгоритм фильтра экспорта сделает
отсечение ячеек, но результат экспорта может быть далек от желаемого (вы увидите несовсем то, что хотели). Располагайте объекты так, чтобы они находились на одной линии,как по вертикали, так и по горизонтали.
Избежать перекрытия ячеек может помочь выравнивание объектов по сетке. Проследитеза тем, чтобы было включено выравнивание по сетке в опциях дизайнера. Для упрощения
выравнивания можно увеличить шаг сетки. Настройки шага сетки и выравнивания можно
найти в меню дизайнера «Вид|Настройки...»:

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

Просмотр, печать, экспорт

317

Отправка отчета по email
FastReport позволяет отправить готовый отчет по электронной почте в нужном вамформате. Отправка работает в двух режимах:РежимОписание

SMTP

Режим работы по умолчанию. Для отправки письма не нужны никакие
вспомогательные программы.

MAPI

Включить этот режим работы можно программно, указав св-во Config.
EmailSettings.UseMAPI = true, или, используя компонент EnvironmentSettings,указав св-во EnvironmentSettings.EmailSettings.UseMAPI = true.
Для отправки письма используется почтовая программа, установленная всистеме. Программа должна быть совместима с MAPI.

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

Просмотр, печать, экспорт

Если ваш сервер требует аутентификацию, необходимо также заполнить поля "Логин" и"Пароль".

Просмотр, печать, экспорт

319