如何在pentaho报告引擎中为子报告提供数据满意度?

时间:2011-02-24 19:05:40

标签: reporting-services pentaho

如何在pentaho报告引擎中为子报告提供datafactory?

3 个答案:

答案 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);
        }
    }
}