В прошлой статье мы рассмотрели Ireport (графический редактор для ZuckerReports в SugarCRM) издали, а сегодня подробней остановимся на составляющих отчета: параметры, поля, выражения и способах их размещения на теле отчета: группы, подотчеты (subreports) и разберем простенький пример step-by-step.
Параметры отчета – это переменные, при помощи которых можно вывести на тело отчета текст, ввести в отчет переменную (например, для уточнения MySQL запроса) ну и все что вообще могут делать переменные. Они всегда присутствуют в отчете предустановленные (их нельзя изменить или удалить, например REPORT_DATA_SOURCE) так же они могут добавляться пользователем. Выглядят так $P{parameter_name}.
Поля отчета – их в отчете нет, пока вы не сделаете запрос к БД и это ни что иное как результат MySQL запроса. Выглядят так $F{feald_name}.
Выражения отчета - это управляющие конструкции, при помощи которых мы управляем выводом в отчете, запросами к БД, делаем вычисления. Они так же есть в отчете по умолчанию, такие как: PAGE_COUNT, COLUMN_NUMBER и подобные, из их названия понятна их роль в отчете, если мы поместим, допустим, PAGE_COUNT в правый нижний угол отчета, то запустив его, увидим на последней странице в том же месте количество страниц в нашем отчете. Выражения добавляются пользователем и при создании некоторых элементов отчета. К примеру, когда мы создаем группу в отчете – то создается выражение (название_группы) _COUNT, которое, при размещении его в отчете, покажет нам количество различных элементов в группе. Выглядят выражения в отчете так $V{variable_name}.
Группа (group)– добавляются пользователем (у меня View -> Report groups) позволяют лучше структурировать отчет.
Подотчет (subreport) – это просто отчет в отчете.
Создадим отчет, показывающий все контакты, сгруппированные по половому признаку, относящиеся к конкретному контрагенту. Я администратор ZuckerReports в SugarCRM, поэтому пример из БД Sugar. Назовем отчет Sub_contacts.
Начнем с подотчета. Выбираем нужные поля из БД по контактам упорядоченные по полю, которому собираемся группировать,
select * from contacts order by pol
и размещаем в зоне detail. Создаем группу отчета – называем ее «pol», в Group Expression вписываем поле, по которому группируем $F{pol}. У нас появились две новых зоны в отчете pol_Header и pol_Footer, помещаем в нужную нам зону поле, указывающее на принадлежность к прекрасной или сильной половине человечества контакта (группироваться будет одинаково, где его не расположи) и запускаем.
У меня должны выводиться: имя контакта и его адрес обитания, и если данные в БД о контакте не полные, то в отчете мы увидим на их местах null. Что бы это предотвратить добавим условие в поля, которые могут быть пустыми (правой кнопкой на поле -> Edit Expression).
Вот что мы видим:
$F{primary_address_street}
Исправим на:
( ($F{primary_address_street} != null) ? $F{primary_address_street} : "")
т. е. если поле имеет значение отличное от “null”, то выводим его, если нет, то выводим пустую строку (естественно можно указать все что угодно вместо пустой строки: «НЕТ ДАННЫХ» или «АЙ-ЯЙ-ЯЙ ЧТО ТВОРИТСЯ ТО??, ДЕЛАТЬ ТО ЧТО ТЕПЕРЬ??!!» или вывести это поле красным цветом).
Вот и весь отчет, который мы будем вставлять в другой, с контрагентами. Конкретно в моем примере можно было обойтись и без подотчетов, но моя задача была показать их в действии, поэтому я придумал эти абсурдные, с точки зрения применения на практике запросы. Кстати насчет практики: все созданные subreports храните — это возможные составляющие других отчетов.
Вернемся к нашим панамам. Нам нужна переменная, с помощью которой мы будем получать значение (id) контрагента и для него выводить соответствующие данные по контактам. Создадим параметр $P{acc_id} и ставим галочку «use as a prompt».
Подправим немного запрос к БД:
select * from contacts where account_id` = $P{acc_id} order by pol
Теперь при запуске IReport спросит у нас значение, по которому выводить данные о контактах. Этот параметр и обеспечит нам связь между отчетом главным и подотчетом.
Создадим новый отчет Master, в который будем добавлять наш Sub_contacts.
Напишем запрос к БД:
SELECT * FROM accounts
Добавляем отчет содержащий информацию о контактах. Выбираем на панели инструментов subreport и помещаем под расположенными уже полями из таблицы контрагентов. Включится мастер-помощник добавления подотчетов. В первом диалоговом окне выбираем “Use an existing report” (использовать существующий отчет) и выбираем наш Sub_contacts. В следующем окне указываем тип соединения с источником данных “Use the same connection used to fill the master report” (использовать тот же тип соединения, что и отчет, в который вставляем подотчет). Затем выбираются параметры из добавляемого отчета (тут мы увидим наш acc_id). Последний шаг — выбираем путь к подотчету (нижний это абсолютный путь, верхний вариант динамический содержащий в себе параметр $P{SUBREPORT_DIR}, в котором и содержится путь).
В свойствах подотчета переходим на вкладку Subreport (other), где в нижнем окошке добавляем параметр (если его там не будет) acc_id и в “default value expression” ставим поле, по которому будут выводиться данные о контактах — $F{id}.
Компилируем оба отчета и выводим результат:
Полезная мелочь: в ходе наполнения зон отчета полями и другими объектами, вам наверняка приходилось по несколько раз двигать – увеличивать – двигать – уменьшать этот объект, что бы нижняя граница зоны была четко под нижней линией объекта. Просто кликните два раза по нижней линии зоны и она подскочит прямо под нижний объект .
И, кстати, в разделе DOWNLOAD появились модуль ZuckerReports 1.12 для SugarCRM на русском языке – pack_russian_ZR, и модуль русификации для уже установленного ZuckerReports 1.12 - ZuckerReportsCE_ru
В следующей статье разберем чарты и графики. Оставайтесь с нами.
Высказать своё мнение о статье Вы можете в комментариях, если Вас интересуют какие либо вопросы или дополнения, то обсуждение по данной теме доступно на нашем форуме.
а как сделать ссылку в левом меню, чтобы допустим при нажатии на нее информация из модуля (например quotes) перемещалась в zuckerreports и там уже можно было бы запустить отчет?
Как только в отчете в IReport у меня появляется параметр какой-нибудь $P{}(и все работает как надо), то ZuckerReport не подключает его в Шаблоны запросов и отчетов, выдает много красного текста. Не подскажите в чем дело?