Подданный с ошибкой "Одна пустая запись"
Я хочу видеть отчет со всеми полями пустыми, но без источника, поэтому я должен сделать это с "Одна пустая запись". Основная проблема заключается в том, что что бы я ни делал, если в коде, который я вставил в выражение JRDatasource, есть JRXmlDataSource, он выдаст мне ошибку, если я поставлю "Одна пустая запись" в качестве источника данных.
Вот код:
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>