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