当前位置: 首页 > 知识库问答 >
问题:

Jasper(软):为单个报表使用多个Oracle数据库数据源

佟翰林
2023-03-14

现在我已经添加了一个新的jasper模板,它必须在同一个文件夹中使用基于year参数的不同数据源。
我所能做的就是为该文件夹中的每个模板向jasper发送的参数列表中添加今年,在这种情况下,它将为所有现有模板使用id,为这个新模板使用year。
但是,为了添加jasper模板,我宁愿不部署这个应用程序的新版本,所以我想做以下事情:

  1. 在datasource 1中使用参数id查询所需年份
  2. 使用this year作为datasource 2的参数,为实际的jasper报表模板创建查询

所以我的问题是:这可能吗?单个jasper报表可以有多个oracle-DB连接数据源吗?然后我可以在一个数据源中查询年份,以便在另一个数据源中使用吗?

虽然重复的链接给了我一个很好的方向,但我目前再次被同样的问题所困扰。
我所做的如下:

    null
<?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>
<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(“jdbc:Oracle:Thin@datasource_host_sub:1234:ab”,“username”,“password”)

我应该在这里放什么来使它工作(两者都是Oracle数据库),甚至有可能这样做吗?

共有1个答案

邵亦
2023-03-14

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

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

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

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

 类似资料:
  • 因为JasperReport可以将JavaBean集合作为数据源。我们可以用一个引用多个SetCollections的单个对象发送一个SetCollection吗。并使用这些引用传递给编译后的jrxml文件,每次传递不同的setCollection时,都使用对JasPerfillManager.FillReport()的多重调用。我只是想知道编译后的jrxml文件是否会用最后一次调用填充,或者是否

  • 问题内容: 我正在建立一个网站,其中包含不同类型的项目,例如博客,帖子,文章等。用户可以将其中任何一个设置为他/她的最爱。现在,当我处理这个问题时,我有两个选择 为每种对象的用户收藏夹创建一个表。 为所有用户的所有类型的对象创建一个公用表。 第一种结构的问题是,我将不得不查询很多表以显示特定用户的收藏夹。但这将使我可以轻松地将收藏夹分为不同的类别。 但是,如果我必须在一个页面上显示所有收藏夹并将它

  • 一些代码: 这里,我从kinesis流中获取数据,并将其序列化到我的数据类中。一切正常,但现在需要增加以另一种格式接收数据的能力(例如,DataClassSecond) 其中一个选项是,添加一个额外的数据源并在您自己的流中处理它们。 但是这需要一个额外的运动队列。我不确定这是否是一个好方法有没有什么方法可以从运动接收不同的数据,然后根据类型分割流?

  • 问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 DAO EXAMPLE 问题答案: 我假定你有一组应使用的DAO的和适当的,而其他人应该使用不同的和基于。当然,你需要

  • 问题内容: database.php : 问题是我只能在配置中定义one ,default或stats。我遵循了CodeIgniter文档,并添加了以下内容: 这样,我连接到第二个数据库,但是失去了与第一个数据库的连接。有谁对如何加载两个数据库有任何想法,而不必在所有模型构造函数中执行以下操作? 问候, 佩德罗 问题答案: 除了应用Camacho提到的hack之外,您还可以将database.ph

  • 问题内容: 我有一个关于数据库体系结构的问题。 我们正在建立一个CMS。许多字段将具有预填充的选择。例如,客户的信用状态可以为“良好”,“不良”,“未知”或“存款”。该项目的规格是这些预先填充的选择是动态的,管理员可以通过后端添加新值。所以我需要将这些值存储在数据库中。 我正在努力在两种方法之间做出决定 1)为每种清单都有一张桌子。示例将是诸如list_CrediStatus,list_Branc