当报表查询返回空集时,jasper报告中的空值与xml远程数据源一起使用

时间:2014-10-23 06:47:29

标签: jasper-reports jasperserver

我有title部分的报告

"免于报告" + $ F {dt}

我按如下方式定义dt字段:

<field name="dt" class="java.lang.String">
    <fieldDescription><![CDATA[ancestor::data/@dt]]></fieldDescription>
</field>

我的xpath2查询

/data/row

我使用xml远程数据源,这里是输入(这是来自远程服务,我无法更改)

<data dt="03.10.2014">
    <!-- some data like <row id="42" label="text" />, but now it is empty -->
</data>

我想要&#39;什么时候没有数据&#39;所有部分,没有细节

但是当xml中没有row个节点时,我会在标题中找到它

Exempt report by null

dt仍然存在于xml中,我想要Exempt report by 03.10.2014

我应该如何定义dt字段?我应该更改报告查询吗?

我通过REST api与jasper服务器交互,只传递jrxml和xml url,所以我只能更改报告模板(jrxml)

1 个答案:

答案 0 :(得分:0)

将报告查询从data/row更改为/data。 在这种情况下,报告将包含记录,因此@dt将不具有空值。
但是这个解决方案要求$ F {dt}必须放入细节带。
在测试报告中,我认为节点<data>只有一个(或零)节点<row>

测试xml

<?xml version="1.0" encoding="UTF-8"?>
<root>   
    <data dt="03.10.2014">
        <row id="42" label="text42"/>
    </data> 
</root>

报告(在iReport 4.8.0中制作)

<?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="emptyXML" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="66c63e65-62f4-4fd9-aa1a-78c5c7d72620">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <queryString language="xPath">
        <![CDATA[/root/data]]>
    </queryString>
    <field name="dt" class="java.lang.String">
        <fieldDescription><![CDATA[@dt]]></fieldDescription>
    </field>
    <field name="id" class="java.lang.String">
        <fieldDescription><![CDATA[row/@id]]></fieldDescription>
    </field>
    <field name="label" class="java.lang.String">
        <fieldDescription><![CDATA[row/@label]]></fieldDescription>
    </field>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="79" splitType="Stretch"/>
    </title>
    <detail>
        <band height="40" splitType="Stretch">
            <textField>
                <reportElement uuid="e9831b27-7468-4117-803b-11026ee72942" x="57" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{dt}]]></textFieldExpression>
            </textField>
            <textField isBlankWhenNull="true">
                <reportElement uuid="dd52ac3a-9d1a-427b-8cb8-c5e50c0afec0" x="57" y="20" width="100" height="20" isRemoveLineWhenBlank="true"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <textField isBlankWhenNull="true">
                <reportElement uuid="3d1e10ec-4e7a-472c-9d87-8170cf21681b" x="174" y="20" width="100" height="20" isRemoveLineWhenBlank="true"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{label}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

如果存在包含许多<row>的xml,则必须更改此报告。可能会将子报表插入到详细信息区域中,并将$F{id)$F{text}移动到子报表中。