Для получения данных, по которым будет строиться отчет, необходимо создать SQLзапрос.

Далее рассмотрим создание запроса и заполнение формы отчета.  

Описание инструмента

1. Создание запроса.


Нажимаем пиктограмму .  Пиктограмма  расположена на вкладке Design(см. рисунок 2.3.5). Получаем диалог для создания запроса (DatasetandQueryDialog).  (Рис. 2.4.1.1).


Рис. 2.4.1.1. Окно для создания запроса.


Сначала определяем, какая информация будет попадать в отчет. Для этого создаем запрос:

Select 
   type, subject, complect, id
from 
   f_dp_rkkbase.


С помощью этого запроса выбираем поля type, subject, complect, id изт аблицы f_dp_rkkbase

Нажимаем кнопку ReadFields. В нижней части окна увидим отобранные поля. С помощью кнопок Up и Down можно менять порядок полей.

Таблица  f_dp_rkkbase содержит следующие поля:

Рис.  2.4.1.2. Запрос и  поля, отобранные с помощью запроса.


Рис.  2.4.1.3. Поля, отобранные с помощью запроса.


Если на вкладке DataPreview  (рис2.4.1.3) , нажать на кнопку RefreshPreviewData, то можно увидеть документы, которые будут попадать в отчет по запросу. (Рис.  2.4.1.4)


 Рис 2.4.1.4. Документы, отобранные с помощью запроса.


Меняем порядок полей с помощь кнопок  UP и  DOWN


Рис.  2.4.1.5.  Изменённый порядок полей.


2. Сортировка данных.


Можно выбрать поля, по которым будет производиться сортировка информации в отчете. В данном примере показано, как выбрать сортировку по полю id. Для этого на вкладке Outlineвыбираем SortFields. (рис. 2.4.2.1)

Появляется диалог NewSortFieldWizard, где выбираем поле idи нажимаем кнопку Finish(рис. 3_2).


Рис. 2.4.2.1. Определение полей для сортировки.


После того, как мы выбрали сортировку по полю id, предварительный просмотр будет выглядеть так, как показано на рис. 2.4.2.2.


Рис. 2.4.2.2.Вид информации после сортировки

3. Дизайн и конфигурирование элементов отчета.

3.1.  Динамическое текстовое поле (Text Field) и статическое текстовое поле (Static Text).

Рис.   2.4.3.1.1.   Вкладка "Properties/Appearance" (Свойства/Внешний вид) текстового поля


Поле - это  выражение  (содержимое поля) и параметры поля. При выделении текстового поля появляется  вкладка Properties (которая по умолчанию находится в правом нижнем углу интерфейса Jaspersoft Studio). В свою очередь на ней есть несколько вкладок:

Appearance (внешний вид) - задаются настройки размера поля, его положения в группе (Band), Тип позиции, Тип растяжения, Настройки печати и условия печати.

Категория \ Свойство

Выпадающее меню

Описание

Location  (Position Type – определяет то, как себя будет вести себя поле в случае расширения Группы вертикально)

x,y


Kоординаты расположения верхнего левого угла в группе в пикселях

Position Type

Float

Обозначает, что поле будет «плавающим», то есть оно будет сдвигаться относительно других элементов

Fix Relative To Top

Обозначает, что верхняя граница поля будет прикреплена к верхней границе группы

Fix Relative To Bottom

Обозначает, что нижняя граница поля будет прикреплена к нижней границе группы

Size (StretchType–тип растяжения поля вертикально)

w, h


w,h – определяет размер поля в пикселях (width, height).

Stretch Type

No Stretch

Не растягивать. Используется в случае, если текстовое поле должно оставаться оригинального размера.

Relative To Tallest Object

Растягивается относительно самого высокого объекта. Используется в большинстве случаев, подстраиваясь относительно своих соседей

Relative To Band Height

Растягивается относительно высоты группы. Используется в случае, если размер объектов должен занимать определенный % высоты группы.

Color

Forecolor

Диалог для выбора цвета

Задает цвет текста

Backcolor

Диалог для выбора цвета

Задает цвет ячейки  (не важен, если установлена галка Transparent)

Transparent


Ячейка прозрачная, backcolor не используется

Style and Print Details (задает поведение текстового поля относительно стиля и настроек.)

Key


Нет опыта использования

Style

Список стилей

Стили можно создать в Outline

Print Repeated Values


Не печатает, если значения этого поля повторяются (например если полю сказано печатать список значений и некоторые в них повторяются)

Remove Line When Blank


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

Print in First Whole Band


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


Print When (определяются условия печати элемента)

Detail Overflows


Элемент будет печататься, если он разбивается новой страницей

Group Changes


Если группа изменилась, тогда печатать.

Print when Expression


java операнд, возвращающий Boolean. Если True – печатаем, False – не печатаем.



Для справки:


Borders (Границы)


Рис.  2.4.3.1.2.   Вкладка "Properties/Borders" (Свойства/Границы) текстового поля


Padding (отступы) – определяет расстояние текста в пикселях от границ текстового поля.

Borders (границы) – определяет цвет, тип и толщину границы текстового поля.
Можно выбрать границы в левой части и модифицировать их отдельно справа.

Text Field (Текстовое поле)


Рис.  2.4.3.1.3. Вкладка "Properties/Text Field" (Свойства/Текстовое поле) текстового поля


Категория \ Свойство

Выпадающее меню

Описание

Expression


 Выражение для текстового поля.

Evaluation Time

Now

Определяет в какое время будет вычислено значение выражения. Например, если в заголовке есть счетчик количества строк отчета, например «Количество документов», то будет значение 0.

Report

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

Page

Значение вычисляется – по окончанию данной страницы

Blank When NULL

 

Должно выводиться пустое текстовое поле, если в нем содержится null. Но по каким-то причинам не работает как ожидается. Приходится использовать обработку внутри Expression, например таким образом:
( $F{resolution} == null ? "" :  $F{resolution})

Stretch With Overflow

 

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

Pattern

Шаблон для форматирования содержимого поля

 

Определяется форматирование возвращаемого значения. На практике обычно  используется форматирование всех значений в поле Expression.

Pattern Expression

Как и Pattern, только позволяет задать строку expression с помощью Java выражения, применив тернарные операторы и т.д. На практике редко используется.

Text Alignment

 

Горизонтальная и вертикальная ориентация текста.

Rotation

 

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

Font


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

Markup

none

Язык разметки не выбирается. Используется наиболее часто.

styled

Styled требует создания пользовательского util.MarkupProcessorFactory (более подробно в  официальной документации)

html

Используются html теги форматирования.

rtf

Используются rtf теги форматирования.




Paragraph

Line Spacing


Выбирается количество интервалов между строками  текста в параграфе. По умолчанию 1.

Line Spacing Size


Размер интервала между строками текста внутри параграфа

First Line Indent


Табуляция отступа первой строки параграфа

Left Indent


Отступ слева.

Right Indent


Отступ справа.

Spacing  Before


Расстояние до первой строки параграфа сверху

SpacingAfter


Расстояние после последней строки параграфа снизу

Tab Stop Width


Максимальная ширина табуляции


Inheritance – Показано, какие атрибуты наследуются  из стиля и значений по умолчанию.


Рис. 2.4.3.1.4.  Вкладка "Properties/Inheritance " (Свойства/Наследование) текстового поля

Hyperlink – гиперссылка. Можно определить закладки и переходы по документу, а также ссылки в вэб.


Рис. 2.4.3.1.5.  Вкладка "Properties/Hyperlink " (Свойства/Гиперссылки) текстового поля


Структура меню меняется в зависимости от выбранного Типа Ссылки (LinkType).  Ссылка (Reference) открывает новое поле HyperlinkReferenceExpression, которое может содержать java операнд.  Можно также вписать жесткую ссылку.
HyperlinkWhenExpression – операнд, ожидается Boolean. Если true – тогда сделать текстовое поле ссылкой. Если false – текстовое поле не превращается в ссылку.
HyperlinkTooltipExpression–операнд возвращающий текст. Этот текст выводится при наведении на ссылку.


Рис. 2.4.3.1.6. Вкладка "Properties/Advanced " (Свойства/Дополнительно) текстового поля


Существует особенность формирования отчетов в формате PDF и содержащих кириллические символы. Для корректного отображения текста на русском языке необходимо в свойствах полей отчета указать следующие параметры

Статический текстовый элемент используется, чтобы показать не динамический текст в отчетах. Единственный параметр, который отличает этот элемент от универсального текстового элемента - это свойство  LabelStatic Text вместоText Field, в котором указывается текст для просмотра: это обычный текст, а не выражение.


3.2.  Конфигурирование отчета.


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

Щелкаем мышкой по секции, которую необходимо удалить. Слева появляется выделение секции. При нажатии на правую клавишу, появляется меню. Нажимаем Delete. Удаляем все секции, которые нам не нужны для данного примера.

Рис.2.4.3.2.1.    Удаление ненужных секций.


Оставляем секции  Title, Column Header и Detail1.


Для  вывода информации в отчет в данном примере используются два основных компонента: Text Field (динамическое поле)и Static Text (статический текст). Динамическое поле используется  для вывода значений параметров или полей источника данных, а статическое - для вывода постоянного текста.


 Используем  Static Text для формирования заголовка отчета. Для этого на вкладке Palette выбираем  Static Text и мышкой перетаскиваем в секцию отчета Title   (Рис. 2.4.3.2.2)

Рис. 2.4.3.2.2.  Элемент Static Textдля создания заголовка отчета.


Двойным щелчком мышки открываем поле и вписываем текст «Заголовок простого отчета» (Рис. 2.4.3.2.3)


Рис. 2.4.3.2.3. Заполнение заголовка отчета.


Далее открываем вкладку Properties для данного текста (Рис. 2.4.3.2.4).  Выбираем  Appearance и устанавливаем координаты области размещения текста в секции Title.


Рис. 2.4.3.2.4. Форматирование  заголовка отчета.


В секции Location   Position Type указываем координатыxи yобласти, где будет размещаться текстпо отношению к верхней границе секции Title (Fix Relative To Top).

В секции Size определяем размер области размещения: W-  ширина области, h- высота области. Единица измерения - пиксель (px). Размер области — фиксированный: Stretch Type -No Stretch .

            Для форматирования текста открываем секцию label Static Text (Рис. 2.4.3.2.5)


Рис. 2.4.3.2.5. Форматирование текста.


Выбираем шрифт текста, выравнивание и т.д.


Далее необходимо заполнить секции  Column Header и Detail1. Это можно сделать разными способами. Сначала разместим поле idна форме отчета в секции Detail1 следующим образом:

Рис. 2.4.3.2.6. Текстовое поле в секции Detail 1.


Двойным щелчком мышки открываем  Text Field. В открывшемся диалоге  в Expression Editorвместо текста помещаем (двойным щелчком мыши) поле id - $F{id}.$F – обозначает поле.

Рис. 2.4.3.2.7.  Размещение поля id .


Также, как и для статического текста определяем область размещения поля на форме отчета (Рис. 2.4.3.2.8).


Рис. 2.4.3.2.8. Размещение поля на шаблоне отчета.


Затем выбираем Text Field (для статического текста выбирали Static Text) и форматируем текст (Рис. 2.4.3.2.9 )


Рис. Рис. 2.4.3.2.9. Форматирование текста в текстовом поле.


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

Рассмотрим ещё один способ заполнения формы. Создадим столбец с заголовком «БД» и содержащим в секции Detail1 поле «complect». Для этого на вкладке «Outline» выбираем в секции Fieldsполе  complectи перетаскиваем его в секцию Detail1 (Рис. 2.4.3.2.10)


Рис.  2.4.3.2.10.  Перетаскивание поля с закладки Outline на шаблон.


Далее форматируем заголовок столбца (Рис. 2.4.3.2.11)  и его содержимое (Рис. 2.4.3.2.12).


Рис. 2.4.3.2.11.  Форматирование заголовка столбца.


Рис. 2.4.3.2.12.  Форматирование текста столбца.


Заполняем таким же образом столбцы  «Тип документа» и «Заголовок» (Рис. 2.4.3.2.13).


Рис. 2.4.3.2.13.  Шаблон отчета (без заполнения границ).


     Выбираем вкладку Preview   и смотрим сформированный отчет (Рис. 2.4.3.2.14).


Рис. 2.4.3.2.14. Сформированный отчёт


Чтобы создать границы строк и столбцов, необходимо создать границы ячеек. Для этого выделяем нужную ячейку и в свойствах ячейки (Properties)  выбираем «  Borders» и настраиваем границы (Рис. 2.4.3.2.15).


Рис. 2.4.3.2.15. Настройка границ ячеек.


Настраиваем границы для всех ячеек (Рис. 2.4.3.2.16).


Рис. 2.4.3.2.16. Настроены границы всех ячеек.


На вкладке «Preview»  смотрим результат (Рис. 2.4.3.2.17).


Рис. 2.4.3.2.17.  Отчет с настроенными границами ячеек.


На вкладке Sourceможно увидеть код XMLотчета.

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

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.0.4.final using JasperReports Library version 6.0.4  -->
<!-- 2015-08-09T07:26:52 -->
<jasperReportxmlns="http://jasperreports.sourceforge.net/jasperreports"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"name="Example1"pageWidth="595"pageHeight="842"columnWidth="555"leftMargin="20"rightMargin="20"topMargin="20"bottomMargin="20"uuid="4c68dd92-6073-4492-a024-c0af5108344f">
	<propertyname="com.jaspersoft.studio.data.defaultdataadapter"value=" Cm Sochi JDBC on localhost"/>
	<queryStringlanguage="SQL">
		<![CDATA[Select 
type, subject, complect, id
from 
f_dp_rkkbase]]>
	</queryString>
	<fieldname="id"class="java.lang.Long"/>
	<fieldname="type"class="java.lang.String"/>
	<fieldname="subject"class="java.lang.String"/>
	<fieldname="complect"class="java.lang.String"/>
	<sortFieldname="id"/>
	<background>
		<bandsplitType="Stretch"/>
	</background>
	<title>
		<bandheight="49"splitType="Stretch">
			<textField>
				<reportElementx="117"y="5"width="300"height="40"uuid="db72abba-b8f3-4702-88fa-9353e41e723d">
					<propertyname="local_mesure_unitheight"value="pixel"/>
					<propertyname="com.jaspersoft.studio.unit.height"value="px"/>
					<propertyname="local_mesure_unitwidth"value="pixel"/>
					<propertyname="com.jaspersoft.studio.unit.width"value="px"/>
				</reportElement>
				<textElementtextAlignment="Center"verticalAlignment="Middle">
					<fontfontName="Times New Roman"size="14"isBold="true"/>
				</textElement>
				<textFieldExpression><![CDATA["Заголовок простого отчета"]]></textFieldExpression>
			</textField>
		</band>
	</title>
	<columnHeader>
		<bandheight="42"splitType="Stretch">
			<staticText>
				<reportElementx="60"y="0"width="110"height="40"uuid="fd40d18b-aaac-4c07-a301-67494fe4bab3"/>
				<boxpadding="3"topPadding="1"leftPadding="1"bottomPadding="1"rightPadding="1">
					<topPenlineWidth="0.6"/>
					<leftPenlineWidth="0.6"/>
					<bottomPenlineWidth="0.6"/>
					<rightPenlineWidth="0.6"/>
				</box>
				<textElementtextAlignment="Center"verticalAlignment="Middle"/>
				<text><![CDATA[БД]]></text>
			</staticText>
			<staticText>
				<reportElementx="170"y="0"width="146"height="40"uuid="21ca3a0d-6c34-41f6-b353-c9dba5b315cc"/>
				<boxpadding="3">
					<topPenlineWidth="0.6"/>
					<leftPenlineWidth="0.6"/>
					<bottomPenlineWidth="0.6"/>
					<rightPenlineWidth="0.6"/>
				</box>
				<textElementtextAlignment="Center"verticalAlignment="Middle">
					<fontfontName="Times New Roman"size="12"/>
				</textElement>
				<text><![CDATA[Тип документа]]></text>
			</staticText>
			<staticText>
				<reportElementx="316"y="0"width="234"height="40"uuid="d562e6a7-bac9-4a1f-b6dc-4b6aeacaef5b"/>
				<box>
					<topPenlineWidth="0.6"/>
					<leftPenlineWidth="0.6"/>
					<bottomPenlineWidth="0.6"/>
					<rightPenlineWidth="0.6"/>
				</box>
				<textElementtextAlignment="Center"verticalAlignment="Middle">
					<fontfontName="Times New Roman"size="12"/>
				</textElement>
				<text><![CDATA[Заголовок]]></text>
			</staticText>
			<staticText>
				<reportElementx="20"y="0"width="40"height="40"uuid="13d2281f-e5d5-4291-9833-bb1971ddbd67"/>
				<boxtopPadding="3"leftPadding="3"bottomPadding="3"rightPadding="3">
					<topPenlineWidth="0.6"/>
					<leftPenlineWidth="0.6"/>
					<bottomPenlineWidth="0.6"/>
					<rightPenlineWidth="0.6"/>
				</box>
				<textElementtextAlignment="Center"verticalAlignment="Middle">
					<fontsize="12"/>
				</textElement>
				<text><![CDATA[id]]></text>
			</staticText>
		</band>
	</columnHeader>
	<detail>
		<bandheight="40"splitType="Stretch">
			<textField>
				<reportElementx="20"y="0"width="40"height="40"uuid="6f2a3a63-d240-4844-8d67-7a553a5da3ac">
					<propertyname="local_mesure_unitheight"value="pixel"/>
					<propertyname="com.jaspersoft.studio.unit.height"value="px"/>
					<propertyname="local_mesure_unitwidth"value="pixel"/>
					<propertyname="com.jaspersoft.studio.unit.width"value="px"/>
				</reportElement>
				<boxtopPadding="3"leftPadding="3"bottomPadding="3"rightPadding="3">
					<topPenlineWidth="0.6"/>
					<leftPenlineWidth="0.6"/>
					<bottomPenlineWidth="0.6"/>
					<rightPenlineWidth="0.6"/>
				</box>
				<textElementtextAlignment="Center"verticalAlignment="Middle">
					<fontfontName="Traditional Arabic"size="12"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
			</textField>
			<textField>
				<reportElementx="60"y="0"width="110"height="40"uuid="caff384d-e033-4e38-be01-969d93dacad7"/>
				<boxtopPadding="3"leftPadding="3"bottomPadding="3"rightPadding="3">
					<topPenlineWidth="0.6"/>
					<leftPenlineWidth="0.6"/>
					<bottomPenlineWidth="0.6"/>
					<rightPenlineWidth="0.6"/>
				</box>
				<textElementtextAlignment="Left"verticalAlignment="Middle">
					<fontfontName="Times New Roman"size="12"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{complect}]]></textFieldExpression>
			</textField>
			<textField>
				<reportElementx="170"y="0"width="146"height="40"uuid="b4a80027-8dfd-4987-890d-c616644894eb"/>
				<boxtopPadding="3"leftPadding="3"bottomPadding="3"rightPadding="3">
					<topPenlineWidth="0.6"/>
					<leftPenlineWidth="0.6"/>
					<bottomPenlineWidth="0.6"/>
					<rightPenlineWidth="0.6"/>
				</box>
				<textElementverticalAlignment="Middle">
					<fontfontName="Times New Roman"size="12"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{type}]]></textFieldExpression>
			</textField>
			<textField>
				<reportElementx="316"y="0"width="234"height="40"uuid="438487e5-c811-46fc-add4-1d43fd0d96b1"/>
				<boxtopPadding="3"leftPadding="3"bottomPadding="3"rightPadding="3">
					<topPenlineWidth="0.6"/>
					<leftPenlineWidth="0.6"/>
					<bottomPenlineWidth="0.6"/>
					<rightPenlineWidth="0.6"/>
				</box>
				<textElementverticalAlignment="Middle">
					<fontfontName="Times New Roman"size="12"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{subject}]]></textFieldExpression>
			</textField>
		</band>
	</detail>
</jasperReport>

Рис. 2.4.3.2.18. JRXML файл отчета  Example1.


4. Группировка данных.


Создаем отчет  Example2с источником данных Cm Sochi JDBC on localhost, тем же, что и в примере Example1.  Информацию теперь будем получать из двух таблиц: f_dp_rkkbase и  f_dp_rkk (Рис. 2.2.4.1.). Запрос будет выглядеть следующим образом:

Select
rkkbase.type, rkkbase.subject, rkkbase.complect, rkkbase.id,
rkk.regnumprist || rkk.regnumcnt || rkk.regnumfin as regNumber
from
f_dp_rkkbase rkkbase
join  f_dp_rkk rkk on rkkbase.id=rkk.id  


Структура таблицы f_dp_rkk:

 

 

Из таблицы  f_dp_rkkbase  выбираем  поля type, subject, complect, id.   Из таблицы  f_dp_rkk  выбираем  поля regnumprist, regnumcnt, regnumfin, если значение поля id в таблице f_dp_rkk  совпадает со значением  поля  id  в   таблице f_dp_rkkbase.

Объединяем эти поля и получаем поле regNumber (rkk.regnumprist || rkk.regnumcnt || rkk.regnumfin as regNumber). Группировать информацию в отчете будем  по полю complect, которое содержит алиас приложения.


Рис. 2.2.4.1. Запрос на отбор документов в отчет Example2.


Изменяем порядок полей. Поле complect должно быть первым в списке.


Рис. 2.2.4.1.  Порядок полей в шаблоне отчета.


Выбираем вкладку Data preview (Рис. .  2.2.4.1)  и обновляем информацию - Refresh Preview Data (Рис. .  2.2.4.2).


Рис. 2.2.4.2.  Документы, отобранные в отчет Example2.


Указываем, по каким полям будет производиться сортировка. Для этого выбираем вкладку Sorting(Рис. 2.2.4.2) и нажимаем кнопку Add. Появляется диалог   New Sort Field Wizard (Рис. 2.2.4.3).


Рис. 2.2.4.3. Выбор полей для сортировки


Выбираем  поле complectи нажимаем кнопку Finish. Таким же образом добавим в сортируемые поля regnumber(Рис. 2.2.4.4).


Рис. 2.2.4.4. Поля для сортировки документов в отчете.


Форматируем  шаблон как показано на рис. . 2.2.4.5.


Рис. 2.2.4.5. Отформатированный шаблон отчета.


5. Создание группы.


На вкладке Outline выбираем название отчета. По правой кнопке мышки получаем меню и выбираем пункт Create Group (Рис. 2.4.5.1).


Рис. 2.4.5.1. Создание группы.


Открывается диалог  Group Band (Рис. 2.2.5.2).  Присваиваем группе название - DBи выбираем поле, по которому производим группировку - complect.   Нажимаем кнопку Next.


Рис. 2.4.5.2. Название группы.


В следующем диалоге указываем, что добавляем на форму секцию GroupHeader (Заголовок группировки(Рис. 2.2.5.3).


Рис. 2.4.5.3. Добавление секции GroupHeader.


Нажимаем кнопку Finish.  На форме появляется секция DB Group Header1 (Рис. 2.4.5.4).


Рис. 2.4.5.4. Секция DB Group Header 1.


Указываем, что в этой секции будет отображаться информация из поля complect-$F{complect} (Рис.2.4.5.5.).


Рис. 2.4.5.5. Секция DB Group Header 1 с полем -$F{complect}.


Далее форматируем секцию с заголовком группы (Рис.2.2.5.6).


Рис. 2.4.5.6. Форматирование секции с заголовком группы.


Указываем границы (Рис. 2.4.5.7)


Рис. 2.4.5.7.  Границы  секции


Выбираем цвет фона для секции.  На вкладке Properties выбираем Appearance.  Далее в секции Color  выбираем  поле BackColor и в открывшемся диалоге выбираем нужный цвет.


Рис. 2.4.5.8_а. Выбор фона для секции Group Header


Рис. 2.4.5.8_б. Выбор фона для секции Group Header


И в результате секция отображается, как показано на Рис. 2.2.5.9. Обратите внимание  на поле Transparent. Оно не заполнено.

Рис. 2.2.5.9.  Отчет с измененным фоном секции.


6. Встроенные переменные. Номер страницы.

Переменная — это вычисляемое в процессе формирования отчёта значение. Доступно большое количество системных переменных, таких как номер страницы, номер строки.  Но разработчик шаблона также может создавать свои пользовательские  переменные. При работе с переменными важно помнить, что они зависят от значения EvaluationTime при выводе.


#

Название переменной

Значение переменной

1

PAGE_NUMBER

Содержит номер текущей страницы данного отчета на момент времени

2

MASTER_CURRENT_PAGE

Содержит номер страницы «мастера»,в котором расположен отчет в момент времени. Актуально для подотчетов, чтобы узнать страницу в родительском отчете

3

MASTER_TOTAL _PAGES

Содержит количество страниц всего в мастере на момент времени

4

COLUMN_NUMBER

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

5

REPORT_COUNT

Содержит номер текущей обрабатываемой записи (номер строки) в момент времени. Эта переменная используется для нумерации строк в момент расчета Now и в качестве общего количества записей в отчете (кол-во документов всего например) в момент расчета Report.

6

PAGE_COUNT

Содержит число страниц в отчете на момент времени.

7

COLUMN_COUNT

Содержит число колонок в отчете на момент времени.

8

Name

Имя переменной

9

Value Class Name

Класс, используемый для хранения значения в переменной.

10

Calculation

Выбор из нескольких агрегатных функций, которые выполняются с каждой новой обрабатываемой записью. Суммы, средние, мин/макс.

11

Expression

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

12

Initial  Value Expression

Значение на начало работы отчета. Или после сброса. Является Выражением java.

13

Increment type

К значению будет прибавлено 1 при обработке следующей выбранной итерации. Report – с каждой новой обрабатываемой записью, Page – с новой страницей, Column–с новой колонкой.

15

Incrementer Factory Class Name

При желании вместо увеличении на 1 можно передать свой собственный класс инкрементора.

16

Reset type

Переменная сбросит свое значение и применит Initial Value Expression при данном изменении. Например можно считать сумму на каждой странице отдельно.


Добавим в отчет настройки, которые позволят  при печати выводить номер страницы. Для этого вернем в отчет удаленную ранее секцию  Page Footer.  На вкладке Outline выбираем  Page Footerи нажимаем Add Band (Рис. 2.4.6.1).


Рис. 2.4.6.1.  Добавление в отчет секции Page Footer.


На форме появится секция Page Footer. Добавим в эту секцию текстовое поле/


Рис.. 2.4.6.2.  Добавление текстового поля.


Форматируем текстовое поле. Дважды щелкаем по выделенному полю и в открывшемся диалоге заполняем поле Expression Editor (Рис. 2.4.6.3).

$V{PAGE_NUMBER}

В этом выражении  $V(PAGE_NUMBER) – встроенная переменная, которая выводит номер страницы в отчет.


Рис. 2.4.6.3.  Встраивание переменной в поле.


Нажимаем кнопку Finish. Форма будет выглядеть, как показано на рис. 2.4.6.4.


Рис. 2.4.6.4. Встроенная переменная - номер страницы.


В отчет будет выводиться номер страницы (Рис. 2.2.6.5).


Рис. 2.4.6.5. В отчете печатаются номера страниц.

7. Использование выражений.

            Использование выражений рассмотрим на примере отчетаExample3. Создадим отчет и в Dataset and Query Dialog создадим запрос (Рис. 2.4.7.1).


Рис. 2.4.7.1. Запрос для отбора документов Example3.


Информацию, как и в отчете Example2,  будем получать из двух таблиц: f_dp_rkkbase и  f_dp_rkk (Рис. 2.4.7.1). Запрос будет выглядеть следующим образом:

Select
rkkbase.type, rkkbase.subject, rkkbase.complect, rkkbase.id, 
rkk.regnumprist || rkk.regnumcnt || rkk.regnumfin as regNumber,
rkk.regdate
from
f_dp_rkkbase rkkbase
join  f_dp_rkk rkk on rkkbase.id=rkk.id
where
rkkbase.complect in ('InputDocs','InternalDocs') 

Из таблицы  f_dp_rkkbase  выбираем  поля type, subject, complect, id, regdate.   Из таблицы  f_dp_rkk  выбираем  поля regnumprist, regnumcnt, regnumfin, если значение поля id в таблице f_dp_rkk  совпадает со значением  поля  id  в   таблице f_dp_rkkbase.

Объединяем эти поля и получаем поле regNumber (rkk.regnumprist || rkk.regnumcnt || rkk.regnumfin as regNumber).

В отчет отбираем только входящие и внутренние документы (where  rkkbase.complect in ('InputDocs','InternalDocs') ).\

Заполняем форму отчета, как показано на рис. 2.4.7.2.


Рис. 2.4.7.2. Форма отчета Example3.


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

Рис. 2.4.7.3.  Отчет Example3.


Формируем колонку № п/п. Для того, чтобы в этой колонке печатались номера строк по порядку, делаем следующее. В секции Detail1 создаем текстовое поле. Дважды щелкаем по этому полю мышкой и получаем диалог Expression Editor – редактор выражений, как показано на рис. 2.2.7.4.


Рис. 2.4.7.4. Добавление переменной для получения  порядкового номера.


Для получения  порядкового номера выбираем встроенную переменную $V(COLUMN_COUNT). $V – означает — переменная.

В колонке  «Номер», если документ  не зарегистрирован, будем печатать «Проект». Для этого   поле, где помещается Regnumber  редактируем, как показано на рис. 2.4.7.5 .

Рис. 2.4.7.5 . Редактирование колонки, где отображается номер документа.


Здесь выражение   ( $F{regnumber} !=null ? $F{regnumber} : "Проект") означает следующее- если regnumber не равно null, то печатается регистрационный номер документа, иначе печатается «Проект».

Форматируем дату таким образом, чтобы получить формат «дд.мм.гггг» (Рис. 2.4.7.6). В данном случае время нам выводить не нужно.

Рис. 2.4.7.6.   Форматирование даты.


Заголовок группировки редактируем так, чтобы вместо «InputDocs »  печаталось «Входящие документы», а вместо «Internaldocs» - «Внутренние документы» (Рис. 2.4.7.7).


Рис. 2.4.7.7. Выражение для вывода заголовка группировки.


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


Рис. 2.4.7.8.  Форма отчета Example3.


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


Рис. 2.4.7.9. Отчет Example3.\


8.  Использование параметров.

Параметры — это входные аргументы. Их значения неизменны во всём отчёте.

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


Добавим следующие параметры в отчет Example3:

- RepTitle – c помощью этого параметра пользователь может менять заголовок отчета

- Date.Start – начало периода регистрации документов, за который нужно выводить информацию в отчет

- Date.End – конец  периода регистрации документов, за который нужно выводить информацию в отчет.

Создаем параметр  RepTitle. Для этого на вкладке Outline выделяем   Parameters и нажатием правой кнопки мыши получаем  меню (Рис. 2.4.8.1).


Рис. 2.4.8.1. Добавление параметра в отчет.


Выбираем Create Parameter. И создаётся параметр Parameter1 (Рис. 2.4.8.2).

Рис. 2.4.8.2. Создание параметра.


Щёлкаем правой кнопкой мыши и получаем меню (Рис.2.4.8.3).

Рис. 2.4.8.3.  Свойства параметра.


В меню выбираем  Show Propertiesи получаем диалог, показанный на рис. 2.4.8.4.

Рис. 2.4.8.4. Переименование параметра.



В поле Name – название параметра меняем   “Parameter1” на  “RepTitle”.   В поле Class указываем java.lang.String – в параметре будет тип данных — строка.

Default Value Expression – значение параметра по умолчанию. Это значение можно будет поменять при запуске отчета на выполнение - Is For Prompting.


Редактируем на форме заголовок отчета (Рис. 2.4.8.5.). Выбираем параметр RepTitle.


Рис.2.4.8.5. Редактирование заголовка  отчета.


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

Рис. 2.4.8.6. Форма отчета с параметром $P{RepTitle}.


Создаем параметр Date.Start. Как и в предыдущем случае создаем параметр и редактируем его (Рис. 2.4.8.7).

Рис. 2.4.8.7. Редактирование параметра Date.Start .


Заполняем поля Name – название параметраDate.Startи поле Class – тип данных java.util.Date – Дата.

Подобным образом создаем параметр Date.End, но для этого параметра присваиваем значение по умолчанию — текущая дата (Рис.2.4.8.8.) .

Рис.  2.4.8.8. Редактирование параметра  Date.End.


Для того, чтобы присвоить значение по умолчанию, нажимаем на пиктограмму .  В открывшемся диалоге выбираем значение — встроенную функцию TODAY( ) - текущую дату (Рис. 2.4.8.9.)


Рис. 2.4.8.9.  Присвоение значения по умолчанию.


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


Рис. 2.4.8.10. Запрос с параметрами.



Добавляем в запрос   - and (regDate between $P{Date.Start}and $P{Date.End}). Здесь $P – обозначает — параметр.  Чтобы в отчет не попадали проекты документов добавим в запрос:

and  rkk.regnumcnt is not null.


Открываем вкладку Preview . Предлагается ввести параметры отчета (Рис. 2.2.8.11).


Рис. 2.4.8.11.  Ввод параметров отчета.


Значение по умолчанию для заголовка отчета изменяем на  «Список корреспонденции».

Дата окончания интервала  заполняется по умолчанию. Оставляем её без изменения. Для выбора даты начала интервала нажимаем на пиктограмму  , выбираем нужную дату (Рис. 2.2.8.11 …) и нажимаем пиктограмму.


Рис. 2.4.8.11. Выбор даты начала интервала..


Для продолжения выполнения отчета нажимаем пиктограмму (Рис. 2.4.8.12)


Рис. 2.4.8.12. Запустить выполнение отчета.


Результат выполнения отчета на рис. 2.4.8.12-а



Рис. 2.4.8.12-а. Результат выполнения отчета.


9.2. Использование подотчетов (Subreport).


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

SubreportExpression– используется для задания выражения класса объекта, возвращающего элемент Jasper. В случае, если результатом выражения является строка, Jasperreports будет искать файл по указанному в строке пути относительно .jrxml файла.

Using cache – указывает, следует ли располагать объект подотчета в памяти.  Данный флаг следует устанавливать в случае, если подотчет будет вызываться несколько раз.

Connection Expression – указывает выражение, используемое для получения подключения к БД через объект java.sql.Connection. По умолчанию используется тоже подключение, что и основной отчет.

Subreport parameters– список переменных, полей, передаваемых в подотчет в качестве входных параметров.

Subreportreturnvalues– список локальных переменных, которые примут значения из подотчета.


Использование подотчетов рассмотрим на примере отчета Example4. Отчет создаем  в папке  Example4.


9.1. Создание основного отчета.


            Создадим сначала форму отчета, как показано на рис. 2.4.9.1.

Рис.2.4.9.1          Подготовка основного отчета.


Этот отчет строится также, как и в примере Example3. Отличие состоит только в том, что в него отбираются только входящие документы -   where  rkkbase.complect in ('InputDocs').


Рис. . 2.4.9.2.   Запрос для отбора документов в отчет.


Все элементы на форме отчета и параметры сформированы также, как и в отчете Example3.


Если построить этот отчет, то увидим результат, показанный на рис. 2.4.9.3.


Рис. 2.4.9.3. Результат построения основного отчета без подотчета (subreport).


            В основной отчет необходимо добавить  колонку, в которой будут отображаться адресаты документа. Причем адресатов может быть как один, так и несколько. Для этого в основной  отчет добавим колонку «Адресаты» и встроим в нее подотчет (subreport).


2.  Создание подотчета (subreport).

В папке  Example4 создаем отчет Example4-sub  (Рис. ...).  В отчет добавляем поле adresseeи параметр Rkkid. Запрос для отбора документов в отчет показан на рис. 2.4.9.4.


Рис.  2.4.9.4.   Отчет (подотчет) Example4-sub в папке Example4.


Рис. 2.4.9.5.     Запрос в подотчете Example4-sub.


В этом запросе вычисляются фамилии сотрудников — адресатов документа. Так как адресатов может быть несколько, используется функция используется функция STRING_AGG для объединения строк.

Структура таблицы so_beard:


Структура таблицы f_dp_inputrkk_addressee:

Форматируем текстовое поле adressee, как показано на рисунках  Рис.2.4.9.6. и Рис.2.4.9.7..

Рис.2.4.9.6.    Закладка Appearanceполяadressee.


На закладке  Appearanceпоказываем размещение поля.

Рис. 2.4.9.7.   Закладка Borders поляadressee.


На закладке  Borders форматируем границы поля в отчете. В   данном случае границы отсутствуют. 


В подотчет добавляем параметр Rkkid.

Рис. 2.4.9.8.   Параметр  Rkkidв подотчете.


10. Использование скриптлетов (Scriptlet).

            Скриптлеты - это классы Java, которые предоставляют JasperReports дополнительные функции. Мы можем использовать скриптлеты, когда выражения отчета не могут выполнять более сложные операции. В приведенном примере используется UtilScriptlet для формирования списка, состоящего из названий "Тип документа". Разработку отчета начнем с создания скриптлета UtilScriptlet.

            Описание некоторых скриптлетов, разработанных для отчетов CompanyMedia приведено в разделе "Часто применяемые скриптлеты и их описание ".

Рис. 2.4.10.1.  Скриптлет  UtilScriptlet.


Скриптлет формирует список значений:



Разработаем форму отчета, SQL-запрос.

Рис. 2.4.10.2. SQL-запрос отчета.


Рис. 2.4.10.3. Отображение формы и свойств отчета Example3LP в JasperSoft Studio.


Рис. 2.4.10.6. Свойства параметра DOC_Type. Name.

В SQL-запрос добавляем

and rkkbase.type  in($P!{DocTypes}).

В запросе ($P!{DocTypes}) означает, что передаётся напрямую список отобранных при выполнении отчета значений.

Более подробно формирование списка, передаваемого в отчет, будет рассмотрено в разделе 3 (Включение отчетов в систему Company Media).