我需要使用iReport生成报告,我正在尝试从2个不同的数据库中获取数据。我遵循了这个article(Bilal Siddiqui,JasperReports 3.6 Development Cookbook的作者)。但我每次都会听到以下错误。它单独工作正常,但当我使用子报告时,它开始给我错误。
主报告: -
<?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="MasterReport" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<parameter name="projectName" class="java.lang.String">
<defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["D:\\rEPORTS\\"]]></defaultValueExpression>
</parameter>
<parameter name="connectionParam" class="java.sql.Connection" isForPrompting="false">
<defaultValueExpression><![CDATA[java.sql.DriverManager.getConnection("jdbc:mysql://localhost/liferay_6.0.6", "root", "root")]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[QUERY]]>
</queryString>
<field name="EMAIL" class="java.lang.String"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="79" splitType="Stretch"/>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="32" splitType="Stretch">
<staticText>
<reportElement x="0" y="2" width="100" height="20"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="12"/>
</textElement>
<text><![CDATA[EMAIL]]></text>
</staticText>
<staticText>
<reportElement x="126" y="2" width="100" height="20"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="12"/>
</textElement>
<text><![CDATA[Work Station Name]]></text>
</staticText>
<staticText>
<reportElement x="260" y="2" width="100" height="20"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="12"/>
</textElement>
<text><![CDATA[Work Station Type]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="100" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{EMAIL}]]></textFieldExpression>
</textField>
<subreport>
<reportElement x="271" y="0" width="200" height="100"/>
<subreportParameter name="emailAddress">
<subreportParameterExpression><![CDATA[$F{EMAIL}]]></subreportParameterExpression>
</subreportParameter>
<connectionExpression><![CDATA[$P{connectionParam}]]></connectionExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "WorkstationSubReport.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
填写打印错误...评估表达式时出错:源文本:java.sql.DriverManager.getConnection(“jdbc:mysql:// localhost:3306 / liferay_6.0.6”,“root”,“root” )
net.sf.jasperreports.engine.fill.JRExpressionEvalException:评估表达式时出错:源文本:java.sql.DriverManager.getConnection(“jdbc:mysql:// localhost:3306 / liferay_6.0.6”,“根”, “根”)
答案 0 :(得分:2)
尝试使用此步骤测试 iReport 中的主报告和子报告:
java.sql.Connection
类型的参数。为它设置 defaultValueExpression 。在主报告的子报表的 connectionExpression 表达式中使用此参数。主报告的片段:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["<some_path>"]]></defaultValueExpression>
</parameter>
<parameter name="connectionParam" class="java.sql.Connection" isForPrompting="false">
<defaultValueExpression><![CDATA[java.sql.DriverManager.getConnection("jdbc:oracle:thin:@//<server_name>:<server_port>/<SID_name>", "<user>", "<password>")]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[SELECT id, name FROM main_table]]>
</queryString>
<field name="ID" class="java.lang.String"/>
<field name="NAME" class="java.lang.String"/>
<title>
<band height="79" splitType="Stretch"/>
</title>
<detail>
<band height="125" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{ID}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="20" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{NAME}]]></textFieldExpression>
</textField>
<subreport>
<reportElement x="259" y="25" width="200" height="100"/>
<subreportParameter name="masterId">
<subreportParameterExpression><![CDATA[$F{ID}]]></subreportParameterExpression>
</subreportParameter>
<connectionExpression><![CDATA[$P{connectionParam}]]></connectionExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "several_connections_subreport1.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
</jasperReport>
子报告的片段:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
<parameter name="masterId" class="java.lang.String"/>
<queryString>
<![CDATA[SELECT details, id FROM details_table where masterId =$P{masterId}]]>
</queryString>
<field name="DETAILS" class="java.lang.String"/>
<field name="ID" class="java.lang.String"/>
<title>
<band height="50">
<textField>
<reportElement x="176" y="20" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$P{masterId}]]></textFieldExpression>
</textField>
</band>
</title>
<detail>
<band height="125" splitType="Stretch">
<textField>
<reportElement x="57" y="17" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{DETAILS}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
答案 1 :(得分:1)
蝎子,
此问题的解决方案是,首先在主报表中编写查询,获取记录,然后使用默认值表达式将connectionParam定义为
"java.sql.DriverManager.getConnection("jdbc:oracle:thin:@//<server_name>:<server_port>/<SID_name>", "<user>", "<password>")"
。
在您的情况下,您首先定义了connectionParam,因此您无法在Ireport中运行主报告的查询。
谢谢, Srikanth Kattam
答案 2 :(得分:1)
以上示例在iReport中不起作用,但它可能在实际应用中有效。 问题是iReport无法自动理解数据库驱动程序的动态加载,即使它被添加到ireport类路径中并且您尝试将其设置为可重新加载。因此,您需要从iReport获得已建立的连接。
以下是解决您问题的方法。
com.jaspersoft.ireport.designer.utils.Misc.getConnection(“HSQLDB”)是成功的关键。请记住删除主报告中创建的连接参数,否则不会产生任何结果。
<subreport>
<reportElement uuid="ba5a0c29-332c-4e81-b3b6-71c17d7d2c41" positionType="Float" x="0" y="182" width="364" height="72"/>
<connectionExpression><![CDATA[com.jaspersoft.ireport.designer.utils.Misc.getConnection("HSQLDB")]]></connectionExpression>
<subreportExpression><![CDATA["\\\\subreportdir\\subreport_orders.jasper"]]></subreportExpression>
</subreport>
答案 3 :(得分:0)
检查页面使用的语言。如果你使用&#39; Javascript&#39;它解雇了这个错误。你应该把语言页面放到&#39; Java&#39;