Как обеспечить базу данных для подотчета в механизме отчетов Pentaho? - PullRequest
1 голос
/ 24 февраля 2011

Как предоставить фабрику данных для подотчета в механизме отчетов Pentaho?

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

Найдите свой подчиненный отчет и затем установите там факторинг данных:

Для объединенных вложенных отчетов:

report.getReportHeader().getSubReport(0).setDataFactory(..);

Для встроенных вложенных отчетов:

SubReport report = (SubReport) report.getReportHeader().getElement(0);
report.setDataFactory(..);

Однако обычно вы определяетеваши данные фабрики в дизайнере отчетов, а затем просто использовать их.Кроме того, вы можете установить фабрики данных в главном отчете, и они будут унаследованы для вложенных отчетов.Если вам требуется более одного типа фабрики данных в вашем отчете, используйте «CompoundDataFactory».

Убедитесь, что в ваших отчетах есть разные имена запросов, иначе вы можете столкнуться с проблемами.

0 голосов
/ 16 октября 2014

Я нашел совет Томаса Моргнера (см. Выше) правильным, с одним предупреждением.В его примере предполагается, что 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);
        }
    }
}
0 голосов
/ 04 марта 2011

Он должен быть неявно доступен для подотчетов, если вы позвоните setDataFactory(DataFactory) в MasterReport.Я использую его таким образом с источником данных типа Table и данными, которые предварительно рассчитываются приложением.В этом сценарии Pentaho в основном используется только как движок рендеринга.

...