Jasper(Soft):为单个报告

时间:2017-04-10 11:52:12

标签: jasper-reports datasource

我有一个Jasper服务器,其中一个文件夹中有一些模板。我还有一个带按钮的应用程序,当您单击该按钮时,它将显示该文件夹中所有jasper文档的列表。
目前,所有这些Jasper报告中都使用了一个参数(一个id),每个报告都根据需要使用自己的查询。

现在我已添加了一个新的jasper模板,该模板必须在同一个文件夹中使用基于年份参数的不同数据源。
我能做的就是将今年添加到我发送给Jasper的参数列表中,该文件夹中的每个模板,在这种情况下,它将使用所有现有模板的id,以及这个新模板的年份。
但是,我更喜欢不为了添加jasper模板而部署此应用程序的新版本,所以我想改为:

  1. 使用参数id和datasource 1来查询我需要的年份
  2. 将此年份用作数据源2的参数,以创建实际jasper报告模板的查询
  3. 所以我的问题:这可能吗?单个jasper报告可以有多个oracle-DB连接数据源吗?然后我可以在一个数据源中查询年份,以便在其他数据源中使用吗?

    编辑:

    虽然重复的链接给了我一个好的方向,但我现在又遇到了同样的问题 我所做的是以下内容:

    1. 我创建的主报告只包含一个子报告,并且有一个id参数(用于查询datasource_host_main中的字段YEAR。)
    2. 我已根据datasource_host_sub上的查询(带有年份参数)创建了包含实际文本和列表的子报告。
    3. 以下是Main的代码:

      <?xml version="1.0" encoding="UTF-8"?>
      <!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
      <!-- 2017-04-10T17:05:30 -->
      <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="Main" language="groovy" pageWidth="595" pageHeight="842" columnWidth="515" leftMargin="40" rightMargin="40" topMargin="20" bottomMargin="20" uuid="3830f8f8-db92-4043-bcbe-4af8cbc24623">
          <property name="com.jaspersoft.studio.data.defaultdataadapter" value="datasource_host_main"/>
          <property name="com.jaspersoft.studio.unit." value="pixel"/>
          <property name="com.jaspersoft.studio.unit.pageHeight" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.pageWidth" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.topMargin" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.bottomMargin" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.leftMargin" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.rightMargin" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.columnWidth" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.columnSpacing" value="pixel"/>
          <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
          <property name="ireport.jasperserver.url" value="my_jasper_server_host/jasperserver-pro/"/>
          <property name="ireport.jasperserver.user" value="superuser|"/>
          <property name="ireport.jasperserver.reportUnit" value="/users/user_1/reports/Systeem/Main"/>
          <property name="ireport.jasperserver.report.resource" value="/users/user_1/reports/Systeem/Main_files/main.jrxml"/>
          <parameter name="id_parameter" class="java.lang.Integer">
              <parameterDescription><![CDATA[id_parameter]]></parameterDescription>
              <defaultValueExpression><![CDATA[1]]></defaultValueExpression>
          </parameter>
          <queryString>
              <![CDATA[select dataYear 
      from MY_TABLE
      where id = $P{id_parameter}]]>
          </queryString>
          <field name="dataYear" class="java.lang.String"/>
          <background>
              <band splitType="Stretch"/>
          </background>
          <title>
              <band height="28" splitType="Stretch"/>
          </title>
          <detail>
              <band height="210" splitType="Stretch">
                  <subreport>
                      <reportElement x="6" y="10" width="504" height="200" uuid="e130bc4e-f114-4bd1-b408-dc9ce261b18c"/>
                      <subreportParameter name="dataYear">
                          <subreportParameterExpression><![CDATA[$F{dataYear}]]></subreportParameterExpression>
                      </subreportParameter>
                      <!-- This below doesn't work: I want to connect to a different datasource in the sub-report -->
                      <connectionExpression><![CDATA[oracle.jdbc.driver.OracleDriver.getConnection("jdbc:oracle:thin:@datasource_host_sub:1234:ab", "USERNAME", "PASSWORD")]]></connectionExpression>
                      <subreportExpression><![CDATA["subreport.jrxml"]]></subreportExpression>
                  </subreport>
              </band>
          </detail>
          <columnFooter>
              <band/>
          </columnFooter>
          <pageFooter>
              <band height="39"/>
          </pageFooter>
      </jasperReport>
      

      子报表:

      <?xml version="1.0" encoding="UTF-8"?>
      <!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
      <!-- 2017-04-10T16:37:07 -->
      <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="subreport" language="groovy" pageWidth="595" pageHeight="842" columnWidth="515" leftMargin="40" rightMargin="40" topMargin="20" bottomMargin="20" uuid="3830f8f8-db92-4043-bcbe-4af8cbc24623">
          <property name="com.jaspersoft.studio.data.defaultdataadapter" value="datasource_host_sub"/>
          <property name="com.jaspersoft.studio.unit." value="pixel"/>
          <property name="com.jaspersoft.studio.unit.pageHeight" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.pageWidth" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.topMargin" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.bottomMargin" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.leftMargin" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.rightMargin" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.columnWidth" value="pixel"/>
          <property name="com.jaspersoft.studio.unit.columnSpacing" value="pixel"/>
          <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
          <property name="ireport.jasperserver.url" value="my_jasper_server_host/jasperserver-pro/"/>
          <property name="ireport.jasperserver.user" value="superuser|"/>
          <property name="ireport.jasperserver.reportUnit" value="/users/user_1/reports/Systeem/Main"/>
          <property name="ireport.jasperserver.report.resource" value="/users/user_1/reports/Systeem/Main_files/subreport.jrxml"/>
          <parameter name="dataYear" class="java.lang.Integer">
              <parameterDescription><![CDATA[dataYear]]></parameterDescription>
              <defaultValueExpression><![CDATA[YEAR( )]]></defaultValueExpression>
          </parameter>
          <queryString>
              <![CDATA[select NOTES
      from MY_TABLE
      where extract(year from to_date(DATE, 'dd-MM-yy')) = $P{dataYear}]]>
          </queryString>
          <field name="NOTES" class="java.lang.String"/>
          <background>
              <band splitType="Stretch"/>
          </background>
          <title>
              <band height="140" splitType="Stretch"/>
          </title>
          <detail>
              <band height="60" splitType="Stretch">
                  <textField>
                      <reportElement x="0" y="18" width="510" height="30" uuid="ed29caa8-a839-4457-a270-68bfedcfadb8"/>
                      <textFieldExpression><![CDATA["Test: " + $F{NOTES}]]></textFieldExpression>
                  </textField>
              </band>
          </detail>
          <columnFooter>
              <band/>
          </columnFooter>
          <pageFooter>
              <band height="20"/>
          </pageFooter>
      </jasperReport>
      

      主报告使用datasource_host_main,子报告使用datasource_host_sub。由于Jasper报告只有一个.properties个文件,其中一个jasperDatasourceUri,因此我只能定义datasource_host_main。但是如何为子报告定义datasource_host_sub?正如您在mainreport代码中看到的那样,我试图做这样的事情:

      <connectionExpression><![CDATA[oracle.jdbc.driver.OracleDriver.getConnection("jdbc:oracle:thin:@datasource_host_sub:1234:ab", "USERNAME", "PASSWORD")]]></connectionExpression>
      

      但不幸的是它给出了这个错误:

        

      net.sf.jasperreports.engine.fill.JRExpressionEvalException:评估源文本表达式时出错:oracle.jdbc.driver.OracleDriver.getConnection(&#34; jdbc:oracle:thin @ datasource_host_sub:1234:ab&#34; ,&#34; USERNAME&#34;,&#34; PASSWORD&#34;)

      我应该把它放在这里以使其工作(两者都是Oracle数据库),甚至可以这样做吗?

      正如我在原来的问题中所说:

        

      单个jasper报告可以有多个oracle-DB连接数据源吗?然后我可以在一个数据源中查询年份,以便在其他数据源中使用吗?

1 个答案:

答案 0 :(得分:0)

在JasperReports Server中,您可以通过将com.jaspersoft.jrs.data.source属性设置为(子)报告或子数据集级别的数据源存储库路径,为子报表或子数据集使用不同的数据源/数据库连接。

在您的情况下,您将使报表单元使用连接到datasource_host_main的数据源,以及子报表JRXML中的以下属性:

<property name="com.jaspersoft.jrs.data.source" value="/datasources/host_sub_datasource"/>

其中/ datasources / host_sub_datasource是连接到datasource_host_sub的数据源资源的存储库路径。

在JasperReports Server之外,使用数据适配器(取代JasperReports Server数据源)可以实现同样的目的。要设置的属性为net.sf.jasperreports.data.adapter,它需要指向数据适配器XML文件的路径/资源/ URI。