错误子数据集与"一个空记录"

时间:2018-03-21 18:34:38

标签: jasper-reports datasource classcastexception

我希望看到一个包含所有字段但没有来源的报告,所以我必须使用"一个空记录"。主要的问题是无论我做什么,如果我在JRDatasource表达式中放入代码中有一个JRXmlDataSource,如果我把"一个空记录"它会给我一个错误。作为数据源。

JRDatasource expression screenshot

以下是代码:

select 
coalesce(SUM(recv),0) AS q_received,
coalesce(SUM(sent),0) AS q_sent,
coalesce(SUM(views),0) as views,
user.id_user AS id_user, user.name AS name, user.lastname AS lastname, user.date_login AS date_login
FROM user
left join
 (  
 select id_user, count(*) as recv, 0  as sent,sum(views) as views from message group by id_user
 union all
 select id_user_from, 0, count(*) as sent,sum(views) as views from message group by id_user_from
 ) t
on user.id_user=t.id_user
group by user.id_user
order by user.id_user;

Result:
q_received  q_sent  views   id_user name    lastname            date_login
4           2       32      1               Rigoberto   Santos  2018-03-21T17:37:28Z
0           2        6      2               Coquita Perlini     2018-03-21T17:34:59Z
1           1        2      3               Miguel  Bianchi     2018-03-21T14:26:11Z
0           0        0      4               Ramiro  Alvarado    2018-03-21T14:26:06Z
1           1       24      5               Andrea  Lucas       2018-03-21T17:35:04Z

我一整天都在寻找,但我所做的所有事情都是完全相同的。

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"))

1 个答案:

答案 0 :(得分:0)

您应该检查$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>