簡體   English   中英

Jasper(Soft):對單個報告使用多個Oracle數據庫數據源

[英]Jasper(Soft) : Use multiple Oracle-Database datasources for single report

我有一個Jasper服務器,其中一個文件夾中有幾個模板。 我也有一個帶有按鈕的應用程序,當您單擊按鈕時,它將顯示該文件夾中所有碧玉文檔的列表。
當前,所有這些Jasper報告都使用一個參數(一個id),每個報告都根據需要使用自己的查詢。

現在,我在同一文件夾中添加了一個新的jasper模板,該模板必須基於year參數使用不同的數據源。
我所能做的就是將今年添加到該文件夾​​中每個模板發送給Jasper的參數列表中,在這種情況下,它將對所有現有模板使用id,而對新模板使用年份。
但是,由於添加了jasper模板,我不想部署此應用程序的新版本,因此我想執行以下操作:

  1. 使用參數ID和數據源1來查詢所需的年份
  2. 將今年用作數據源2的參數可為實際的jasper報告模板創建查詢

所以我的問題是:這可能嗎? 單個jasper報告可以具有多個oracle-DB連接數據源嗎? 然后我可以在一個數據源中查詢年份,以在另一數據源中使用嗎?


編輯:

盡管重復的鏈接為我提供了一個很好的指導,但我目前仍然遇到相同的問題。
我所做的是以下幾點:

  1. 我創建了main-report,它只包含一個子報告,並且具有id參數(將用於查詢datasource_host_main YEAR字段)。
  2. 我已經基於對datasource_host_sub的查詢(帶有year參數)創建了帶有實際文本和列表等的子報表。

這是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>

Main報告使用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(“ jdbc:oracle:thin @ datasource_host_sub:1234:ab”,“ USERNAME”,“ PASSWORD” )

我應該在這里放些什么來使其工作(都是Oracle數據庫),甚至有可能這樣做嗎?

正如我在原始問題中所說的:

單個jasper報告可以具有多個oracle-DB連接數據源嗎? 然后我可以在一個數據源中查詢年份,以在另一數據源中使用嗎?

在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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM