如何在pentaho报告引擎中为子报告提供datafactory?
答案 0 :(得分:3)
找到您的子报告,然后在那里设置datafactory:
对于带状子报告:
report.getReportHeader().getSubReport(0).setDataFactory(..);
对于内联子报告:
SubReport report = (SubReport) report.getReportHeader().getElement(0); report.setDataFactory(..);
但是,通常您在报表设计器中定义数据事件,然后只使用它们。或者,您可以在主报表上设置datafactories,并将它们继承到子报表。如果您在整个报表中需要多种类型的数据事件,请使用“CompoundDataFactory”。
确保您的报告具有不同的查询名称,否则可能会遇到麻烦。
答案 1 :(得分:0)
如果在MasterReport上调用setDataFactory(DataFactory)
,则子报表应该可以隐式访问。我使用这种方式使用Table类型的数据源和应用程序预先计算的数据。在这种情况下,Pentaho基本上只用作渲染引擎。
答案 2 :(得分:0)
我发现Thomas Morgner的建议(上图)是正确的,但有一点需要注意。他的例子假设SubReport存在于ReportHeader中。
在我的情况下,SubReports深深地嵌套在报告的其他部分,所以我写了一些代码来查找所有SubReports。也许有更好的方法来找到这个,但这就是我所做的,如果为我工作。如果有人知道更简单的方法来枚举所有子报告,请告诉我!
private Set<CompoundDataFactory> getCompoundDataFactoriesFromMasterAndSubreports() {
Set<CompoundDataFactory> CompoundDataFactories = new HashSet<CompoundDataFactory>();
CompoundDataFactories.add( compoundDataFactory ); // Master report
Set<SubReport> subReports = getSubReports();
for ( SubReport subReport : subReports ) {
if ( subReport.getDataFactory() instanceof CompoundDataFactory ) {
CompoundDataFactories.add( (CompoundDataFactory)subReport.getDataFactory() );
}
}
return CompoundDataFactories;
}
private Set<SubReport> getSubReports() {
Set<SubReport> subReports = new HashSet<SubReport>();
recurseToFindAllSubReports(masterReport,subReports);
return subReports;
}
private void recurseToFindAllSubReports(Section section, Set<SubReport> subReports) {
int elementCount = section.getElementCount();
for ( int i=0; i<elementCount ; i++ ) {
Element e = section.getElement(i);
if ( e instanceof RootLevelBand ) {
SubReport[] subs = ((RootLevelBand)e).getSubReports();
for( SubReport s : subs ) {
subReports.add(s);
}
}
if ( e instanceof Section ) {
recurseToFindAllSubReports((Section)e, subReports);
}
}
}