[英]Jasper(Soft) : Use multiple Oracle-Database datasources for single report
我有一個Jasper服務器,其中一個文件夾中有幾個模板。 我也有一個帶有按鈕的應用程序,當您單擊按鈕時,它將顯示該文件夾中所有碧玉文檔的列表。
當前,所有這些Jasper報告都使用一個參數(一個id),每個報告都根據需要使用自己的查詢。
現在,我在同一文件夾中添加了一個新的jasper模板,該模板必須基於year參數使用不同的數據源。
我所能做的就是將今年添加到該文件夾中每個模板發送給Jasper的參數列表中,在這種情況下,它將對所有現有模板使用id,而對新模板使用年份。
但是,由於添加了jasper模板,我不想部署此應用程序的新版本,因此我想執行以下操作:
所以我的問題是:這可能嗎? 單個jasper報告可以具有多個oracle-DB連接數據源嗎? 然后我可以在一個數據源中查詢年份,以在另一數據源中使用嗎?
盡管重復的鏈接為我提供了一個很好的指導,但我目前仍然遇到相同的問題。
我所做的是以下幾點:
datasource_host_main
YEAR字段)。 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.