1

如何在pentaho报告引擎中为子报告提供数据工厂?

4

3 回答 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 回答