如何让我的子报表访问与主报表不同的数据库?

How to make my subreport access a different database than the main one?

我正在评估 JasperReports 和 Jaspersoft Studio 在我工作的公司中的使用情况,我正在尝试构建一个包含来自 2 个不同数据库的信息的报告。

我配置了 2 个数据适配器。

我经过研究发现,唯一的方法是在主报告中有一个列表,table 或子报告,但我仍然无法实现。

我采用了子报表方法,我有两个独立工作的报表,主要报表在示例数据库中执行此查询

select 1 from ORDERS limit 10

我拥有的 Vertica 数据库中的这个子报表 运行:

select 1 from my_schema.my_table limit 10

他们两个,如前所述,分别运行。

所以我转到主报表并将 SubReport 元素添加到 ColumnHeader 带区,然后向导打开:

第一个和第三个不是我想要的

我尝试设置第二个,但找不到 select 我配置的数据适配器的方法。

最后一个不起作用(我收到一条消息说 my_schema 不存在,所以我认为它仍在尝试访问 MainReport 数据库)。

我是否可以在与主报表不同的 database/datasource 中创建子报表 运行 查询?

我猜this iReport文章也适用于jaspersoft studio设计的报表;您只需要使用给定的表达式定义子报表连接参数。

如果有人有同样的问题,我可以总结一下我做了什么:

我做了一个概念验证(因此我没有代码了),但我使用 this tutorial 创建了一个 JRDataSource class 并在那里我手动访问数据库并返回了行。然后我用它作为我的 subreport/table 的数据源。 没有我想要的那么好,但这是可能的

或许,你可以求助于自己在主报表中定义的两个参数。如:

  1. $P{MySubreport} 类型为 net.sf.jasperreport.engine.JasperReport;

  2. $P{MyDatasource} 类型为 net.sf.jasperreport.engine.JRDataSource;

  3. 分别在属性'Expression'和'Data Source Expression'中将这两个参数关联到您的子报表元素;

请编写实现接口 JRDataSource 的数据源 class。 然后,在您的 servlet class 中,将您的真实参数值(子报表 .jasper 文件的 JasperReport 和您的 DataSource 对象)放入参数 Map 对象中,然后调用 JasperFillManager.fillReport().