2012-08-07 27 views
0

我需要使用iReport生成報告,並試圖從2個不同的數據庫中獲取數據。 (JasperReports 3.6 Development Cookbook的作者Bilal Siddiqui)跟隨了這個article。但我每次都會遇到錯誤。它的工作很好,但當我使用分報告開始給我錯誤。在iReport中使用多個數據庫評估表達式的錯誤

主報告: -

<?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的://本地主機:3306/liferay_6。 0.6" , 「根」, 「根」)

net.sf.jasperreports.engine.fill.JRExpressionEvalException:錯誤評估表達式:源文本:java.sql.DriverManager.getConnection(「JDBC:MySQL的:/ /localhost:3306/liferay_6.0.6","root","root「)

+0

您是否嘗試使用* iReport *進行報告? – 2012-08-07 10:11:45

+0

您是否使用某些* MySQL *客戶端或使用java代碼檢查連接字符串? – 2012-08-07 10:12:26

+0

是的,我正在嘗試使用iReport Designer 4.5.0 – Scorpion 2012-08-07 10:12:33

回答

2

試試這個步驟測試主報表和報表中iReport的

  1. 創建的iReport連接並對其進行測試。不要忘記在應用程序中添加jar文件(jdbc驅動程序
  2. 使用查詢創建主報告。用iReport連接進行測試。
  3. 用查詢創建子報表。用iReport連接進行測試。
  4. 添加子報表組件到主報表。
  5. 設置子報表的subreportExpressionsubreportParameterExpression表達的主報告。
  6. 創建參數java.sql.Connection鍵入主報告。設置爲defaultValueExpression它。在子報表中使用此參數的connectionExpression表達主報表。
  7. 編譯子報表和主報表。
  8. 通過測試主報告預覽按鈕iReport

主報告的片斷:

<?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> 
+0

感謝您發佈答案。但我仍然遵循所有的步驟,但它給我的驅動程序沒有發現錯誤。我在主報告中創建了連接參數並設置了connectionExpression。我還在iReport的classpath中添加了jar文件。我不明白爲什麼它的提供驅動程序沒有發現錯誤。 – Scorpion 2012-08-08 03:48:55

+0

* iReport *中有「MySQL連接」嗎?您是否嘗試將報告的語言更改爲Java? – 2012-08-08 07:19:32

+0

是的,我有MySQL連接和第二個數據庫的SQLServer的另一個連接 – Scorpion 2012-08-08 07:28:07

1

蠍子,

解決這個問題,首先你寫在主查詢報告,獲取記錄,然後使用默認值表達式定義connectionParam爲

"java.sql.DriverManager.getConnection("jdbc:oracle:thin:@//<server_name>:<server_port>/<SID_name>", "<user>", "<password>")"

在你的情況,你首先定義了connectionParam,所以你無法在Ireport中運行主報告的查詢。

感謝, SRIKANTH Kattam

1

上面的例子並不在iReport的工作,而它可能在實際應用中工作。 問題是iReport無法自動動態加載數據庫驅動程序,即使它被添加到ireport classpath中,並且您嘗試將其設置爲可重新加載。所以你需要從你的iReport獲得已建立的連接。

以下是您的問題的解決方案。

  1. 在iReport中創建一個連接到您的子報表將被填充的數據庫。
  2. 假設您已爲您的hsql數據庫連接命名了「HSQLDB」。
  3. 現在在子報表組件部分中定義一個連接表達式。
  4. 使用com.jaspersoft.ireport.designer.utils.Misc.getConnection(「HSQLDB」)作爲它的值,就是你完成了。

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> 
0

檢查你的頁面中使用的langage。如果你使用'Javascript',它會引發這個錯誤。您應該將語言頁面設置爲'Java'