我有一个Jasper服务器,其中一个文件夹中有几个模板。我还有一个带有按钮的应用程序,当您单击该按钮时,它将显示该文件夹中所有jasper文档的列表。
目前,在所有这些Jasper报告中都使用了单个参数( id),每个报表都根据需要使用自己的查询。
现在,我在同一个文件夹中添加了一个新的jasper模板,它必须根据一个年份参数使用不同的数据源。
我能做的就是将今年添加到我发送给Jasper的参数列表中,用于这个文件夹中的每个模板,在这种情况下,它将对所有现有的模板使用id,对于这个新的模板使用id。
但是,为了添加jasper模板,我不愿意部署这个应用程序的新版本,因此我想做以下操作:
所以我的问题是:这有可能吗?一个jasper报告可以有多个oracle-DB连接数据源吗?然后我可以在一个数据源中查询年份,以便在另一个数据源中使用吗?
编辑:
虽然复制的链接给了我一个很好的方向,但我现在又遇到了同样的问题。
我所做的是:
datasource_host_main中的字段年)。datasource_host_sub上的一个查询(带有一个年份参数)。以下是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呢?正如您在主要报告代码中所看到的,我尝试这样做:
<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连接数据源吗?然后我可以在一个数据源中查询年份,以便在另一个数据源中使用吗?
发布于 2017-04-12 10:54:11
在JasperReports服务器中,可以对子报表或子数据集使用不同的数据源/DB连接,方法是将com.jaspersoft.jrs.data.source属性设置为(子)报表或子数据集级别上的数据源存储库路径。
在您的示例中,您将让报表单元使用连接到datasource_host_main的数据源,并在子报表JRXML中使用以下属性:
<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。
https://stackoverflow.com/questions/43322429
复制相似问题