Подданный с ошибкой "Одна пустая запись"

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

Скриншот выражения JRDatasource

Вот код:

IF($P{REPORT_DATA_SOURCE}.toString().toLowerCase().contains("net.sf.jasperreports.engine.jremptydatasource"),new net.sf.jasperreports.engine.JREmptyDataSource(),((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("SOME XPATH HERE"))

Я искал весь день, но все, что я делаю, идет в одну и ту же точку.

Caused by: java.lang.ClassCastException: net.sf.jasperreports.engine.JREmptyDataSource cannot be cast to net.sf.jasperreports.engine.data.JRXmlDataSource

1 ответ

Решение

Вы должны проверить это $P{REPORT_DATA_SOURCE} это подкласс net.sf.jasperreports.engine.JREmptyDataSource из нет.

Действительное выражение в вашем случае будет:

<dataSourceExpression><![CDATA[IF(($P{REPORT_DATA_SOURCE} instanceof net.sf.jasperreports.engine.JREmptyDataSource), new net.sf.jasperreports.engine.JREmptyDataSource(), ((net.sf.jasperreports.engine.data.JRXmlDataSource) $P{REPORT_DATA_SOURCE}).subDataSource("SOME XPATH HERE"))]]></dataSourceExpression>

Например, этот код Java будет работать с jrxml ниже:

Map<String, Object> params = new HashMap<>();
//params.put("REPORT_DATA_SOURCE", new JRXmlDataSource("customers.xml", "/Customers/*")); // this is working expression also
params.put("REPORT_DATA_SOURCE", new JREmptyDataSource(1)); // one record dataset 

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource);

Шаблон:

<?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="Report with check of datasource" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="REPORT_DATASOURCE" class="java.lang.Object"/>
    <field name="id" class="java.lang.String">
        <fieldDescription><![CDATA[child::text()]]></fieldDescription>
    </field>
    <variable name="expression" class="java.lang.String">
        <variableExpression><![CDATA["/Customers/Customer[CustomerID='" + $F{id} + "']"]]></variableExpression>
    </variable>
    <detail>
        <band height="70" splitType="Stretch">
            <textField>
                <reportElement x="100" y="0" width="100" height="15"/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="0" y="0" width="100" height="15"/>
                <text><![CDATA[Id:]]></text>
            </staticText>
            <subreport>
                <reportElement x="54" y="15" width="380" height="45"/>
                <dataSourceExpression><![CDATA[IF(($P{REPORT_DATA_SOURCE} instanceof net.sf.jasperreports.engine.JREmptyDataSource), new net.sf.jasperreports.engine.JREmptyDataSource(), ((net.sf.jasperreports.engine.data.JRXmlDataSource) $P{REPORT_DATA_SOURCE}).subDataSource("SOME XPATH HERE"))]]></dataSourceExpression>
                <subreportExpression><![CDATA["./jrxml/subreport_with_xml.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>
Другие вопросы по тегам