Групповые данные для адаптера данных XML

avatar
Angel Aguilar
8 апреля 2018 в 08:40
302
1
-1

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

Уровень: от 6 до 5 - Специальность: нет специальности Уровень: Уровень с 5 по 4 - Специальность: нет специальности Уровень: уровень-тест-первый -Специальность: Специальный тест-t -Специальность: Специальный тест-t2

Я тоже хочу так напечатать, но в отчете печатается только первый уровень с первой специальностью каждого уровня, примерно так:

Уровень: от 6 до 5 - Специальность: нет специальности - Специальность: нет специальности - Специальность: Специальный тест-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>

Может ли кто-нибудь сказать мне, если я делаю что-то не так? заранее спасибо.

Источник
Angel Aguilar
10 апреля 2018 в 20:58
0

Я нашел решение, вы можете сгруппировать только один элемент, для другого вы должны использовать вложенный отчет, XPath должен быть путем к родительскому элементу, из которого вы хотите начать группу.

Ответы (1)

avatar
Angel Aguilar
12 апреля 2018 в 16:50
0

Я нашел ответ, не уверен, что это лучший способ сделать это, но мне это помогло:

Для основного отчета 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 в элементе, который хотите сгруппировать, как в основном отчете, это должно работать, если вы хотите создать третий group тоже, вам просто нужно создать подотчет и повторить процесс.

Надеюсь, это поможет кому-то, я могу расширить объяснение, если нужно, просто спросите.