首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jasper(软件):单个报表使用多个Oracle-数据库数据源

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

Stack Overflow用户
提问于 2017-04-10 11:52:12
回答 1查看 1.3K关注 0票数 0

我有一个Jasper服务器,其中一个文件夹中有几个模板。我还有一个带有按钮的应用程序,当您单击该按钮时,它将显示该文件夹中所有jasper文档的列表。

目前,在所有这些Jasper报告中都使用了单个参数( id),每个报表都根据需要使用自己的查询。

现在,我在同一个文件夹中添加了一个新的jasper模板,它必须根据一个年份参数使用不同的数据源。

我能做的就是将今年添加到我发送给Jasper的参数列表中,用于这个文件夹中的每个模板,在这种情况下,它将对所有现有的模板使用id,对于这个新的模板使用id。

但是,为了添加jasper模板,我不愿意部署这个应用程序的新版本,因此我想做以下操作:

  1. 使用参数id和数据源1查询我需要的年份
  2. 使用今年作为数据源2的参数,为实际jasper报告模板创建查询

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

编辑:

虽然复制的链接给了我一个很好的方向,但我现在又遇到了同样的问题。

我所做的是:

  1. 我已经创建了主报表,它只包含一个子报表,并且有一个id参数(它将用于查询datasource_host_main中的字段年)。
  2. 我创建了一个包含实际文本和列表之类的子报表,它是基于datasource_host_sub上的一个查询(带有一个年份参数)。

以下是Main的代码:

代码语言:javascript
复制
<?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>

次级报告:

代码语言:javascript
复制
<?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呢?正如您在主要报告代码中所看到的,我尝试这样做:

代码语言:javascript
复制
<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",“用户名”,“密码”)

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

正如我在最初的问题中所说:

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

EN

回答 1

Stack Overflow用户

发布于 2017-04-12 10:54:11

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

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

代码语言:javascript
复制
<property name="com.jaspersoft.jrs.data.source" value="/datasources/host_sub_datasource"/>

其中/数据源/主机_sub_数据源是连接到datasource_host_sub的数据源资源的存储库路径。

在JasperReports服务器之外,数据适配器(取代JasperReports服务器数据源)也可以实现相同的功能。要设置的属性是net.sf.jasperreports.data.adapter,它需要指向数据适配器XML文件的路径/资源/URI。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43322429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档