如何在pentaho报告引擎中为子报告提供数据工厂?
问问题
1226 次
3 回答
3
找到您的子报表,然后在那里设置数据工厂:
对于带状子报表:
report.getReportHeader().getSubReport(0).setDataFactory(..);
对于内联子报表:
子报表报告 = (子报表) report.getReportHeader().getElement(0); 报告.setDataFactory(..);
但是,通常您在报表设计器中定义数据工厂,然后直接使用它们。或者,您可以在主报表上设置数据工厂,并将它们继承到子报表。如果您在整个报告中需要不止一种类型的数据工厂,请使用“CompoundDataFactory”。
确保您的报告具有不同的查询名称,否则您可能会遇到麻烦。
于 2011-03-10T10:30:42.663 回答
0
如果您调用setDataFactory(DataFactory)
MasterReport,子报表应该可以隐式访问它。我以这种方式将它与 Table 类型的 Datasource 和应用程序预先计算的数据一起使用。在这种情况下,Pentaho 基本上只用作渲染引擎。
于 2011-03-04T14:44:36.920 回答
0
我发现 Thomas Morgner 的建议(上图)是正确的,但有一个警告。他的示例假设 SubReport 存在于 ReportHeader 中。
在我的例子中,子报表深深嵌套在报表的其他部分中,所以我编写了一些代码来查找所有子报表。也许有更好的方法来找到这个,但这就是我所做的,如果对我有用。如果有人知道枚举所有子报表的更简单方法,请告诉我!
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);
}
}
}
于 2014-10-15T21:00:45.060 回答