410013796724260
• Webmoney
R335386147728
Z369087728698
Группировка и суммирование данныхДанная статья является продолжением двух других статей, где рассматривался пример использования библиотеки JasperReport для создания отчета на основе jrxml-шаблона, формируемого приложением iReport Designer. Здесь описанный ранее пример получает дальнейшее развитие и на его основе рассматриваются четыре вопроса :
В статье практически не будет Java кода; основной упор переносится на iReport Designer : формирование секций отчета (группировка, суммирование), определение переменных для секций, взгляд на добавленные в jrxml-шаблон секции изнутри. Общая структура jrxml-шаблона на примере описана в предыдущих статьях и здесь будут представлены только изменения. В конце статьи пример можно скачать. На следующем скриншоте представлена страница отчета, которая будет создаваться с использованием шаблона.
Определение переменныхДля секций группировки и суммирования потребуются переменные. Добавим для этих секций переменные sum_group и summa. Кроме этого добавим переменную num, которую будем использовать для нумерации записей в группе. Чтобы добавить переменную необходимо выделить в панели Report Inspector элемент Variables и в контекстном меню, вызываемом нажатием правой клавиши мыши, выбрать пункт меню «Add Variable», как это представлено на следующем скриншоте.
После этого определяем свойства переменной. Для этого выделяем переменную в панели Report Inspector и в панели Properties устанавливаем соответствующие параметры - наименование (Name), тип (Variable Class) и т.д.
В следующей таблице представлен список используемых в шаблоне переменных и их установленные свойства. Все переменные имеют тип java.lang.Integer.
Переменная cost используется для вычисления значения одной записи, т.е. только одно значение по горизонтали. Переменные summa и sum_group используются для определения сумм нескольких записей. У переменных cost, summa и sum_group значение параметра Variable Expression идентично - произведение значений двух полей $F{quantity} и $F{price}. Значение параметра Calculation переменных summa и sum_group определено как Sum (из списка). Поскольку переменная sum_group используется только в группе записей, то для нее установлены параметры Reset Type и Reset Group. Для переменной num, определяющей номер записи в группе, в параметре Calculation выбрано значение Count, определены значения групповых параметров (Reset Type, Reset Group). Подсчет значений (Variable Expression) выполняется для поля $F{item}. Ниже в листинге представлено описание переменных в jrxml-шаблоне. Листинг переменных - Variables
<variable name="cost" class="java.lang.Integer">
<variableExpression>
<![CDATA[
new Integer($F{quantity}.intValue()*$F{price}.intValue())
]]>
</variableExpression>
</variable>
<variable name="sum_group" class="java.lang.Integer"
resetType="Group"
resetGroup="State name"
calculation="Sum">
<variableExpression>
<![CDATA[
new Integer($F{quantity}.intValue()*$F{price}.intValue())
]]>
</variableExpression>
</variable>
<variable name="summa" class="java.lang.Integer"
calculation="Sum">
<variableExpression>
<![CDATA[
new Integer($F{quantity}.intValue()*$F{price}.intValue())
]]>
</variableExpression>
</variable>
<variable name="num" class="java.lang.Integer"
resetType="Group"
resetGroup="State name"
calculation="Count">
<variableExpression>
<![CDATA[$F{item}]]>
</variableExpression>
</variable>
Определение группыДля создания групповой секции необходимо выделить корневую запись, вызвать контекстное меню и выбрать "Add Report Group".
В результате данного действия iReport откроет «мастера» создания групповой секции. Необходимо на первом шаге определить наименование группы и поле для группировки. Выбираем группировку записей по "штату" $F{stat}.
На следующем шаге устанавливаем обе подсекции группы, которые будем использовать для
Размещаем в секции «group header» поле $F{stat}, а в секции «group footer» - статическое поле (Static Field) "Итого :" и поле «Text Field» с переменной $V{sum_group}. В предыдущей статье была рассказано как разместить в шаблоне компоненты и связать их с переменными. В результате в панели Report Inspector у нас появились элементы группой секции : «State name Group Header 1» и «State name Group Footer 1».
Групповых секций может быть несколько. Ниже представлен листинг групповой секции в jrxml-шаблоне. Обрамление компонентаДля обрамления поля используем безымяное окно, открываемое из контекстного меню ("Padding and Borders"). Можно определить толщину и стиль линии обрамления, цвет и сторону компонента.
Листинг групповой секции group - groupHeader, groupFooter
<group name="State name">
<groupExpression>
<![CDATA[$F{state}]]>
</groupExpression>
<groupHeader>
<band height="18">
<textField>
<reportElement x="69" y="0" width="442" height="18"
uuid="1adc41ce-7c09-46fe-960a-dff145ad7e50"/>
<box>
<topPen lineWidth="1.0"/>
<leftPen lineWidth="1.0"/>
<bottomPen lineWidth="1.0"/>
<rightPen lineWidth="1.0"/>
</box>
<textElement textAlignment="Center"
verticalAlignment="Middle">
<font size="11" isBold="true" isItalic="false"/>
<paragraph leftIndent="10"/>
</textElement>
<textFieldExpression>
<![CDATA[$F{state}]]>
</textFieldExpression>
</textField>
</band>
</groupHeader>
<groupFooter>
<band height="18">
<staticText>
<reportElement mode="Opaque" x="69" y="0"
width="343" height="18"
backcolor="#F8F8F8"
uuid="97bb96e0-d791-4b78-a952-767f248cfb77"/>
<box>
<pen lineWidth="1.0"/>
<topPen lineWidth="1.0"/>
<leftPen lineWidth="1.0"/>
<bottomPen lineWidth="1.0"/>
<rightPen lineWidth="1.0"/>
</box>
<textElement textAlignment="Right"
verticalAlignment="Middle">
<font size="11" isBold="true" isItalic="false"/>
<paragraph rightIndent="10"/>
</textElement>
<text>
<![CDATA[Итого :]]>
</text>
</staticText>
<textField>
<reportElement mode="Opaque" x="412" y="0"
width="99" height="18"
backcolor="#F8F8F8"
uuid="990ce7e6-1cb4-43ba-b9e3-cfc5abd0be0e"/>
<box>
<pen lineWidth="1.0"/>
<topPen lineWidth="1.0"/>
<leftPen lineWidth="1.0"/>
<bottomPen lineWidth="1.0"/>
<rightPen lineWidth="1.0"/>
</box>
<textElement textAlignment="Right"
verticalAlignment="Middle">
<font isBold="true"/>
<paragraph rightIndent="5"/>
</textElement>
<textFieldExpression>
<![CDATA[$V{sum_group}]]>
</textFieldExpression>
</textField>
</band>
</groupFooter>
</group>
Листинг секции SummaryДобавим в шаблон секцию Summary и разместим в ней статическое поле (Static Field) "Всего :" и переменную $V{sum}; «выделим» компоненты бледно-серым цветом. Как добавить секцию в jrxml-шаблон было рассказано в предыдущей статье. Ниже в листинге представлена секция Summary.
<summary>
<band height="18">
<staticText>
<reportElement mode="Opaque" x="69" y="0"
width="343" height="18"
backcolor="#F8F8F8"
uuid="44add398-f6d7-4075-bbce-1a15e6a10b5a"/>
<box>
<pen lineWidth="1.0"/>
<topPen lineWidth="1.0"/>
<leftPen lineWidth="1.0"/>
<bottomPen lineWidth="1.0"/>
<rightPen lineWidth="1.0"/>
</box>
<textElement textAlignment="Right"
verticalAlignment="Middle">
<font size="11" isBold="true" isItalic="false"/>
<paragraph rightIndent="10"/>
</textElement>
<text><![CDATA[Всего :]]></text>
</staticText>
<textField>
<reportElement mode="Opaque" x="412" y="0"
width="99" height="18"
backcolor="#F8F8F8"
uuid="fb524506-8517-4436-bcfc-90c89d24710a"/>
<box>
<pen lineWidth="1.0"/>
<topPen lineWidth="1.0"/>
<leftPen lineWidth="1.0"/>
<bottomPen lineWidth="1.0"/>
<rightPen lineWidth="1.0"/>
</box>
<textElement textAlignment="Right" verticalAlignment="Middle">
<font isBold="true"/>
<paragraph rightIndent="5"/>
</textElement>
<textFieldExpression>
<![CDATA[$V{summa}]]>
</textFieldExpression>
</textField>
</band>
</summary>
В заключение представим интерфейс получившегося jrxml-шаблона.
Скачать примерИсходные коды примера создания отчета, включающего секции группировки и суммирования данных, с использованием библиотеки JasperReports можно скачать здесь (7.97 Кб). Пример настройки JDBC в приложении iReport и формирование JasperReport отчета можно увидеть здесь. |
