Отчёты для NORD POS. Часть 116.01.2015 19:03
Берём данные, JasperReports и заполняем шаблон в iReport
Эта статья посвящена не столько, как это сделать красиво с точки зрения дизайна, а как с помощью имеющихся средств JasperReports сделать отчёты чёткими для восприятия пользователем и удобными для дальнейшего использования интегратором. Так как JasperReports, это в первую очередь не самостоятельное приложение, а библиотека расширения для программ написанных на Java, то в качестве источника информации для построения отчётов будем использовать базу данных от NORD POS (подробнее об этом моём проекте в отдельной статье). При этом изложенный «под катом» материал, я надеюсь, будет интересен не только пользователям моей POS, но и всем тем, кто хочет больше узнать о мощном инструменте формирования отчётов для своего приложения, а на русском языке материалов посвящённых JasperReports не так и много.
Загружаем основу
Основой построения любого отчёта средствами JasperReports является шаблон с расширением jrxml. Этот файл XML-формата можно создать с нуля, как в текстовом редакторе, так и скомпоновать из элементов (а по сути XML-тегов) в визуальной оболочке iReport. Приложение iReport есть в виде плагина для NetBeans или в виде самостоятельной программы. Для данной статьи я выбрал второй вариант, как более наглядный с моей точки зрения.Первое, что необходимо сделать после установки и запуска iReport, это создать чистый лист шаблона для последующего заполнения элементами отчёта (команда File → New…). Я выбрал шаблон формата A4, расположенный портретно.
В дальнейшем вы можете поменять, как формат листа, так и поля отступов на нём (команда Format → Page format…). И здесь вы встретитесь с первой проблемой, которую придётся учитывать по ходу всей работы с JasperReports, невозможностью точно выставить значения в привычных нам миллиметрах. Точно можно выставить только значение в пикселях, при этом на один дюйм приходится 72 пикселя, а вот в миллиметрах это всегда будет дробное значение 25,4 мм. В обычном отчёте из столбцов это не сильно существенно, но если делать шаблон этикетки, то такой подход к расчётам вам попортит значительно нервы, так как под рукой только миллиметровая линейка и необходимо будет экспериментально подобрать, то количество пикселей которое будет вмещаться при печати на заготовку этикет ленты. Вот как у меня получилось:
Та-же пустая форма отчёта в виде XML
И эти размеры будут примерно соответствовать отступам сверху и снизу по 11 мм, слева 15 мм, а справа 10 мм.Подключаем источник
Если шаблон формы отчёта, это основная визуальная составляющая JasperReports, то источники данных, это внутрення основа механизма обработки и построения отчёта. В качестве источника данных, могут служить, как базы или хранилища данных, так и например просто табличные или текстовые файлы. Но в моём случае с NORD POS в качестве источника данных выступит база данных Apache Derby, подключаемая через JDBC-драйвер. Так как библиотека драйвера клиента Apache Derby по-умолчанию не добавлена в окружение iReport, предварительно нужно указать к ней путь в параметрах (команда Tools → Options) и перезагрузить iReport.
Изначально источник выбранный по-умолчанию пуст.
Но войдя в параметры можно будет его добавить, сделав источником информации для заполнения полей отчёта.
Указав параметры JDBC-драйвера и запустив предварительно NORD POS, можно проверить соединение. А для того, чтобы убедиться, что поля базы данных доступны JasperReports, сделаем простой запрос.
Этот запрос, но в формате XML
Наш источник готов к использованию.Пишем запрос
Это был очень простой SQL-запрос, в результате его выполнения мы получим только список товаров хранящийся в базе данных NORD POS. Но обычно в отчётах приходится использовать более сложные конструкции. Кроме названий самих товаров хорошо было-бы получить названия категорий товаров для последующий группировки товаров в нашем отчёте. А, так как цена продажи товаров у нас не содержит налога, то ещё необходимо получить ставку налога по каждой позиции товара в справочнике. В итоге, для дальнейшего построения отчёта, будем использовать SQL-запрос такого вида:
SELECT
PRODUCTS.NAME AS PRODUCT_NAME
, PRODUCTS.REFERENCE AS PRODUCT_REFERENCE
, PRODUCTS.PRICESELL AS PRODUCT_PRICESELL
, PRODUCTS.CATEGORY AS CATEGORY_ID
, CATEGORIES.NAME AS CATEGORY_NAME
, TAXES.RATE AS TAX_RATE
FROM
PRODUCTS
LEFT OUTER JOIN CATEGORIES ON PRODUCTS.CATEGORY = CATEGORIES.ID
LEFT OUTER JOIN TAXCATEGORIES ON PRODUCTS.TAXCAT = TAXCATEGORIES.ID
LEFT OUTER JOIN TAXES ON TAXCATEGORIES.ID = TAXES.CATEGORY
ORDER BY CATEGORIES.NAME, PRODUCTS.NAME
При этом сразу хочу предупредить, при построении SQL-запросов постарайтесь избегать в них конструкций для группировки данных непосредственно на уровне источника, но не забывайте предварительно данные отсортировать. Лучше доверить все операции связанные с консолидацией информации непосредственно JasperReports, так ваш отчёт будет более универсальным для различных СУБД, а вы в дальнейшем более гибко сможете менять последовательность алгоритмов обработки по представлению данных в различной форме.В итоге на панели структуры отчёта станут доступны поля из источника данных.
А в XML-шаблоне появится набор тегов
Размещаем данные
Когда данные доступны, самое время рассказать о том, как их разместить в отчёте. Для начала просто разместим полученные поля в секции Detail, автоматически подписи к полям будут вынесены в секцию заголовка Column Header.В XML-шаблоне будут сгенерированы секции columnHeader и detail
Теперь, если нажмём на предпросмотр, то увидим наш список товаров из базы данных уже в виде отчёта.
Данные получены и отчёт сформирован, теперь можно приступить к их обработке и оформлению отчёта для более наглядного представления информации.
Оформляем шаблон
Начнём с самого простого, сделаем заголовок и нижний колонтитул нашего отчёта. Для этого в секцию Title добавим подпись и синий баннер для фона, а в Page Footer поле с подстановкой переменных для количества страниц.Секция заголовка отчёта title
Секция нижнего колонтитула pageFooter
Для того, чтобы предать единообразность отчётам, рекомендую использовать набор стилей, сделав один из них основным по-умолчанию. Стили — это группа полей в начале нашего шаблона, они устанавливают общие параметры для оформления элементов отчёта, и могут быть заданны не только для текстовых элементов, но и для фигур и линий включённых в шаблон.
Набор стилей
Делаем расчёты
При создании шаблонов в разделе переменных автоматически генерируется несколько счётчиков, их значение меняется в зависимости от положения в шаблоне. Например мы уже использовали PAGE_NUMBER для подсчёта страниц, при этом используя одну и туже переменную, но задав параметр evaluationTime=«Report» для второго поля, мы получили общее количество страниц в отчёте.
Для указания порядкового номера номенклатурной позиции в отчёте используем переменную COLUMN_COUNT, выбрав её из списка и вставив в выражение для расчёта значения поля.
Порядковый номер строки
Значение артикула PRODUCT_REFERENCE, так как оно содержит только цифры и знак минус в качестве разделителя между кодом группы и кодом товара, поместим в отдельный объект генерирующий штрих-код.
Поле штрих-кода
Поле PRODUCT_NAME, PRODUCT_PRICESELL и TAX_RATE оставим таким, какими они были получены из база данных, только указав паттерны для PRODUCT_PRICESELL валюты, а для TAX_RATE процента.
Поля PRODUCT_NAME, PRODUCT_PRICESELL и TAX_RATE
Последним у нас идёт поле расчёта для получения суммы цены с налогом.
Расчёт цены с налогом
Группируем поля
Ну и напоследок сделаем две группировки. Первая, сгруппируем нашу номенклатуру товаров по коду категории, посчитав с помощью Categories_COUNT сколько позиция входит в каждую.Группировка номенклатуры по категории товара
Вторая, это финальная секция отчёта Summary, в ней REPORT_COUNT подсчитает сколько всего номенклатурных позиций вошло в наш отчёт.
Суммарный итог
Шаблон готов
Всё, можно нажимать просмотр, наш шаблон готов для формирования отчёта.
Теперь можно приступать к его интеграции в NORD POS, но этому будет посвящена вторая часть статьи. А в этой части я постарался максимально обобщённо и просто рассказать об основных действиях для создания шаблонов в iReport, так что описанное здесь пригодится не только пользователям NORD POS, а всем у кого появилась необходимость в первый раз создать собственный отчёт для библиотеки JasperReports.
© Habrahabr.ru