Мне нужна помощь с JasperReports. Я пытаюсь создать отчет из XML-файла в качестве адаптера данных, список имеющихся у меня элементов выглядит так:
Уровень: уровни с 6 по 5 -Специализация: Нет специальности Уровень: уровни с 5 по 4 -Специализация: Нет специальности Уровень: уровень-тест-первый -Специализация: Специальность Test-t -Специализация: Специальность Test-t2
Я тоже хочу напечатать это так, но в отчете печатается только первый уровень с первой специальностью каждого уровня, примерно так:
Уровень: уровни с 6 по 5 -Специализация: Нет специальности -Специальность: Нет специальности -Специализация: Специальность Test-t
Я начинаю задаваться вопросом, можно ли вообще использовать группы с адаптером данных XML, поскольку все примеры, которые я нашел до сих пор, используют адаптер данных SQL
Вот XML с данными:
<person>
<id>11111</id>
<employeeNumber>12887</employeeNumber>
<name>NAME EXAMPLE </name>
<location>3333</location>
<plan>
<planId>68</planId>
<planName>Plan Test</planName>
<plant/>
<levels>
<level>
<item>
<description>Level 6 to 5</description>
<id>1</id>
<name>Level 6 to 5</name>
</item>
<specialities>
<speciality>
<item>
<id>0</id>
<name>No Speciality</name>
</item>
<courses/>
</speciality>
</specialities>
</level>
<level>
<item>
<description>Level 5 to 4</description>
<id>20</id>
<name>Level 5 to 4</name>
</item>
<specialities>
<speciality>
<item>
<id>0</id>
<name>No Speciality</name>
</item>
<courses/>
</speciality>
</specialities>
</level>
<level>
<item>
<description>level-test-first</description>
<id>19</id>
<name>level-test-first</name>
</item>
<specialities>
<speciality>
<item>
<description>Speciality Test-t</description>
<id>9</id>
<name>Speciality Test-t</name>
</item>
</speciality>
<speciality>
<item>
<description>Speciality Test-t2</description>
<id>10</id>
<name>Speciality Test-t2</name>
</item>
<courses/>
</speciality>
</specialities>
</level>
</levels>
</plan>
Это мой отчет:
<?xml version = "1.0" encoding = "UTF-8"?>
<jasperReport xmlns = "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 = "pruebaGrupos" language = "groovy" pageWidth = "612" pageHeight = "792" columnWidth = "555" leftMargin = "20" rightMargin = "20" topMargin = "20" bottomMargin = "20" uuid = "f9c990e6-305b-46fe-b9ad-f1c992e1cbb9">
<property name = "ireport.zoom" value = "1.0"/>
<property name = "ireport.x" value = "0"/>
<property name = "ireport.y" value = "39"/>
<queryString language = "XPath">
<![CDATA[/person/plan/levels/level]]>
</queryString>
<field name = "levels" class = "java.lang.String">
<fieldDescription><![CDATA[/person/plan/levels]]></fieldDescription>
</field>
<field name = "level" class = "java.lang.String">
<fieldDescription><![CDATA[/person/plan/levels/level]]></fieldDescription>
</field>
<field name = "item" class = "java.lang.String">
<fieldDescription><![CDATA[/person/plan/levels/level/item]]></fieldDescription>
</field>
<field name = "id" class = "java.lang.String">
<fieldDescription><![CDATA[/person/plan/levels/level/item/id]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[/person/plan/levels/level/item/name]]></fieldDescription>
</field>
<field name = "item2" class = "java.lang.String">
<fieldDescription><![CDATA[specialities/speciality/item]]></fieldDescription>
</field>
<field name = "name2" class = "java.lang.String">
<fieldDescription><![CDATA[specialities/speciality/item/name]]></fieldDescription>
</field>
<group name = "groupLevel">
<groupExpression><![CDATA[$F{name}]]></groupExpression>
<groupHeader>
<band height = "50">
<textField isStretchWithOverflow = "true" isBlankWhenNull = "true">
<reportElement x = "0" y = "0" width = "100" height = "20" uuid = "64397dc7-2588-4642-8e52-dc8861242ac4"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
</band>
</groupHeader>
<groupFooter>
<band height = "50"/>
</groupFooter>
</group>
<background>
<band splitType = "Stretch"/>
</background>
<title>
<band height = "79" splitType = "Stretch"/>
</title>
<pageHeader>
<band height = "35" splitType = "Stretch"/>
</pageHeader>
<columnHeader>
<band height = "61" splitType = "Stretch">
<staticText>
<reportElement x = "100" y = "0" width = "100" height = "20" uuid = "935a54a5-d57d-4f6c-8dfb-93a0ec95ad01"/>
<text><![CDATA[Speciality Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "125" splitType = "Stretch">
<textField>
<reportElement x = "100" y = "0" width = "100" height = "20" uuid = "0b37e00b-b798-4795-bb62-f50c752fae59"/>
<textFieldExpression><![CDATA[$F{name2}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height = "45" splitType = "Stretch"/>
</columnFooter>
<pageFooter>
<band height = "54" splitType = "Stretch"/>
</pageFooter>
<summary>
<band height = "42" splitType = "Stretch"/>
</summary>
Может кто-нибудь сказать мне, делаю ли я что-то не так? Заранее спасибо.





Я нашел ответ, не уверен, что это лучший способ сделать это, но у меня он сработал:
Для основного отчета XPath должен быть путем к параметру, который вы хотите использовать в качестве элемента группы, следуя описанному сценарию, должен выглядеть примерно так:
<queryString language = "XPath">
<![CDATA[/person/plan/levels/level]]>
</queryString>
Затем вы создаете подотчет в полосе деталей, подотчет должен использовать выражение источника данных, где вы используете Путь элемента второй группы, что-то вроде:
<detail>
<band height = "18" splitType = "Stretch">
<subreport>
<reportElement x = "0" y = "0" width = "572" height = "18" isRemoveLineWhenBlank = "true" isPrintWhenDetailOverflows = "true" uuid = "64769eb9-baec-4995-a139-3a5f102f4764"/>
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/level/specialities/speciality")]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subReport.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
Теперь вы заполняете подотчет, где, если вы хотите сгруппировать в нем больше элементов, вы должны запустить XPath в элементе, который хотите сгруппировать, как в основном отчете, это должно сработать, если вы также хотите создать третью группу, вам просто нужно создать подотчет и повторить процесс.
Надеюсь, это кому-то поможет, при необходимости могу расширить объяснение, просто спросите.
Я нашел решение, вы можете сгруппировать только один элемент, для другого вы должны использовать подотчет, XPath должен быть путем к родительскому элементу, с которого вы хотите начать группу.