在iReport中使用多个数据库评估表达式时出错

时间:2012-08-07 10:06:55

标签: database jasper-reports ireport

我需要使用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”,“根”, “根”)

4 个答案:

答案 0 :(得分:2)

尝试使用此步骤测试 iReport 中的主报告和子报告:

  1. iReport 中创建 连接 并进行测试。不要忘记将jar文件( jdbc驱动程序)添加到应用程序(此测试用例中的 iReport )类路径中。
  2. 使用查询创建主报告。使用 iReport 连接进行测试。
  3. 使用查询创建子报表。使用 iReport 连接进行测试。
  4. 子报告组件添加到主报告中。
  5. 在主报告中设置子报告的 subreportExpression subreportParameterExpression 表达式。
  6. 在主报告中创建 java.sql.Connection 类型的参数。为它设置 defaultValueExpression 。在主报告的子报表的 connectionExpression 表达式中使用此参数。
  7. 编译子报告和主报告。
  8. 通过 iReport 中的预览按钮测试主报告。
  9. 主报告的片段:

    <?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获得已建立的连接。

以下是解决您问题的方法。

  1. 在iReport中创建一个连接到数据库的连接,用于填充子报表。
  2. 假设您为hsql数据库连接命名为“HSQLDB”。
  3. 现在在子报表组件部分中定义连接表达式。
  4. 使用com.jaspersoft.ireport.designer.utils.Misc.getConnection(“HSQLDB”)作为它的值,这就是你完成的。
  5.   

    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;